Spring MVC的定制配置需要我们的配置类继承一个WebMvcConfigurerAdapter类,并在此类使用@EnableWebMvc注解,来开启对Spring MVC的配置支持,这样我们就可以重写这个类的方法,完成我们的常用配置。
静态资源映射
程序的静态文件(js、css、图片)等需要直接访问,这时我们可以在配置里重写addResourceHandlers方法来实现。
示例
1、添加静态资源,我们在src/main/resources下建立assets/js目录,并复制一个jquery.js放置在此目录下,如下图:
package cn.hncu; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2017/2/21. * Time: 下午 4:09. * Explain:配置类 */ @Configuration @EnableWebMvc //开启SpringMVC支持,如无此注解,重写WebMvcConfigurerAdapter类的方法无效 @ComponentScan("cn.hncu") public class MyMvcConfig extends WebMvcConfigurerAdapter{ //集成WebMvcConfigurerAdapter类,重写其方法可对Spring MVC进行配置 @Bean public InternalResourceViewResolver viewResolver(){ InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/classes/views/"); viewResolver.setSuffix(".jsp"); viewResolver.setViewClass(JstlView.class); return viewResolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/assets/"); //addResourceHandler指的是对外暴露的访问路径,addResourceLocations指的是文件放置的目录, } }
输入访问地址:http://localhost:8080/springMVC3/static/js/jquery.js
拦截器配置
拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似于Servlet的Filter。
可让普通的Bean实现HanlderInterceptor接口或者集成HandlerInterceptorAdapter类实现自定义拦截器。
通过重写WebMvcConfigurerAdapter的addInterceptors方法来注册自定义的拦截器,本节演示一个简单的拦截器的开发和配置,业务含义为计算每一次请求的处理时间。
示例
package cn.hncu.filter; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2017/2/21. * Time: 下午 5:00. * Explain:拦截器 */ //配置拦截器的Bean public class DemoInterceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //重写preHandle方法,在请求发生前执行 long startTime = System.currentTimeMillis(); request.setAttribute("startTime",startTime); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { //重写postHandle方法,在请求完成后执行 long startTime = (Long) request.getAttribute("startTime"); request.removeAttribute("startTime"); long endTime = System.currentTimeMillis(); System.out.println("本次请求处理时间为:"+ new Long(endTime - startTime) +" ms"); request.setAttribute("handlingTime",endTime-startTime); } }
如果需要拦截特定的网址,可利用正则映射到需要拦截的路径 ,然后在preHandle方法中判断request.getRequestURL().toString(),进行匹配,用matches方法。
配置
写在MyMvcConfig中
@Bean //配置拦截器的Bean public DemoInterceptor demoInterceptor(){ return new DemoInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(demoInterceptor()); }
写一个控制器
package cn.hncu.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2017/2/21. * Time: 下午 5:23. * Explain:控制器 */ @Controller @RequestMapping("index") public class Index { @RequestMapping("/") public String index(){ return "index"; } }
添加index.jsp
运行后,访问http://localhost:8080/springMVC3/index/
访问静态资源不会拦截哦!也就是直接访问.js的那个文件不会被拦截。