Java – SpringMVC – 基于注解配置SpringMVC
简介
在SpringMVC项目当中,我们需要配置两个重要的XML文件,一是【web.xml】用于配置Servlet容器的,二是【SpringMVC.xml】用于配置SpringMVC解析的。
同样的,我们可以不需要创建这两个文件,直接使用类和注解的方式进行配置。
创建初始化类代替web.xml
在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。
Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。
Spring3.2引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer,当我们的类扩展了AbstractAnnotationConfigDispatcherServletInitializer并将其部署到Servlet3.0容器的时候,容器会自动发现它,并用它来配置Servlet上下文。
因此,我们可以创建一个类,继承 AbstractAnnotationConfigDispatcherServletInitializer 类,重写三个方法:
/**
* 不需要做注解,它会自动被容器寻找并加载,因为它继承了
* AbstractAnnotationConfigDispatcherServletInitializer
*/
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* getRootConfigClasses 方法
* 用于返回 Spring 配置代替的实现类
* 如果没有,可以创建一个用于配置Spring的实现类
*
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
/**
* getServletConfigClasses 方法
* 用于返回 SpringMVC.xml 文件配置代替的实现类
* 如果没有,可以创建一个用于配置 SpringMVC.xml 的实现类
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMVCConfig.class};
}
/**
* getServletMappings 方法
* 专用于映射 SpringMVC 处理方法配置的路径
*
* <servlet-mapping>
* <servlet-name>SpringMVC</servlet-name>
* <url-pattern>/</url-pattern>
* </servlet-mapping>
*
* 其中的 url-pattern 就是方法中返回的类型
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
web.xml 中的其它配置注解方法
在【web.xml】中我们还会做一些过滤器的操作
比如【编码过滤器CharacterEncodingFilter】和【提交方法过滤器hiddenHttpMethodFilter】
可以重写 SpringMVC 的继承方法,可以以注解的方式实现在XML中的各种配置
过滤器配置重写方法【getServletFilters()】
@Override
protected Filter[] getServletFilters() {
/**
* 创建编码过滤器
* 1.创建编码过滤器对象
* 2.设置编码 setEncoding UTF-8
* 3.设置响应编码 setForceEncoding true
*/
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
/**
* 创建提交方法过滤器
* 1.创建提交方法过滤器对象
*/
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
/**
* 把过滤器数组返回
*/
return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
}
创建SpringMVCConfig类代替SpringMVC.xml
在SpringMVC.xml中,常见配置有8样,分别是:
扫描组件、Thymeleaf视图解析器、默认的servlet处理静态资源、开启MVC注解驱动、文件上传解析器、拦截器、视图控制器、异常处理器
代替类需要加上注解【@Configuration】
以表示这个类是用于配置SpringMVC.xml的代替类。
代替类需要实现接口【WebMvcConfigurer】
以重写一些配置方法。
/**
* 用于代替SpringMVC.xml配置的代替类
*/
@Configuration
public class SpringMVCConfig implements WebMvcConfigurer {
}
注意:在代替类中,方法名即是Bean类的ID名称。
扫描组件
扫描组件,指的是,当我们通过注解的方式定义Bean类时,需要对Bean类进行扫描。
关于扫描组件的相关知识,请查阅下面文章:
基于注解的方式配置SpringMVC.xml中的扫描组件方法很简单,只需要在代替类中加上【@ComponentScan】
即可
// 扫描目录为 cn.unsoft.controller
@Configuration
@ComponentScan("cn.unsoft.controller")
public class SpringMVCConfig implements WebMvcConfigurer {
}
Thymeleaf视图解析器
Thymeleaf视图解析器 是用于转发html文件时的解析器。
关于Thymeleaf视图解析器的相关知识,请查阅下面文章:
基于注解的方式配置SpringMVC.xml中的Thymeleaf视图解析器相对比较复杂,我们先看xml文件中的配置,再按照配置来定义
<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8"/>
</bean>
</property>
</bean>
</property>
</bean>
分析:Thymeleaf视图解析器中共包含了两个子bean类,那么在类中,就是以一个创建方法来表示。
1.首先创建了一个id名为 viewResolver
的 ThymeleafViewResolver
的Bean对象
a>设置属性 order = 1
b>设置属性 characterEncoding = "UTF-8"
c>设置对象templateEngine
.因为它是一个对象,所以要另创建一个Bean对象
2.创建了一个 templateEngine
属性的对象,类型为 SpringTemplateEngine
a>设置对象 templateResolver
.因为它是一个对象,所以要另创建一个Bean对象
3.创建了一个 templateResolver
属性的对象,类型为 SpringResourceTemplateResolver
a>设置属性 prefix="/WEB-INF/templates/"
b>设置属性 suffix=".html"
c>设置属性 templateMode= "HTML5"
d>设置属性 characterEncoding="UTF-8"
根据以上分析,实现方法:
public class SpringMVCConfig implements WebMvcConfigurer {
//生成视图解析器并未解析器注入模板引擎
@Bean
public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
/* <property name="order" value="1"/> */
viewResolver.setOrder(1);
/* <property name="characterEncoding" value="UTF-8"/> */
viewResolver.setCharacterEncoding("UTF-8");
/* <property name="templateEngine"> */
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}
//生成模板引擎并为模板引擎注入模板解析器
/**
* 创建 templateEngine Bean对象
* @param templateResolver
* @return
*/
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
/* <property name="templateResolver"> */
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}
/**
* 创建 templateResolver Bean对象
* @return
*/
@Bean
public ITemplateResolver templateResolver() {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
// ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(webApplicationContext.getServletContext());
/* <property name="prefix" value="/WEB-INF/templates/"/> */
templateResolver.setPrefix("/WEB-INF/templates/");
/* <property name="suffix" value=".html"/> */
templateResolver.setSuffix(".html");
/* <property name="characterEncoding" value="UTF-8"/> */
templateResolver.setCharacterEncoding("UTF-8");
/* <property name="templateMode" value="HTML5"/> */
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}
}
默认的servlet处理静态资源
重写继承方法【configureDefaultServletHandling】
设置【configurer】为enable
即可。
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
开启MVC注解驱动
在代替类中添加注册【@EnableWebMvc】
即可
@EnableWebMvc
public class SpringMVCConfig implements WebMvcConfigurer { }
文件上传解析器
文件上传解析器本质也是一个Bean类,所以我们可以通过创建一个Bean方法即可。
@Bean
public CommonsMultipartResolver multipartResolver(){
return new CommonsMultipartResolver();
}
拦截器
拦截器是用于在控制方法的执行前,执行后,和渲染后的一些拦截操作类,我们可以通过重写方法【addInterceptors】
来增加拦截器
关于拦截器的相关知识,请查阅下面文章:
@Override
public void addInterceptors(InterceptorRegistry registry) {
firstInterceptor interceptor = new firstInterceptor();
registry.addInterceptor(interceptor).addPathPatterns("/**");
}
视图控制器
视图控制器是指一些我们不需要控制器方法进行处理直接打开的页面,在xml中是【<mvc:view-controller>】
使用代替类配置视图控制器,需要重写方法【addViewControllers】
即可。
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
异常处理器
异常处理器是指当控制器方法在执行的过程中出现异常时,会调用的处理方法
关于异常处理器的相关知识,请查阅下面文章:
使用代替类配置异常处理器,需要重写方法【configureHandlerExceptionResolvers】
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
/**
* 创建一个 SimpleMappingExceptionResolver 对象
*/
SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
/**
* 这里需要配置当出现什么异常时,就跳转到什么页面
* setExceptionMappings 方法需要提供一个 Properties 类型的key-value对象
*/
Properties prop = new Properties();
prop.setProperty("java.lang.ArithmeticException", "error");
//设置异常映射
exceptionResolver.setExceptionMappings(prop);
/**
* 异常时会报出的异常信息,有值但是没有定义key,
* 而exceptionAttribute的value则是定义这个异常信息的key名称,可以在页面中使用 ${ex} 来访问异常信息。
*/
exceptionResolver.setExceptionAttribute("ex");
resolvers.add(exceptionResolver);
}
共有 0 条评论