最近刚看了spring实战第四部 自己也用javaconfig的方式创建了一个简单的web工程 记录下心得
首先用javaconfig创建spring web工程的时候 还是是否简单的 只需要继承AbstractAnnotationConfigDispatcherServletInitializer的实现接可以
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
RootConfig和WebConfig 就是spring的配置文件
如果用传统的web.xml结合javaconfig的方式 也是很简单的
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>spittr</display-name>
<!-- 使用java配置 -->
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<!-- - Location of the XML file that defines the root application context.
- Applied by ContextLoaderListener. -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- <param-value>classpath:spring/application-config.xml</param-value> -->
<param-value>spittr.config.RootConfig</param-value>
</context-param>
<!-- 设置开发模式 -->
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- <filter> <filter-name>springSecurityFilterChian</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter> -->
<!-- - Servlet that dispatches request to registered handlers (Controller
implementations). -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 使用java配置 -->
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>spittr.config.WebConfig</param-value>
</init-param>
<!-- <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-config.xml</param-value>
</init-param> -->
<load-on-startup>1</load-on-startup>
<multipart-config>
<location>/tmp/spittr/uploads</location>
<max-file-size>2097152</max-file-size>
<max-request-size>4194304</max-request-size>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
重点是使用 AnnotationConfigWebApplicationContext 通知用注解的方式加载
<!-- 使用java配置 -->
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
然后就是 RootConfig和WebConfig 这两个文件了
RootConfig.java 就相当 application-context.xml
@Configuration
@ComponentScan(basePackages = {"spittr"}, excludeFilters = {
@Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
@Import({SecurityConfig.class, DataSourceConfigDataSource.class})
@PropertySource("classpath:config.properties")
//@ActiveProfiles("dev")
public class RootConfig {
@Autowired
Environment env;
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSoure = new ReloadableResourceBundleMessageSource();
messageSoure.setBasename("classpath:message");
return messageSoure;
}
}
@Configuration 表示该类为配置类
@ComponentScan注解扫描路径
@Import 导入其他的配置类
@@PropertySource 加载配置文件
WebConfig.java 相当于dispatcher-servlet.xml
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "spittr.web", useDefaultFilters = false, includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class),
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = ControllerAdvice.class)})
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/view/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
// 添加静态资源映射
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/res/**").addResourceLocations("/WEB-INF/resources/");
//registry.addResourceHandler("/js/**").addResourceLocations("/WEB-INF/resources/js/");
//registry.addResourceHandler("/css/**").addResourceLocations("/WEB-INF/resources/css/");
//registry.addResourceHandler("/images/**").addResourceLocations("/WEB-INF/resources/images/");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* 编码 及 json解析
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//主要针对 IE返回json为下载的问题
List<MediaType> jsonSupportedMediaTypes = new ArrayList<MediaType>();
jsonSupportedMediaTypes.add(MediaType.TEXT_PLAIN);
List<MediaType> textSupportedMediaTypes = new ArrayList<MediaType>();
textSupportedMediaTypes.add(MediaType.TEXT_PLAIN);
textSupportedMediaTypes.add(MediaType.TEXT_HTML);
// 定义json解析器的返回类型
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setDefaultCharset(Charset.forName("utf-8"));
List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
supportedMediaTypes.addAll(jsonSupportedMediaTypes);
mappingJackson2HttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes);
converters.add(mappingJackson2HttpMessageConverter);
super.configureMessageConverters(converters);
}
}
基本这些简单的配置 spring web就搭建起来了