【SpringMVC 框架(自学)】Day11(注解配置SpringMVC)--2022/4/23
十一、注解配置SpringMVC
在Servlet3.0的环境中,容器在类路径中查找实现javax.servlet.ServletContainerInitializer接口
如果找到的话,就会用它去配置Servlet容器
Spring提供了这个接口的实现,名为SpringServletContainerInitializer
这个类又会查找实现WebApplicationInitializer并将配置的任务交给它们完成
在Spring3.2的环境中,WebApplicationInitializer有一个的实现类
其名为:AbstractAnnotationConfigDispatcherServletInitializer
只要将其部署,那么Spring容器会自动发现,并用它来配置Servlet上下文
1 、创建初始化类(Web.xml)
首先创建一个类,实现初始化的功能,代替Web.xml,
并继承AbstractAnnotationConfigDispatcherServletInitializer
再实现它的四个方法:
- getRootConfigClasses():指定Spring的配置类
- getServletConfigClasses():指定SpringMVC的配置类
- getServletMappings():指定DispathcerServlet的映射规则
- getServletFilters():注册过滤器
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer{
//继承这个实现类,并实现它所存在的方法
/**
* 指定Spring的配置类
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
/**
* 指定SpringMVC的配置类
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
/**
* 指定DispathcerServlet的映射规则,即Url-pattern
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//接着实现过滤器(getServletFilters)方法
/**
* 注册过滤器
* @return
*/
@Override
protected Filter[] getServletFilters() {
//设置Get、Post的字符集
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceResponseEncoding(true);
//设置Put、Delete、Update等字符集
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};
}
}
2 、创建SpringConfig类(Spring.xml)
@Configuration
public class SpringConfig {
//因为是配置类:所以要用Configuration标识
//还未整合到Spring 所以暂且不用配置
}
3 、 创建WebConfig类(SpringMVC.xml)
在SpringMVC的配置中,需要配置以下文件:
- 1 、组件扫描器(Compnent-Scan)
- 2 、Thymeleaf视图解析器
- 3 、MVC视图解析器(View-Controller)
- 4 、 静态资源访问(Default-servlet-handler)
- 5 、MVC注解驱动(annotation-driver)
- 6 、文件上传解析器(CommonsMultiPartResolver)
- 7 、异常处理器(SimpleMappingExceptionResolver)
- 8 、拦截器(InterCeptor)
@Configuration//将当前类标识为配置类
@ComponentScan// 1 、组件扫描器
@EnableWebMvc// 5 、MVC注解驱动
public class implements WebMvcConfigurer{
// 4 、配置静态资源访问 Ctrl+o,选择configureDefaultServletHandling
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
//enable开启静态资源访问
configurer.enable();
}
// 8 、配置拦截器 Ctrl+o,选择addInterCeptor
@Override
public void addInterceptors(InterceptorRegistry registry) {
//new一个拦截器对象
TestInterceptor testInterceptor = new TestInterceptor();
//添加拦截器类().添加拦截的路径()
//addInterceptor(HandlerInterceptor interceptor)类型是拦截器
//所以需要new一个拦截器对象
registry.addInterceptor(testInterceptor).addPathPatterns("/**");
}
// 3 、配置mvc视图解析器 Ctrl+o,选择addViewControllers
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//添加路径("/hello").设置跳转的视图名("hello")
registry.addViewController("/hello").setViewName("hello");
}
// 6 、配置文件上传解析器 Ctrl+o,选择MultipartResolver
@Bean //要创建一个对象 用@Bean注解
public MultipartResolver multipartResolver(){
//MultipartResolver只是一个接口 所以要new它的实现类
CommonsMultipartResolver commonsMultipartResolver
= new CommonsMultipartResolver();
return commonsMultipartResolver;
}
//另一种写法
// @Bean
// public CommonsMultipartResolver multipartResolver(){
// return new CommonsMultipartResolver();
// }
// 7 、配置异常处理器 Ctrl+o,选择configureHandlerExceptionResolvers
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
//配置bean
SimpleMappingExceptionResolver exceptionResolver
= new SimpleMappingExceptionResolver();
//创建两个属性exceptionMapping、exceptionAttribute;
//new一个property文件,进行键值对的传参
Properties prop = new Properties();
//传入异常,因为键值对是String类型,所以不能用put方法(Object key,Object Value)
prop.setProperty("java.lang.ArithmeticException","error");
//将prop属性传给异常映射
exceptionResolver.setExceptionMappings(prop);
//将异常信息在请求域中进行共享
exceptionResolver.setExceptionAttribute("exception");
//添加异常处理器
resolvers.add(exceptionResolver);
}
/**
* 2 、配置Thymeleaf解析器
*/
//配置生成模板解析器
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver springResourceTemplateResolver = new SpringResourceTemplateResolver();
springResourceTemplateResolver.setApplicationContext(ContextLoader.getCurrentWebApplicationContext());
springResourceTemplateResolver.setPrefix("/WEB-INF/templates/");
springResourceTemplateResolver.setSuffix(".html");
springResourceTemplateResolver.setCharacterEncoding("UTF-8");
springResourceTemplateResolver.setTemplateMode(TemplateMode.HTML);
return springResourceTemplateResolver;
}
//生成模板引擎并为模板引擎注入模板解析器
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}
//生成视图解析器并未解析器注入模板引擎
@Bean
public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?