springmvc基础(4)


转发

  • 不和视图解析器一同工作

  • 请求->服务器->资源1->资源2->响应

  • 资源2可以是WEB-INF中的资源

  • forward实现显示转发

    1
    2
    3
    4
    5
    public 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
    5
    public 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
    @Controller
    public class MyController {
    @RequestMapping(value = "/user/some.nayuki")
    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
    8
    public class MyUserException extends Exception{
    public MyUserException() {
    super();
    }
    public MyUserException(String message) {
    super(message);
    }
    }
  • 创建异常类AgeException

    1
    2
    3
    4
    5
    6
    7
    8
    public class AgeException extends MyUserException{
    public AgeException() {
    super();
    }
    public AgeException(String message) {
    super(message);
    }
    }
  • 创建异常类NameException

    1
    2
    3
    4
    5
    6
    7
    8
    public 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
    @ControllerAdvice
    public class GlobalExceptionHandler {
    @ExceptionHandler(value = NameException.class)
    public ModelAndView doNameException(Exception ex){
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("msg","姓名必须是Nayuki");
    modelAndView.addObject("ex",ex);
    modelAndView.setViewName("nameError");
    return modelAndView;
    }
    @ExceptionHandler(value = AgeException.class)
    public ModelAndView doAgeException(Exception ex){
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("msg","年龄不能大于80");
    modelAndView.addObject("ex",ex);
    modelAndView.setViewName("ageError");
    return modelAndView;
    }
    @ExceptionHandler
    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()
  • 创建拦截器类MyInterceptor

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    return false;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
    @Override
    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容器中创建的对象
    • 过滤器是一个执行时间点,拦截器是三个执行时间点