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

SpringMVC笔记的更多相关文章

  1. SpringMVC笔记——SSM框架搭建简单实例

    落叶枫桥 博客园 首页 新随笔 联系 订阅 管理 SpringMVC笔记——SSM框架搭建简单实例 简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发 ...

  2. SpringMvc 笔记

    整理出来是 SpringMvc 笔记 方便以后查询 框架太多了 不经常使用 忘记的可能性很大 自己整理一套笔记 一看就明白了 1 对比 原始请求响应流程 1 发送请求 --> 2 控制层 --& ...

  3. 初学者的springmvc笔记02

    springmvc笔记 springmvc拦截器,spring类型转换,spring实现文件上传/下载 1.SpringMVC标准配置 导入jar包:core contaner 在web.xml文件中 ...

  4. 框架SpringMVC笔记系列 二 传值

    主题:SpringMVC(第一节中再回顾复习一次) 学习资料参考网址: 1.http://www.icoolxue.com 2.http://haohaoxuexi.iteye.com/blog/13 ...

  5. 框架SpringMVC笔记系列 一 基础

    主题:SpringMVC 学习资料参考网址: 1.http://www.icoolxue.com 2.http://aokunsang.iteye.com/blog/1279322 1.SpringM ...

  6. 传智springMVC笔记

    springmvc 第一天 springmvc的基础知识 课程安排: 第一天:springmvc的基础知识 什么是springmvc? springmvc框架原理(掌握) 前端控制器.处理器映射器.处 ...

  7. springmvc笔记(来自慕课网)

    1.准备工作:springmvc相关的jar包. 2.这里我们先用eclipse来操作. 首先看一个接口编程,后面的所有知识点都是通过这个接口编程引出的. OneInterface.java pack ...

  8. springmvc笔记(基本配置,核心文件,路径,参数,文件上传,json整合)

    首先导入jar包 大家注意一下我的springmvc,jackson,common-up的jar包版本.其他版本有可能出现不兼容. src文件: webroot目录: web.xml <?xml ...

  9. SpringMvc笔记-对RESTFUL风格的配置

    1.@RequestMapping注解可以使用如下参数: 1,params:例如params={'username',"age!=100"}表示需要usernmame并且age 属 ...

随机推荐

  1. linux 网卡问题 Device eth0 does not seem to be present,delaying initialization.

    Device eth0 does not seem to be present,delaying initialization. 网上搜索后才发现原因所在:原来vmware在复制了虚拟机后会自动生成一 ...

  2. Epson机械手4轴6轴示意图

    世界坐标系(World Coordinate System,简称WCS)是由三个垂直并相交的坐标轴X轴.Y轴和Z轴构成,一般显示在绘图区域的左下角,如图1-7所示.X轴和Y轴的交点就是坐标原点O,X轴 ...

  3. HDFS副本存放策略

    在client向DataNode写入block之前,会与NameNode有一次通信,由NameNode来选择指定数目的DataNode来存放副本.具体的副本选择策略在BlockPlacementPol ...

  4. WPS for Linux(ubuntu)字体配置(字体缺失解决办法)

    启动WPS for Linux后,出现提示"系统缺失字体" . 出现提示的原因是因为WPS for Linux没有自带windows的字体,只要在Linux系统中加载字体即可. 具 ...

  5. HTML中的select只读

    因为Select下拉框只支持disabled属性,不支持readOnly属性,而在提交时,disabled的控件,又是不提交值的.现提供以下几种解决方案: 1.在html中使用以下代码,在select ...

  6. c语言-四阶龙格-库塔法

    #include<stdio.h> #include<math.h> #define n 14 //double func1(double x, double y); doub ...

  7. 网卡故障:弹出界面eth0: 错误:没有找到合适的设备:没有找到可用于链接System eth0 的

    原文地址:http://www.mamicode.com/info-detail-112000.html 报错截图如下: 排错步骤如下: 1:查看系统是否识别相应网卡(发现没有eth0网卡存在): 根 ...

  8. Git忽略规则及.gitignore规则不生效的解决办法

    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规则例如: # 此为注 ...

  9. HTML 5 <script> 标签

    HTML 4.01 与 HTML 5 之间的差异 async 属性是 HTML 5 中的新属性. 在 HTML 5 中,不再支持 HTML 4.01 中的一些属性. 提示和注释 注释:脚本按照如下方式 ...

  10. c/c++面试题(7)零碎知识总结

    1.变量的声明和定义有什么区别? 声明:变量的声明做了两件事情 a.告诉编译器这个变量已经匹配到一块内存上了,下面的代码用到的变量或对象是在别处定义的. 声明可以出现很多次. b.告诉编译器这个变量名 ...