3: Spring WebMVC Interceptor拦截器简单应用

3: Spring WebMVC Interceptor拦截器简单应用_第1张图片

1.pom引入SpringMVC jar依赖

    
        
        
          org.springframework
          spring-webmvc
          4.3.13.RELEASE
        
    

2.WEB-INF/web.xml配置

    
    
        
        springDispatcherServlet
        org.springframework.web.servlet.DispatcherServlet
        
        
        
            contextConfigLocation
            classpath:spring-mvc.xml
        
        1
    

    
    
        springDispatcherServlet
        /
    
    注意:
        1)配置SpringMVC的xml配置, 需要在resources目录下创建. 
        2)使用默认Servlet读取规则[servlet-name]-servlet.xml, 对应springDispatcherServlet-servlet.xml
        3)param-value中classpath:Spring项目根目录默认前缀, 这里Spring默认读取resources目录下配置

3.配置SpringMVC配置文件

    
    

    
    
        
        
        
        
    

4.编写Controller

    /**
     * 标记当前类为控制层
     * Spring扫描此注解
     * 将Mapping对应映射关系保存到容器
     */
    @Controller
    public class HelloController {
    
        //配置URL映射
        @RequestMapping("/hello")
        public String hello () {
            //返回视图名称
            return "hello";
        }
    }

5.实现HandlerInterceptor

  • 实现访问/{code}时, 当请求数字大于零时, 返回Hello, World!. 否则直接返回{code}
    /**
     * SpringMVC 拦截器
     * 三个阶段
     * 1) 请求到Controller前, #{@link #preHandle}
     * 2) Controller执行后, DispatcherServlet视图渲染前, #{@link #postHandle}
     * 3) 视图渲染后, #{@link #afterCompletion}
     * 4) 2,3都依赖1结果为true
     */
    public class GlobalInterceptor implements HandlerInterceptor {
    
        private static final Logger _LOGGER = LoggerFactory.getLogger(GlobalInterceptor.class);
        /**
         * 请求到Controller前执行
         * 返回false则请求结束, 不会进入Controller
         */
        @Override
        public boolean preHandle(HttpServletRequest request,
                                 HttpServletResponse response, Object handler) throws Exception {
            String url = request.getRequestURI();
            _LOGGER.info("Request url: {}", url);
            if (!StringUtils.isEmpty(url)) {
                try {
                    url = url.replaceAll("/", "");
                    if (Integer.valueOf(url) > 0) {
                        request.setAttribute("code", "Hello, World!");
                    }
                } catch (NumberFormatException nfe) {
                    _LOGGER.info("Number format error: {} not number.", url);
                }
            }
            return true;
        }
    
    
        /**
         * Controller执行后, DispatcherServlet视图渲染前执行
         * 用来处理一些Model数据等
         */
        @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 {
    
        }
    }
  • 方法解释:
    1) preHandle(): 请求在进入Controller前会先进入这个方法, 如果该方法返回false请求返回, 可以在这里做一些验证, 或者修改一些参数等等.
    2) postHandle(): 进入该方法时Controller已经执行完毕, 但页面还未渲染, 这里可以做一些视图渲染或者Model方面的改动.
    3) afterCompletion(): 此时页面已经渲染完毕, 该方法可以做一些资源清理等操作.

6.配置Interceptor

  • 在spring-mvc.xml中添加配置
    
    
        
            
            
            
            
        
    

7.启动

  • 在webapp下创建index.jsp
    
        
            Click Hello!
            
Click Number!
Click Artist

8.工程实例
Github: https://github.com/Artister/framework-learning/tree/master/Chapter1-0-2

9.结束

你可能感兴趣的:(3: Spring WebMVC Interceptor拦截器简单应用)