Spring MVC

来源:互联网 发布:日本美国动画 知乎 编辑:程序博客网 时间:2024/06/10 16:06

Spring MVC是Spring框架中用于Web应用快速开发的一个模块,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。个人目前用的是spring-framework-4.1.6。
英文文档:docs→spring-framework-reference→pdf→PartV.The Web→Web MVC framework
Web MVC framework 也俗称Spring MVC
中文文档自行下载 spring-mvc4.2.4.RELEASE中文API.pdf


Spring MVC遵循开闭原则,贯穿整个spring-web框架(甚至整个Spring框架)的一个重要设计原则:对扩展开发,对修改关闭,即OCP,
The open-closed principle。之所以提到这个设计原则,是因为Spring MVC 核心类库的许多方法都被定义为final方法,就无法通过override来改变。


MVC框架要做的事情:

  1. 将URL映射到java的类或者java类的方法中
  2. 封装用户已经提交的数据
  3. 处理请求——调用相关的业务处理——封装响应的数据
  4. 将响应的数据进行渲染,如jsp,html,freeMarker等
    Struts2将2和3交给属性(get/set)去处理,不用管,IOC依赖注入实现了,即在action 里面定义要接收的参数,并提供相应的setter,getter,和提交参数的名称一致,并不用做数据类型的转换,响应的数据也用此方式封装在属性中,存放在Action Container的值栈中,如下图。只需要实现1和4。
public class TestAction extends ActionSupport{       private String username;     private String password;     public String getUsername() {      return username;     }     public void setUsername(String username) {      this.username = username;     }     public String getPassword() {      return password;     }     public void setPassword(String password) {      this.password = password;     } } 

freeMarker是一个用纯java编写的一个模块引擎,一个基于模板生成文本输出的通用工具,被设计用来生成HTML Web页面,特别是基于MVC模板的应用程序。虽然freeMarker具有一些编程的能力,但是通常有java程序准备要显示的数据,由freeMarker生成页面,通过模板显示准备的数据。如下图:
这里写图片描述
freemarker不是一个web应用框架,而是适合作为web应用框架的一个组件,freemarker与容器无关,因为它并不知道是HTTP或者Servlet,也可用于非Web环境。FreeMarker更适合作为Modle2(MVC模式)的视图组件,也可以在模板中使用JSTL(JSP标准标签库),还可以通过Eclispe插件编辑FreeMarker,目前FreeMarker最好的Eclipse编辑插件是JBoss Tools。


Spring MVC是一个轻量级的框架,是基于请求响应的MVC框架,这种框架有很多,如Struts1,Struts2,Spring MVC等,这些都是请求一个URL来映射到一个地方。


轻量级框架的好处:

  1. 没有侵入性的API(代码中不用继承此框架的类或者提供的接口)
  2. 对容器没有依赖性(依赖小,也就是你想换一个框架了随时换,复杂度不高,如重量级开EJB就是依赖性高,加入你的应用使用的是EJB 然后你想换个框架 不用EJB了 你就会觉得痛苦无比……因为大量的代码包含EJB特定的东西 你不得不重构它们)
  3. 易于配置,易通用,启动时间短

轻量级框架侧重于减小开发的复杂度,相应的它的处理能力便有所减弱(如事务功能弱、不具备分布式处理能力),比较适用于开发中小型企业应用。而作为重量级框架EJB框架则强调高可伸缩性,适合与开发大型企业应用。


为什么学习Spring MVC

  1. 性能比Struts2好(Struts2是开发效率高,但是性能低,Spring MVC是基于方法的设计,而Struts2是基于类的设计,Struts2每次发送请求都会创建一个ActionContainer,也可以说是ActionContext,即Action上下文,包含一次请求的所有信息,所以性能较之低)
  2. 简单,便捷,易学
  3. 天生与Spring无缝集成(本身就是Spring的后续产品,使用Spring的核心IOC,aop无缝集成)
  4. 能够进行简单的junit测试
  5. 支持restful风格
  6. 异常处理
  7. 本地化,国际化
  8. 数据验证,类型转换等
  9. 拦截器
  10. 最重要的原因——使用的人多,或者使用的公司多
  11. 使用约定优于配置(也称按约定编程,一种软件设计范式,本质来说,就是开发人员仅需要规定应用中不符约定的部分,例如,模型中有个妹为sale的类,那么数据库对于表就会默认为sale。只有偏离这个约定,如将命名为products_sale时,才需要写相关配置,使用按约定编程,可以减少很多配置,是代码简洁又不失灵活)

Struts2是线程安全的,但是Struts1不是线程安全的
如上文1所叙,因为每次都会新创,所以是线程安全的,默认是多例的,但是Struts1是单例的,当第一次请求会new一个放到缓存中,后面请求这个的时候还是会找原来创建好的,不会重新创建,默认单例,所以存在线程不安全问题,顺便提到Servlet也是单例的,只实例化一次。在单例模式上,要想解决线程安全问题,需要在关键部分加synchronized.


struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入
struts2实际上是通过setter getter方法与request打交道的
struts2中,一个Action对象对应一个request上下文

spring mvc不同,spring mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去
在spring mvc中,一个方法对应一个request上下文

所以 说spring mvc是基于方法的设计,Struts2是基于类的设计


在Spring IOC管理中,每次bean定义只生成一个对象实例,要保证每次getBean请求获得的都是此实例,所以要保证单例(scope)

原创粉丝点击