spring mvc配置类简介及放静态资源释放
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
配置文件ApplicationContext.xml
基于spring的项目资源都是通过DispatcherServlet
作为拦截器DispatcherServlet是前置控制器配置在web.xml文件中的。拦截匹配的请求Servlet拦截匹配规则要自己定义把拦截下来的请求依据相应的规则分发到目标Controller来处理是配置spring MVC的第一步。
DispatcherServlet主要用作职责调度工作本身主要用于控制流程主要职责如下
- 文件上传解析如果请求类型是multipart将通过MultipartResolver进行文件上传解析
- 通过HandlerMapping将请求映射到处理器返回一个HandlerExecutionChain它包括一个处理器、多个HandlerInterceptor拦截器
- 通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器)
- 通过ViewResolver解析逻辑视图名到具体视图实现
- 本地化解析
- 渲染具体的视图等
- 如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。
DispatcherServlet初始化的上下文加载的Bean是只对SpringMVC有效的Bean
如Controller、HandlerMapping、HandlerAdapter等等该初始化上下文只加载Web相关组件。
DispatcherServlet初始化主要做了如下两件事情
1、初始化SpringMVC使用的Web上下文并且可能指定父容器为ContextLoaderListener加载了根上下文
2、初始化DispatcherServlet使用的策略如HandlerMapping、HandlerAdapter等。
DispatcherServlet中使用的特殊的Bean
DispatcherServlet默认使用WebApplicationContext作为上下文该上下文中特殊的Bean有
1、Controller
处理器/页面控制器做的是MVC中的C的事情但控制逻辑转移到前端控制器了用于对请求进行处理
2、HandlerMapping
请求到处理器的映射如果映射成功返回一个HandlerExecutionChain对象
包含一个Handler处理器页面控制器对象、多个HandlerInterceptor拦截器对象
如BeanNameUrlHandlerMapping将URL与Bean名字映射映射成功的Bean就是此处的处理器
3、HandlerAdapter
HandlerAdapter将会把处理器包装为适配器从而支持多种类型的处理器即适配器设计模式的应用
从而很容易支持很多类型的处理器
如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配
并且按处理器的handleRequest方法进行功能处理
4、ViewResolver
ViewResolver将把逻辑视图名解析为具体的View通过这种策略模式很容易更换其他视图技术
如InternalResourceViewResolver将逻辑视图名映射为jsp视图
5、LocalResover
本地化解析因为Spring支持国际化因此LocalResover解析客户端的Locale信息从而方便进行国际化
6、ThemeResovler
主题解析通过它来实现一个页面多套风格即常见的类似于软件皮肤效果
7、MultipartResolver
文件上传解析用于支持文件上传
8、HandlerExceptionResolver
处理器异常解析可以将异常映射到相应的统一错误界面从而显示用户友好的界面而不是给用户看到具体的错误信息
9、RequestToViewNameTranslator
当处理器没有返回逻辑视图名等相关信息时自动将请求URL映射为逻辑视图名
SSM配置文件的释放资源
SSM项目是离不开配置文件的配置文件修改也是最简单的一种修改方式Spring mvc释放静态资源的方法
通过配置文件添加配置信息覆盖默认即可释放静态资源。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
配置中添加这个这个在返回时View时更加方便例如
return "/index.jsp"
可以直接写成return "index"
基于配置类WebMvcConfigurer
该配置类是spring提供的一种配置方式采用JavaBean的方式替代传统的基于xml的配置来对spring框架进行自定义的配置。因此在spring boot提倡的基于注解的配置采用“约定大于配置”的风格下当需要进行自定义的配置时便可以使用WebMvcConfigurer
接口或者继承该接口或者其实现类WebMvcConfigurerAdapter这个抽象类等等通过JavaBean来实现需要的配置。
也就是说WebMvcConfigurer是ApplicationContext.xml的配置类版。
除了上面的配置文件也可以使用注解来更改配置WebMvcConfigurer
是MVC的配置类接口。
该接口定义了许多方法用于修改配置,源码如下
public interface WebMvcConfigurer {
void configurePathMatch(PathMatchConfigurer var1);
void configureContentNegotiation(ContentNegotiationConfigurer var1);
void configureAsyncSupport(AsyncSupportConfigurer var1);
void configureDefaultServletHandling(DefaultServletHandlerConfigurer var1);
void addFormatters(FormatterRegistry var1);
void addInterceptors(InterceptorRegistry var1);
void addResourceHandlers(ResourceHandlerRegistry var1);
void addCorsMappings(CorsRegistry var1);
void addViewControllers(ViewControllerRegistry var1);
void configureViewResolvers(ViewResolverRegistry var1);
void addArgumentResolvers(List<HandlerMethodArgumentResolver> var1);
void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> var1);
void configureMessageConverters(List<HttpMessageConverter<?>> var1);
void extendMessageConverters(List<HttpMessageConverter<?>> var1);
void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> var1);
void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> var1);
Validator getValidator();
MessageCodesResolver getMessageCodesResolver();
}
可以通过该接口添加一些自定义的拦截器例如跨域设置、类型转化器等下面是其常用方法
/* 拦截器配置 */
void addInterceptors(InterceptorRegistry var1);
/* 视图跳转控制器 */
void addViewControllers(ViewControllerRegistry registry);
/**
*静态资源处理
**/
void addResourceHandlers(ResourceHandlerRegistry registry);
/* 默认静态资源处理器 */
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
/**
* 这里配置视图解析器
**/
void configureViewResolvers(ViewResolverRegistry registry);
/* 配置内容裁决的一些选项*/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 解决跨域问题 **/
public void addCorsMappings(CorsRegistry registry) ;
继承WebMvcConfigurer后就可以在该类自定配置也可以继承其实现类WebMvcConfigurerAdapter扩展了更多方法。但是Spring5.0废弃了WebMvcConfigurerAdapter不过WebMvcConfigurer存在的方法也满足基本使用。
和配置文件注册加载Bean一样先定义后依赖注入在自动装配。通过WebMvcConfigurer
的继承类实现也是同样的步骤
//定义拦截器
public class LoginInterceptor extends HandlerInterceptorAdapter {
private static final Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("-----------------------------");
logger.info(request.getRequestedSessionId());
logger.info("-----------------------------");
return true;
}
}
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
/*
* 拦截器配置*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
}
//跨域CORS配置
public void addCorsMappings(CorsRegistry registry) {
super.addCorsMappings(registry);
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("POST","GET")
.allowedOrigins("http://...")
.allowCredentials(true);
}
//配置ViewController
/**
* 视图控制器配置
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
super.addViewControllers(registry);
registry.addViewController("/").setViewName("forward:/index.html");
}
//配置ViewResolver
/**
* 配置请求视图映射
*
* @return
*/
@Bean
public InternalResourceViewResolver resourceViewResolver() {
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
//请求视图文件的前缀地址
internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
//请求视图文件的后缀
internalResourceViewResolver.setSuffix(".jsp");
return internalResourceViewResolver;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
super.configureViewResolvers(registry);
registry.viewResolver(resourceViewResolver());
}
//配置Formatter
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new Formatter<Date>() {
@Override
public Date parse(String date, Locale locale) {
return new Date(Long.parseLong(date));
}
@Override
public String print(Date date, Locale locale) {
return Long.valueOf(date.getTime()).toString();
}
});
}
在ssm项目中我们知道控制器对静态资源的拦截是通过继承WebMvcConfigurationSupport
WebMvcConfigurationSupport是webmvc的配置类如果在springboot项目中有配置类继承了WebMvcConfigurationSupport那么webmvc的自动配置类WebMvcAutoConfiguration就会失效。
该类就有配置功能如释放静态资源
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/"
};
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!registry.hasMappingForPattern("/webjars/**")) {
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
}
if (!registry.hasMappingForPattern("/**")) {
registry.addResourceHandler("/**").addResourceLocations(
CLASSPATH_RESOURCE_LOCATIONS);
}
}
}
其他常用方法
@Configuration
public class MyConfig extends WebMvcConfigurationSupport{
//自定义的一个拦截器
@Autowired
HttpInterceptor httpInterceptor;
//定义时间格式转换器
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
converter.setObjectMapper(mapper);
return converter;
}
//添加转换器
//配置springmvc返回数据时 输出数据的格式这里只配置了时间的输出格式
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//将我们定义的时间格式转换器添加到转换器列表中,
//这样jackson格式化时候但凡遇到Date类型就会转换成我们定义的格式
converters.add(jackson2HttpMessageConverter());
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
//将我们自定义的拦截器注册到配置中
registry.addInterceptor(httpInterceptor).addPathPatterns("/**");
super.addInterceptors(registry);
}
/**
* 防止@EnableMvc把默认的静态资源路径覆盖了手动设置的方式
* 配置了静态资源访问
* 还能配置视图解析 访问服务器上的资源
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 解决静态资源无法访问
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
//配置视图解析把url中后面带/image/***的路径映射到c盘photo文件中的资源
registry.addResourceHandler("/image/**").addResourceLocations("file:C://photo/");
super.addResourceHandlers(registry);
}
//配置服务器跨域请求被允许
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")
.allowCredentials(true).maxAge(3600);
}
}