SpringMVC(二)

请求转发与重定向

请求转发:用户发起一次请求,页面跳转在服务器内部执行。限制:只能访问服务器内部的资源(可以访问WEB-INF中的资源,WEB-INF中的资源是受保护的,用户不能直接访问),不能访问其他服务器的资源。
重定向:用户发起一次请求,服务器接收请求,发现需要跳转其他页面,将跳转连接发送给用户,用户再次发起请求。就是说用户发起两次请求。限制:不能访问WEB-INF下的资源文件,但是可以访问其他服务器的资源。

请求转发

forward:表示转发,实现 :request.getRequestDispatcher(“xx.jsp”).forward()
这与视图解析器冲突。在使用请求转发,不与视图解析器一同工作,解决办法:
ModelAndView mv = new ModelAndView();
mv.setViewName(“forward:/xx.jsp”);
forward:视图的完整路径
forward特点:不与视图解析器一同工作,就当它不存在

重定向

redirect:表示重定向,实现 :response.sendRedirect(“xxx.jsp”)
这与视图解析器冲突。在使用请求转发,不与视图解析器一同工作,解决办法:
ModelAndView mv = new ModelAndView();
mv.setViewName(“redirect:/xx.jsp”);
redirect:视图的完整路径
redirect特点:不与视图解析器一同工作,就当它不存在。这里依然不能访问WEB-INF下的资源文件

异常处理

SpringMVC 框架处理异常的常用方式:使用@ExceptionHandler 注解处理异常。

自定义异常类

继承Exception,重写父类的两个方法

public class NameException extends Exception {
    public NameException() {
        super();
    }

    public NameException(String message) {
        super(message);
    }
}
public class AgeException extends Exception {
    public AgeException() {
        super();
    }

    public AgeException(String message) {
        super(message);
    }
}

定义全局异常处理类

@ControllerAdvice:控制器增强,实际就是增强controller对异常的处理
Controller层的处理器方法发生异常时,会执行@ControllerAdvice修饰的方法,通过@ExceptionHandler匹配异常的类型,对异常进行处理
@ExceptionHandler的参数是异常类

@ControllerAdvice
public class GlobalExceptionHandle {
    @ExceptionHandler(value = NameException.class)
    public ModelAndView doNameException(Exception ex) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("tips", "name已存在或格式不正确");
        mv.addObject("msg", "@ControllerAdvice处理name的异常");
        mv.addObject("exmsg", ex.getMessage());
        mv.addObject("ex", ex);
        mv.setViewName("error");
        return mv;
    }

    @ExceptionHandler(AgeException.class)
    public ModelAndView doAgeException(Exception ex) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("tips", "age不符合规范");
        mv.addObject("msg", "@ControllerAdvice处理age的异常");
        mv.addObject("exmsg", ex.getMessage());
        mv.addObject("ex", ex);
        mv.setViewName("error");
        return mv;
    }

    @ExceptionHandler
    public ModelAndView doOtherException(Exception ex) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("tips", "系统繁忙中,请稍后重试");
        mv.addObject("msg", "@ControllerAdvice处理其他类型的异常");
        mv.addObject("exmsg", ex.getMessage());
        mv.addObject("ex", ex);
        mv.setViewName("error");
        return mv;
    }
}

声明配置文件springmvc.xml

配置扫描器,扫描@ControllerAdvice修饰的类所在的包名

<context:component-scan base-package="com.ljf.handle" />
<mvc:annotation-driven /> 

拦截器

拦截指定的用户请求,并进行相应的预处理与后处理。
其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。

一个拦截器

写一个拦截器类实现HandlerInterceptor,并实现preHandler、postHandler、afterCompletion方法
一个拦截器的执行顺序

  1. preHandler == true
    先执行拦截器的preHandler
    处理器方法
    拦截器的postHandler
    在视图处理完成后执行aflterCompletion
  2. preHandler == false
    执行拦截器的preHandler
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("执行了拦截器MyInterceptor中的preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView mv) throws Exception {
        System.out.println("执行了拦截器MyInterceptor中的postHandle,mv:"+mv);
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) throws Exception {
        System.out.println("执行了拦截器MyInterceptor中的afterCompletion");
    }
}

注册拦截器springmvc.xml
mvc:mapping 表示拦截请求,/**表示拦截所有请求
bean是注册监听器类,使用全限定名称。

    <!--声明拦截器对象-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.bjpowernode.interceptor.MyInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

执行结果是:

执行了拦截器MyInterceptor中的preHandle
执行了处理器方法
执行了拦截器MyInterceptor中的postHandle
执行了拦截器MyInterceptor中的afterCompletion

多个拦截器

写多个拦截器类,都实现HandlerInterceptor,并实现preHandler、postHandler、afterCompletion方法。
注册拦截其对象(这里以两个拦截器为例)
有多个监听器,使用多个 mvc:interceptor声明。执行顺序根据声明的监听器顺序判定

    <!--声明拦截器对象-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.bjpowernode.interceptor.MyInterceptor" />
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.bjpowernode.interceptor.MyInterceptor1" />
        </mvc:interceptor>
    </mvc:interceptors>

两个拦截器可能的返回结果:

  1. 第一个拦截器preHandle=true , 第二个拦截器preHandle=true
    执行了拦截器MyInterceptor-1111中的preHandle
    执行了拦截器MyInterceptor-22222中的preHandle
    使用doSome方法处理some.do的请求za|22
    执行了拦截器MyInterceptor-22222中的postHandle
    执行了拦截器MyInterceptor-1111中的postHandle
    执行了拦截器MyInterceptor-22222中的afterCompletion
    执行了拦截器MyInterceptor-1111中的afterCompletion

  1. 第一个拦截器preHandle=true , 第二个拦截器preHandle=false
    执行了拦截器MyInterceptor-1111中的preHandle
    执行了拦截器MyInterceptor-22222中的preHandle
    执行了拦截器MyInterceptor-1111中的afterCompletion

  1. 第一个拦截器preHandle=false , 第二个拦截器preHandle=true|false
    执行了拦截器MyInterceptor-1111中的preHandle

权限拦截器

在执行请求方法之前,先执行拦截器类的preHandler方法,判断返回true还是false。满足条件,返回true,继续执行处理器方法;不满足条件,返回false,不继续执行处理器方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 提供了缓存的支持,其中使用了 Spring 3.1 引入的基于注解的缓存技术。这个缓存技术并不是一个具体的缓存实现方案,而是一个对缓存使用的抽象。通过在既有代码中添加少量的注解,可以实现缓存的功能。 在 Spring MVC 中,可以通过在方法上添加 `@Cacheable` 注解来启用缓存功能。该注解可以放在控制器的方法上,当该方法被调用时,会先检查缓存中是否存在相应的结果,如果存在,则直接返回缓存的结果,如果不存在,则执行方法体并将结果缓存起来。 在配置文件中,可以使用 `<cache:annotation-driven/>` 标签来启用缓存功能。同时,可以根据需要配置具体的缓存实现方案,例如 EHCache 或 OSCache。 另外,在 Spring MVC 中,还可以通过自定义过滤器来实现缓存控制。可以使用 `CacheFilter` 过滤器来配置缓存的参数,例如缓存时间和作用范围。通过配置过滤器的映射路径,可以指定哪些请求需要进行缓存处理。 总结起来,Spring MVC 提供了灵活且易于使用的缓存功能,通过使用注解或自定义过滤器,可以方便地实现对数据的缓存处理。这可以提高系统的性能和响应速度,并减少对后端资源的依赖。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [springMVC级缓存配置](https://download.csdn.net/download/qq_27542391/8680397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [springMVC--页面缓存](https://blog.csdn.net/CSDN_GIA/article/details/55044775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值