Struts1.2与Struts2.0

来源:互联网 发布:中央电视10套网络直 编辑:程序博客网 时间:2024/05/25 01:36

1.谈谈你对MVC的理解

MVC是一种设计模式,它强制的将应用程序的输入、处理、和输出分开。

使用了MVC的应用程序被分为3个核心部件:试图(View)、模型(Model)、控制器(Controller)。它们各司其职,既分工明确又相互合作

2.项目为什么使用SSH

         使用Struts:因为Struts是基于MVC模式的,很好的将应用程序进行了分层,使开发者更关注与业务逻辑的实现。并且Struts有着丰富的taglib,如果能够灵活运用,则能大大的提高开发效率。

         使用Hibernate:因为Hibernate为Java应用提供了一个易用的、高效率的对象关系映射框架。Hibernate是一个轻量级的持久性框架、功能丰富。

         使用Spring: 因为Spring基于IOC(inversion   of  control)和AOP构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块。采用IOC使得可以很容易的实现bean的装配,提供了简洁的AOP,并据此实现了事务管理(Transcation  Management),等等。

   相关链接:http://zhongshiyu.blog.163.com/blog/static/213653231201321410197971/

3.Struts1.2和Struts2.0的工作原理

   struts 1.2 工作原理:

   1.ActionServlet核心控制器会拦截所有*.do的请求

   2.从struts-config.xml中找到用户请求的Action

  3.通过struts-config.xml中的配置再去找这个Action对应的ActionForm,并实例化

  4.把用户填写的数据自动填充到ActionForm中(调用ActionForm中的setXX()方法填充)

   5.同时把ActionForm放入到指定的范围中(request,session)

   6.然后把请求转发给Action

   7.Action获取ActionForm中的值然后调用业务逻辑层实现功能

   8.在通过ActionMapping查找Actionforward实现转发; 流程如下:

  struts 2.0的工作原理:

    1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

  2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMeshPlugin);

  3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;

  4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

  5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;

  6、ActionProxy创建一个ActionInvocation的实例。

  7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

  8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。

  相关链接:http://www.24xuexi.com/w/2011-07-06/94529.html

4.Struts1.2和Struts2.0区别

   简要例举下他们之间的区别和改进。

/**Action类

Struts1要求Action类继承一个抽象类,Struts1使用抽象类编程而不是接口

Struts2可以实现Action接口也可以不实现,Struts2提供一个ActionSuport基类去实现常用接口。Action接口不是必须的,任何有execute的标识的

POJO都有可能成为struts2的Action的对象

 

/**线程模式

Struts1的Action是单例模式并且是线程安全的,仅有Action一个实例来处理所有请求。单策略模式限制了Struts1Action能做的事。比且在开发时要

注意Action资源必须是线程安全比且是同步的。

Struts2的Action对象为每个请求产生一个实例,因此没有线程安全问题。

 

/**Servlet依赖

Struts1Action依赖与ServletAPI,因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execute方法。

Struts2Action不依赖与容器,允许Action脱离容器被单独测试。如果需要,struts2依然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServletRequest和HttpServletResponse的必要性。

 

/**可测性:

测试Struts1Action的一个主要问题是execute方法暴漏了Servlet API(这使得测试要依赖于容器)。一个第三方扩展--StrutsTestCase--提供了一套Struts1的模拟对象(来进行测试)

struts2Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

 

/**捕获输入:

struts1使用ActionForm对象捕获输入。所有ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的基类不或输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有沉余的JavaBean)。

Struts2直接使用Acrtion属性作为输入属性,消除了对第二个输入对象的请求。输入属性可能是有自己(子)属性的Rich对象类型。Action属性能过通过web页面上的Taglibs访问。struts2也支持ActionForm模式。Richard对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven特性简化了Taglib对POJO输入对象的引用。

 

/**表达式语言

Struts1整合了JSTL,因此使用JSTLEL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很脆弱。

Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--“objectgraph Notation Language”(OGNL)

 

/**绑定值到页面(view)

Struts1使用标准JSP机制吧对象绑定到页面中来访问。

struts2使用ValueStack技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重同页面(view)

 

/**类型转换

Struts1ActionForm属性通常都是String类型。struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的

struts2使用OGNL进行类型转换,提供基本和常用对象的转换器。

 

/**效验

Struts1支持在ActionForm的validate方法中手动效验,或者通过CommonsValidator的扩展来效验。同一个类可以有不同的效验内容,但不能效验子对象。

Struts2支持通过validate方法和XWork效验框架进行效验。XWork效验框架使用为属性类类型定义的效验和内容效验,来支持Chain效验子属性。

 

/**Action执行的控制

Struts1支持每一个模块有单独的RequestProcessors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

struts2支持通过拦截器堆栈(InterceptorStacks)为每一个Action创建不能的生命周期。堆栈能够根据需要和不同的Action一起使用。

  相关链接:http://wenda.so.com/q/1366081437060432

5.Action是单实例还是多实例

  struts2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了;

  struts1的Action是单实例的,因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的。

    相关链接:http://blog.csdn.net/jobjava/article/details/8645854

6.谈谈你对Struts2.0的理解

Struts2的控制器由两部分组成:核心控制器FilterDispatcher和业务控制器Action

  相关链接:http://blog.sina.com.cn/s/blog_4cf58c9c010190h7.html

7.Struts2国际化实现过程

    相关链接:http://blog.sina.com.cn/s/blog_6608320c0100j3v8.html

8.Struts2页面开发中常用标签使用说明

  相关链接:http://zhidao.baidu.com/question/443211184.html

9.struts组件介绍 

基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件

  相关链接:http://greenyouyou.blog.163.com/blog/static/1383881472011365630540/

10.SpringMVC和Struts2的区别

1. 机制:springmvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这样就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。

2.性能:spring会稍微比struts快。springmvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用settergetter方法把request中的数据注入;struts2实际上是通过settergetter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。

3.参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。

4.设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。

5.intercepter的实现机制:struts有以自己的interceptor机制,springmvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,springmvc使用更加简洁,开发效率Spring MVC确实比struts2高。springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文;实现restfulurl要费劲,因为struts2action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3mvc的方法之间基本上独立的,独享requestresponse数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。

6. 另外,spring3mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。

  相关链接:http://blog.csdn.net/ya2dan/article/details/7395458

0 0
原创粉丝点击