注解配置 SpringMVC
概述
1、使用配置类、注解,代替 web.xml、SpringMVC 配置文件
2、在 Servlet3.0 环境中,容器会在类路径(src、resource)中查找 javax.servlet.ServletContainerInitializer 接口的实现类
(1)如果找到,用实现类来配置 Servlet 容器,Spring 提供该接口的实现:SpringServletContainerInitializer
(2)SpringServletContainerInitializer 会查找实现 WebApplicationInitializer 接口的实现类,并由其实现类完成配置
3、Spring3.2 引入 WebApplicationInitializer 基础实现类:AbstractAnnotationConfigDispatcherServletInitializer
4、自定义实现类继承、扩展 AbstractAnnotationConfigDispatcherServletInitializer,并将其部署到 Servlet3.0 容器时,容器会自动识别自定义类,并用其配置 Servlet 上下文
web工程的初始化类,代替 web.xml
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
//指定Spring配置类
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
//指定SpringMVC配置类
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMVCConfig.class};
}
//指定DispatcherServlet映射规则,即servlet-mapping、url-pattern
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//注册过滤器
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceResponseEncoding(true);
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
}
}
代替 SpringMVC 配置文件
1、方法中的形参,自动注入
//将当前类标识为一个配置类
@Configuration
//扫描组件
@ComponentScan("包路径")
//开启MVC注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
//开放对静态资源的访问
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
//拦截器,
@Override
public void addInterceptors(InterceptorRegistry registry) {
//创建自定义拦截器
CustomInterceptor customInterceptor = new CustomInterceptor();
//addPathPatterns("/**")等价于<mvc:mapping path="/**"/>;excludePathPatterns("/")等价于<mvc:exclude-mapping path="/"/>
registry.addInterceptor(customInterceptor).addPathPatterns("/**").excludePathPatterns("/");
}
//仅实现页面跳转
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//addViewController:处理的请求地址,即@RequestMapping的value;setViewName:请求地址对应的视图名称,即控制器方法返回的字符串
registry.addViewController("请求地址").setViewName("视图名称");
}
//文件上传解析器
@Bean
public MultipartResolver multipartResolver(){
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
return commonsMultipartResolver;
}
//异常处理器
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
Properties properties = new Properties();
//参数1:处理器方法执行过程中可能出现的异常;参数2:设置一个新的视图名称,若出现指定异常时,跳转到指定页面
properties.setProperty("java.lang.ArithmeticException", "error");
//异常处理器导入配置信息
exceptionResolver.setExceptionMappings(properties);
//设置一个属性名,将出现的异常信息在请求域中进行共享
exceptionResolver.setExceptionAttribute("exception");
//集合导入异常处理器
resolvers.add(exceptionResolver);
}
//配置生成模板解析器
@Bean
public ITemplateResolver templateResolver() {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
//ServletContextTemplateResolver需要一个ServletContext作为构造参数,通过WebApplicationContext的方法获得
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(webApplicationContext.getServletContext());
//视图前缀
templateResolver.setPrefix("/WEB-INF/templates/");
//视图后缀
templateResolver.setSuffix(".html");
//页面编码
templateResolver.setCharacterEncoding("UTF-8");
//模板模型
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}
//生成模板引擎
@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:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战