springmvc 零配置文件 記錄001 --初始化

最近工做須要用到springmvc4,好久沒用spring了變化仍是很大,記錄下搭建一個基於annotation的零配置文件的spring、springmvc、jpa、bootstrap的簡單框架。java

開發環境

  • 開發工具:spring sts 3.6.4
  • jdk:1.7.55 64 bit
  • web server: Pivotal tc Server Developer Edition (Runtime) v3.1
  • mysql: 5.5.23
  • maven:3.2.3

springmvc annotation

@Configuration : 相似於spring配置文件,負責註冊bean,對應的提供了@Bean註解。須要org.springframework.web.context.support.AnnotationConfigWebApplicationContext註冊到容器中。
@ComponentScan : 註解類查找規則定義 <context:component-scan/>
@EnableAspectJAutoProxy : 激活Aspect自動代理 <aop:aspectj-autoproxy/>
@Import @ImportResource: 關聯其它spring配置  <import resource="" />
@EnableCaching :啓用緩存註解  <cache:annotation-driven/>
@EnableTransactionManagement : 啓用註解式事務管理 <tx:annotation-driven />
@EnableWebMvcSecurity : 啓用springSecurity安全驗證

#servlet3.0mysql

Servlet3.0規範,支持將web.xml相關配置也硬編碼到代碼中[servlet,filter,listener,等等],並由javax.servlet.ServletContainerInitializer的實現類負責在容器啓動時進行加載, spring提供了一個實現類org.springframework.web.SpringServletContainerInitializer, 該類會調用全部org.springframework.web.WebApplicationInitializer的實現類的onStartup(ServletContext servletContext)方法,將相關的組件註冊到服務器;web

spring同時提供了一些WebApplicationInitializer的實現類供咱們繼承,以簡化相關的配置,好比: org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer : 註冊spring DispatcherServlet org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer : 註冊springSecurityspring

同時,spring也提供了一些@Configuration的支持類供咱們繼承,以簡化相關@Configuration的配置,好比: org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport : 封裝了springmvc相關組件,咱們能夠經過註冊新的@Bean和@Override相關方法,以實現對各個組件的註冊; org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter : 封裝類springsecurity相關組件sql

#WebConfig classbootstrap

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.context.support.ServletContextAttributeExporter;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.ResourceBundleViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages="com.xxx.controller")
public class WebConfig extends WebMvcConfigurerAdapter {
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler(new String[] { "/resources/**" }).addResourceLocations(new String[] { "/resources/" }).setCachePeriod(360000);
	}
	
	@Override
	public void configureDefaultServletHandling(
			DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}
	@Bean
	public ServletContextAttributeExporter servletContextAttributeExporter(){
		ServletContextAttributeExporter exporter =new ServletContextAttributeExporter();
		Map<String, Object> attributes = new HashMap<String, Object>();
		attributes.put("version", new SimpleDateFormat("yyMMddHHmmss").format(new Date()));
		exporter.setAttributes(attributes);
		return exporter;
	}
	@Bean
	public MultipartResolver multipartResolver() {
		CommonsMultipartResolver resolver = new CommonsMultipartResolver();
		// resolver.setMaxUploadSize(102400);
		return resolver;
	}
	@Bean
	public ViewResolver resourceBundleViewResolver(){
		ResourceBundleViewResolver resolver = new ResourceBundleViewResolver();
		resolver.setBasename("views");
		resolver.setOrder(1);
		return resolver;
	}
	
	@Bean
	public ViewResolver interalResourceViewResolver(){
		InternalResourceViewResolver resolver = new InternalResourceViewResolver();
		resolver.setViewClass(JstlView.class);
		resolver.setPrefix("/WEB-INF/views/");
		resolver.setSuffix(".jsp");
		resolver.setOrder(2);
		return resolver;
	}
	
	@Bean
	public MessageSource messageSource(){
		ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
		messageSource.setBasenames("classpath:messages/messages", "classpath:messages/validation");
		// if true, the key of the message will be displayed if the key is not
		// found, instead of throwing a NoSuchMessageException
		messageSource.setUseCodeAsDefaultMessage(true);
		messageSource.setDefaultEncoding("UTF-8");
		// # -1 : never reload, 0 always reload
		messageSource.setCacheSeconds(0);
		return messageSource();

		
	}
	
	@Bean
	public LocaleResolver localeResolver(){
		CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
		cookieLocaleResolver.setDefaultLocale(org.springframework.util.StringUtils.parseLocaleString("en"));
		return cookieLocaleResolver;
	}
	
}

#WebInitializer class緩存

import java.util.EnumSet;
import java.util.Set;

import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.SessionTrackingMode;

import org.springframework.core.env.PropertyResolver;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.DispatcherServlet;

public class WebInitializer implements WebApplicationInitializer {
	private PropertyResolver properties;
	public void onStartup(ServletContext servletContext) throws ServletException {
		servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));
		addRootContext(servletContext);
		addWebContext(servletContext);
		addFilters(servletContext);
	}
	
	private void addFilters(ServletContext servletContext) {
		FilterRegistration.Dynamic springSecurityFilterChain = servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy());
		springSecurityFilterChain.addMappingForUrlPatterns(null, false, "/*");
		FilterRegistration.Dynamic httpMethodFilter = servletContext.addFilter("httpMethodFilter", new HiddenHttpMethodFilter());
		httpMethodFilter.addMappingForUrlPatterns(null, false, "/*");
	}
	
	public void addRootContext(ServletContext servletContext){
		AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
		String profile = properties.getProperty("spring.profile", "default");
		rootContext.getEnvironment().setActiveProfiles(profile);
		rootContext.refresh();
		servletContext.addListener(new ContextLoaderListener(rootContext));
		servletContext.setInitParameter("defaultHtmlEscape", "true");
	}
	
	public void addWebContext(ServletContext servletContext) {
		AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext();
		mvcContext.register(WebConfig.class);
		ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(mvcContext));
		dispatcher.setLoadOnStartup(1);
		Set<String> mappingConflicts = dispatcher.addMapping("/");
		if (!mappingConflicts.isEmpty()) {
			throw new IllegalStateException("'dispatcher' cannot be mapped to '/' under Tomcat versions <= 7.0.14");
		}
	}

}
相關文章
相關標籤/搜索