转发
不和视图解析器一同工作
请求->服务器->资源1->资源2->响应
资源2可以是WEB-INF中的资源
forward实现显示转发
1
2
3
4
5public ModelAndView doNayuki(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("forward:/WEB-INF/view/nayuki.jsp");
return modelAndView;
}意义在于解决视图解析器下只能转发到WEB-INF/view中的页面
重定向
不和视图解析器一同工作
请求->服务器->资源1->响应 请求->服务器->资源2->响应
资源2不可以是WEB-INF中的资源
传递的String等参数可以通过${param.name}或<%=request.getParamter(“name”)%>取出
redirect实现
1
2
3
4
5public ModelAndView doNayuki(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("redirect:/WEB-INF/view/nayuki.jsp");
return modelAndView;
}
异常处理
把controller中的所有异常处理都集中到一个地方
采用的是aop的思想,把业务逻辑和异常处理代码分开
创建MyController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MyController {
public ModelAndView doSome(String name,Integer age) throws MyUserException {
ModelAndView modelAndView =new ModelAndView();
if (!"nayuki".equals(name)){
throw new NameException("姓名不正确");
}
if(age==null || age>80){
throw new AgeException("年龄比较大");
}
modelAndView.addObject("name",name);
modelAndView.addObject("age",age);
modelAndView.setViewName("show");
return modelAndView;
}
}创建异常类MyUserException
1
2
3
4
5
6
7
8public class MyUserException extends Exception{
public MyUserException() {
super();
}
public MyUserException(String message) {
super(message);
}
}创建异常类AgeException
1
2
3
4
5
6
7
8public class AgeException extends MyUserException{
public AgeException() {
super();
}
public AgeException(String message) {
super(message);
}
}创建异常类NameException
1
2
3
4
5
6
7
8public class NameException extends MyUserException{
public NameException() {
super();
}
public NameException(String message) {
super(message);
}
}创建普通类GlobalExceptionHandler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class GlobalExceptionHandler {
public ModelAndView doNameException(Exception ex){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("msg","姓名必须是Nayuki");
modelAndView.addObject("ex",ex);
modelAndView.setViewName("nameError");
return modelAndView;
}
public ModelAndView doAgeException(Exception ex){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("msg","年龄不能大于80");
modelAndView.addObject("ex",ex);
modelAndView.setViewName("ageError");
return modelAndView;
}
public ModelAndView doOtherException(Exception ex){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("msg","其他错误");
modelAndView.addObject("ex",ex);
modelAndView.setViewName("defaultError");
return modelAndView;
}
}在springmvc配置文件中加入
1
<mvc:annotation-driven/>
拦截器
拦截器是拦截用户的请求,做请求判断处理的
拦截器是全局的,可以对对个Controller做拦截
一个项目中可以有0个或多个拦截器
拦截器的执行时间
- 执行Controller方法前执行拦截器
- 执行Controller方法后执行拦截器
- 在请求处理完成后执行拦截器
多个拦截器执行顺序,按照先后声明顺序
- Interceptor1.preHandle=true&&Interceptor1.preHandle=true
- Interceptor1.preHandle()->Interceptor2.preHandle()->Interceptor2.postHandle()->Interceptor1.postHandle()->Interceptor2.afterCompletion()->Interceptor1.afterCompletion()
- Interceptor1.preHandle=true&&Interceptor1.preHandle=false
- Interceptor1.preHandle()->Interceptor2.preHandle()->Interceptor1.afterCompletion()
- Interceptor1.preHandle=false&&Interceptor1.preHandle=false
- Interceptor1.preHandle()
- Interceptor1.preHandle=true&&Interceptor1.preHandle=true
创建拦截器类MyInterceptor
1
2
3
4
5
6
7
8
9
10
11
12public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}在springmvc配置文件中声明拦截器
1
2
3
4
5
6<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="handler.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>拦截器和过滤器的区别
- 拦截器是框架中的对象,过滤器是servlet中的对象
- 拦截器是实现HandlerInterceptor,过滤器是实现Filter接口的对象
- 过滤器是在拦截器之前先执行的
- 过滤器是tomcat服务器创建的对象,拦截器是springmvc容器中创建的对象
- 过滤器是一个执行时间点,拦截器是三个执行时间点