Struts1是采用单例模式的,在并发访问中出来资源混乱,于是出现Struts2被设计为多例的解决并发产生的 
数据混乱
由于Struts2引入了值栈,拦截器,OGNL等,,,是访问速度下降
在原生的JSP中无需构建多余架构所以访问效率最高!
SpringMVC出现解决了访问速度问题,仅次于JSP的访问速度	
SpringMVC初始化:
	1、HttpServletBean调用init方法初始化参数,创建BeanWrapper对象
	2、创建WebApplicationContext对象。初始化Spring容器
	3、onRefresh方法加载配置文件
	4、初始化HandlerMappings HandlerAdapters  ViewResolvers等
MVC构成
	Control: HandlerMapping:负责映射用户的URL和处理类之间的联系
		HandleAdapters:处理URL的请求,真正执行我们的代码
	Model:ModelAndView是连接业务逻辑层和视图层的桥梁
	View:RequesrToViewNameTranslator/ViewResolver
	
1.修改web.xml-------服务器启动时先加载web.xml(框架的初始化)
	web.xml下访问节点的顺序  ---context-param -> listener(哪个在前面就执行那个) -> filter(
哪个在前面就执行那个) -> servlet
	
2、spring提供中文乱码问题 org.springframework.web.filter.CharacterEncodingFilter   
					implements Filter
			 <filter>  
				<filter-name>CharacterEncodingFilter</filter-name>  
				<filter-
class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
				<init-param>  
					<param-name>encoding</param-name>  
					<param-value>utf-8</param-value>  
				</init-param>
			</filter>  
			<filter-mapping>  
				<filter-name>CharacterEncodingFilter</filter-name>  
				<url-pattern>/*</url-pattern>  
			</filter-mapping> 
3、上下文的初始化
			  <listener>
				<listener-
class>org.springframework.web.context.ContextLoaderListener</listener-class>
			</listener>
4、声明应用范围内的上下文及参数,此时全部的访问都经过SpringMVC的DispatcherServlet
			<context-param>
				<param-name>contextConfigLocation</param-name>
				<!-- 放在/WEB-INF下面   数据库+spring配置文件 -->
				<param-value>
					/WEB-INF/applicationContext.xml,
					/WEB-INF/springmvc-servlet.xml
				</param-value>
			</context-param>
			
			
			
5、配置BeanNameUrlHandlerMapping   可用注解
			(1) 在spring 2.5之前的版本:使用
			 <bean 
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
			 <bean 
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
			 <bean id="viewResolver" 
class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
			(2) 在spring2.5之后出现注解: 什么是注解? 
				使用的 HandlerMapping, HandlerAdapter是
				<bean 
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping />
				<bean 
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
				<bean id="viewResolver" 
class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
			(3)在使用spring3.1开始的版本,
				使用的 HandlerMapping, HandlerAdapter是
				<bean 
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping />
				<bean 
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
				<bean id="viewResolver" 
class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
			 <!-- 配置为BeanNameUrlHandlerMapping -->
			<!-- <bean name="/hello" 
class="com.noannotation.TestNoAnnotation"></bean> -->
			
			<!-- 表示将请求的Url和bean名字映射,如url为"上下文/hello",则Spring配置
文件必须有一个名字为/hello的bean,上下文默认忽略 -->
			<!--<bean 
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />-->
			
			<!--  page 11 -->
			<!--<bean 
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />-->
			
			
6、ViewResolver
			<bean id="viewResolver" 
class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
				<!-- <property 
name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property> -->
				<property name="prefix" value="/WEB-INF/jsp/" />
				<property name="suffix" value=".jsp" />
			</bean>
			
7、开启注解
			<context:component-scan base-package="com.swsoft" /><!-- 扫描
com.swsoft文件下的所有注解 -->
			  <!-- 开启注解 -->     
			<mvc:annotation-driven  validator="validator" conversion-
service="conversion-service" /> 
			
			
8、验证框架配置
			 <!-- 下面配置主要用来验证ValidateController.java, 验证中有国际化 -->
			<bean id="validator" 
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
				<property name="providerClass"  
value="org.hibernate.validator.HibernateValidator"/>
				<!--不设置则默认为classpath下的 
ValidationMessages.properties--> 
				<property name="validationMessageSource" ref="messageSource"/>
			</bean>
			
			 <!-- 验证之后的错误数据定义在哪个文件里面 -->
			<bean id="messageSource" 
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
				<!--这两个都可以 classpath是在原包(src)的根目录--> 
				 <!--<property name="basename" 
value="classpath:resources/config/validatemessages"/>-->   
				<property name="basename" 
value="classpath::resources/config/validatemessages"/>           
				<property name="fileEncodings" value="utf-8"/>     
				<!--<property name="cacheSeconds" value="120"/>-->     
			</bean>
			
			
9、
	<!-- 数据转换(从jsp到后台(servlet)的convert spi, 从后台(servlet)到jsp页面的formatter 
spi(数据格式化)-->
    <bean id="conversion-service" 
class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
	
	
10、跳转页面
		return "redirect:/user/selectAll";   跳转到Controller中的selectAll
		return "forward:/user/selectAll";
		mv.setViewName("/usermanage/search");  跳转到页面/usermanage/search.jsp
		
11、传参
		public String update(String id,String name,String pwd){}  默认匹配页面name值
		
		public String deleteAll(@RequestParam("id")String[] ids){}  获得id转化为数组
		
		public ModelAndView login(HttpServletRequest request, HttpServletResponse 
response){}  传统的servlet传参
		
		public String insert(User user,MultipartFile uploadfile) throws Exception{}   
传自定义对象
		
12、上传文件
	配置springmvc-servlet.xml
		 <!-- 上传文件配置 -->
		<bean id="multipartResolver" 
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
			<property name="maxUploadSize" value="1048760"></property><!-- 10M -->
		</bean>
		
	表单设置:
		method="post" enctype="multipart/form-data"
		<input type="file" name="uploadfile"/>
		
	Controller接受File类型数据
		MultipartFile uploadfile接受
		FileUtils.writeByteArrayToFile(new File("C:\\" + format.format(date) + 
".jpg"), uploadfile.getBytes());上传文件
	
13、拦截器
	拦截器是AOP的一种实现,struts2 拦截器采用xwork2的interceptor!
	spring的AOP基于IoC基础,其底层采用动态代理与CGLIB代理两种方式结合的实现方式。
	常见应用场景
	1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
	2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
	3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始
时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录)
;
	4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如
提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
	5、OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。
public class MyInterceptor implements HandlerInterceptor {
		//最后执行
		public void afterCompletion(HttpServletRequest arg0,
				HttpServletResponse arg1, Object arg2, Exception arg3)
				throws Exception {
		}
		
		//当preHandle返回true时执行改方法
		public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
				Object arg2, ModelAndView arg3) throws Exception {
		}
		
		//在controller层方法执行前执行该方法,
		//当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执
行;
		//当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,
			如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方
法。
		public boolean preHandle(HttpServletRequest request, HttpServletResponse 
response,
				Object object) throws Exception {
			return false;
		}
	}
	
	
	多个拦截器执行顺序:
		<!-- 拦截器 -->
     <mvc:interceptors>
     	<mvc:interceptor>
     		<mvc:mapping path="/user/**"/>
     		<bean class="com.interceptor.MyInterceptor"></bean>
     	</mvc:interceptor>
     </mvc:interceptors>
     
     <mvc:interceptors>
     	<mvc:interceptor>
     		<mvc:mapping path="/user/**"/>
     		<bean class="com.interceptor.MyInterceptor2"></bean>
     	</mvc:interceptor>
     </mvc:interceptors>
     
     <mvc:interceptors>
     	<mvc:interceptor>
     		<mvc:mapping path="/user/**"/>
     		<bean class="com.interceptor.MyInterceptor1"></bean>
     	</mvc:interceptor>
     </mvc:interceptors>
	 
	执行结果:
						method:public 
org.springframework.web.servlet.ModelAndView com.controller.UserController.selectAll()
						preHandle
	执行所有的preHandle method:public org.springframework.web.servlet.ModelAndView 
com.controller.UserController.selectAll()
						preHandle2
						method:public 
org.springframework.web.servlet.ModelAndView com.controller.UserController.selectAll()
						preHandle1
						
	执行controller  	查询到的记录总数为:6
						postHandle1
	执行postHandle(栈)postHandle2
						postHandle
						
						afterCompletion1
	执行afterCompletion afterCompletion2
						afterCompletion
	
原文:http://www.cnblogs.com/huanglufei/p/5878297.html