文档章节

springmvc 零配置文件 记录001 --初始化

jeffsui
 jeffsui
发布于 2015/11/24 11:28
字数 748
阅读 356
收藏 7

最近工作需要用到springmvc4,很久没用spring了变化还是很大,记录下搭建一个基于annotation的零配置文件的spring、springmvc、jpa、bootstrap的简单框架。

开发环境

  • 开发工具: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.0

Servlet3.0规范,支持将web.xml相关配置也硬编码到代码中[servlet,filter,listener,等等],并由javax.servlet.ServletContainerInitializer的实现类负责在容器启动时进行加载, spring提供了一个实现类org.springframework.web.SpringServletContainerInitializer, 该类会调用所有org.springframework.web.WebApplicationInitializer的实现类的onStartup(ServletContext servletContext)方法,将相关的组件注册到服务器;

spring同时提供了一些WebApplicationInitializer的实现类供我们继承,以简化相关的配置,比如: org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer : 注册spring DispatcherServlet org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer : 注册springSecurity

同时,spring也提供了一些@Configuration的支持类供我们继承,以简化相关@Configuration的配置,比如: org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport : 封装了springmvc相关组件,我们可以通过注册新的@Bean和@Override相关方法,以实现对各个组件的注册; org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter : 封装类springsecurity相关组件

#WebConfig class


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");
		}
	}

}

© 著作权归作者所有

jeffsui

jeffsui

粉丝 293
博文 267
码字总数 73964
作品 0
大连
QA/测试工程师
私信 提问
加载中

评论(2)

jeffsui
jeffsui 博主

引用来自“zonghua”的评论

hibernate懒加载json死循环怎么办
lazy load ? 数据量有多大? 你监控jvm了吗
啦啦啦拉拉
啦啦啦拉拉
hibernate懒加载json死循环怎么办
高性能 RESTful 框架 - EasyRest-NAS

EasyRest-NAS English doc EasyRest 与 Netty, Akka 和 Spring 的整合. 这是一个为快速开发而设计的高性能RESTful框架,极易搭建集群和使用分布式。你可以完全专注在你的业务逻辑上。 不需要...

Louie_L
2018/05/02
1K
1
spring MVC工作机制与设计模式-读后小结(一)

昨天买了本淘宝大牛写的书-《深入分析java web 技术内幕》,从今天开始,记录下自己的总结。 由于本人是使用spring MVC开发的,所有就先看了下spring MVC 工作机制与设计模式这章,感觉看了之...

bosscheng
2013/05/09
3.8K
1
SpringBoot基础篇配置信息之多环境配置信息

更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 前面一篇主要介绍的是如何获取配置信息,接下来则是另外一个非常非常基础和必要的知识点了,应用如何根据不同的环境来选择对应的配置,即配...

小灰灰Blog
2018/10/14
155
0
spring boot(8)默认日志logback配置

1 日志简介 Spring Boot使用Commons Logging记录所有内部日志,但是它将底层日志实现打开,为Java.Util.Logging,Log4J2和Logback提供默认配置。 在每个案例中,loggers都预先配置,以使用控...

刘胜球
2017/10/31
513
0
Spring Cloud Alibaba迁移指南(二):零代码替换 Eureka

自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后,我们开始制作《Spring Cloud Alibaba迁移指南》系列文章,向开发者提供更多的技术选型方案,并降低迁移过程中的技术难度。 ...

中间件小哥
02/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

射频特征阻抗

Characteris Impendance(特性阻抗,也称为‘特征阻抗’)是我们经常看到并使用自己的术语之一,但非常模糊且难以解释。以下是来自几个不同来源的Characteris Impendance(特性阻抗)的一些定义。...

demyar
15分钟前
1
0
Spring Boot Tomcat配置项

参数配置容器 server.xx开头的是所有servlet容器通用的配置,server.tomcat.xx开头的是tomcat特有的参数,其它类似。 所有参数绑定配置类:org.springframework.boot.autoconfigure.web.Serv...

xiaomin0322
19分钟前
2
0
微课程 | 第二课《Docker 安装方式介绍》

微课程 | 第二课《Docker 安装方式介绍》视频 https://v.youku.com/v_show/id_XNDQ0NDUzNjkxNg==.html?spm=a2hzp.8244740.0.0 上一期我们介绍了 DBLE 的基本概况,下面进入我们的正题,正题基...

爱可生
19分钟前
2
0
GUAVA--基础工具(Preconditions)

1、前置条件 俗话说丑话讲在前面,在做某些事情的时候是需要做一些前置条件的。假如需要修改一条数据的话,当参数传进来,我们要先查询这条数据是否存在。这时候就需要一个if了,如果参数还需...

MrYuZixian
33分钟前
6
0
PythonSpot 中文系列教程 · 翻译完成

原文:PythonSpot Python Tutorials 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 在线阅读 ApacheCN 学习资源 目录 PythonSpot 中文系列教...

ApacheCN_飞龙
41分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部