strut1和strut2的区别

Struts1.X的工作流程

    对于采用Struts框架的Web应用,在Web应用启动(发布)时就会加载并初始化ActionServlet,ActionContext等内容。ActionServlet从struts- config.xml文件中读取配置信息,把它们存放到各种配置对象中,例如Action的映射信息存放在ActionMapping对象中。

  当ActionServlet接受到一个客户请求时(HttpRequest),将执行如下流程。

 (1)检查和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
 (2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据封装到ActionForm对象中。
 (3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。
 (4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。
 (5)ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。(当Action中需要写多个方法时,此Action必须继承一个DispatchAction,否者将只执行默认的Action的execute()方法)
 (6)Action的execute()方法返回一个ActionForward对象(return mapping.findForward();),ActinoServlet再把客户请求转发给ActionForward对象只想的JSP组件。
 (7)ActionForward对象指向的JSP组件生成动态网页,返回给客户。

   对于以上流程的流程(4),如果ActionForm的validate()方法返回一个或多个ActionMessage的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含用户提交表单的JSP组件( input="验证失败要转的页面")。再这种情况下,不会再创建Action对象并 调用Action的execute()方法。

Struts2的工作流程:
(1)客户端提交一个HttpServletRequest请求(.action或JSP页面)
(2)请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等
(3)FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器
(4)请求发到FilterDispatcher后,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个Request(一般根据URL后缀是否为.action来判断)
(5)如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求交到ActioProxy,由其进行处理.
(6)ActionProxy通过Configuration Manager(它会访问struts.xml)询问框架的配置文件,找到需要调用的Action类.
(7)ActionProxy创建一个ActionInvocation实例,而ActionInvocation通过代理模式调用Action,(在调用之前会根据配置文件加载相关的所有Interceptor拦截器)
(8)Action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Interceptor拦截器.
(9) 最后ActionInvocation负责根据struts.xml中配置的result元素,找到与返回值对应的result,决定进行下一步输出.

二、struts1.X与struts2的区别。
1.都是MVC的WEB框架,
2 struts1的老牌框架,应用很广泛,有很好的群众基础,使用它开发风险很小,成本更低!struts2虽然基于这个框架,但是应用群众并多,相对不成熟,未知的风险和变化很多,开发人员相对不好招,使用它开发项目的风险系数更大,用人成本更高!
3.struts2毕竟是站在前辈的基础设计出来,它会改善和完善struts1中的一些缺陷,struts1中一些悬而未决问题在struts2得到了解决。
4.struts1的前端控制器是一个Servlet,名称为ActionServlet,struts2的前端控制器是一个filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter。
5.struts1的action需要继承Action类,struts2的action可以不继承任何类;struts1对同一个路径的所有请求共享一个Action实例,struts2对同一个路径的每个请求分别使用一个独立Action实例对象,所有对于struts2的Action不用考虑线程安全问题。
6.在struts1中使用formbean封装请求参数,在struts2中直接使用action的属性来封装请求参数。
7.struts1中的多个业务方法放在一个Action中时(即继承DispatchAction时),要么都校验,要么都不校验;对于struts2,可以指定只对某个方法进行校验,当一个Action继承了ActionSupport且在这个类中只编写了validateXxx()方法,那么则只对Xxx()方法进行校验。

(一个请求来了的执行流程进行分析,struts2是自动支持分模块开发,并可以不同模块设置不同的url前缀,这是通过package的namespace来实现的;struts2是支持多种类型的视图;struts2的视图地址可以是动态的,即视图的名称是支持变量方式的,举例,论坛发帖失败后回来还要传递boardid。视图内容显示方面:它的标签用ognl,要el强大很多,在国际化方面支持分模块管理,两个模块用到同样的key,对应不同的消息;)

  
与Struts1不同,Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的。

给我印象最深刻的是:struts配置文件中的redirect视图的url不能接受参数,而struts2配置文件中的redirect视图可以接受参数。


三、扩展知识点(ActionContext)
   ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象,

比如:在使用WebWork时,我们的上下文放有请求的参数(Parameter)、会话(Session)、Servlet上下文(ServletContext)、本地化(Locale)信息等。

     在每次执行Action之前都会创建新的ActionContext,ActionContext是线程安全的,也就是说在同一个线程里ActionContext里的属性是唯一的,这样我的Action就可以在多线程中使用。

下面我们看看怎么通过ActionContext取得我们的HttpSession:

Map session = ActionContext.getContext().getSession();

原来我们取得的session却是Map类型的对象,这是为什么?原来,我们的WebWork框架将与Web相关的很多对象重新进行了包装,比如这里就将HttpSession对象重新包装成了一个Map对象,供我们的Action使用,而不用直接和底层的HttpSession打交道。也正是框架的包装,让我们的Actoion可以完全的和Web层解藕。

如果我们的Action需要直接与JavaServlet的HttpSession、HttpServletRequest等一些对象进行操作,我们又该如何处理?

请看下面的ServletActionContext。

ServletActionContext ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与JavaServlet相关对象访问的功能,

它可以取得的对象有:

1、javax.servlet.http.HttpServletRequest:HTTPservlet请求对象

2、javax.servlet.http.HttpServletResponse;:HTTPservlet相应对象

3、javax.servlet.ServletContext:Servlet 上下文信息

4、javax.servlet.ServletConfig:Servlet配置对象

5、javax.servlet.jsp.PageContext:

Http页面上下文 ServletActionContext除了提供了上面这些对象访问,它当然也继承了它父类ActionContex的很多功能,

比如:对OgnlValueStack、Action名字等的访问。

下面我们看看几个简单的例子,让我们了解如何从ServletActionContext里取得JavaServlet的相关对象:

1、取得HttpServletRequest对象:

HttpServletRequest request = ServletActionContext. getRequest();

2、取得HttpSession对象:

HttpSession session = ServletActionContext. getRequest().getSession(); ServletActionContext和ActionContext
 

struts工作流程详解:
1>启动struts框架,web.xml,创建ActionServlet对象,立即调用init(),解析struts-config.xml
2>view发送*.do请求
3>ActionServlet接受该请求,去掉.do后缀,在struts-config.xml文件中找<action>元素path属性.a>如果没有找到404错误;b>如果找到继续执行
4><action name="">判断是否需要表单封装页面数据.name属性值不为空则封装数据(创建ActionForm对象,根据scope属性值决定将form对象存储起来:request.setAttribute("",form);调用reset方法对数据进行初始化工作;封装数据(技术:a>vo值对象作为ActionForm对象的成员属性));
5>调用ActionErrors validate()方法进行表单数据验证:(<action>的vlidate属性:默认为true---会调用该方法;false---不会调用)
 1>验证通过:ActionErrors为null或者ActionErrors中没有存放错误消息
 2>验证不通过:ActionErrors有错误消息.将错误消息派发到 <action >元素的input属性指 定的jsp进行错误消息的输出:<html:errors/>   或者<html:errors key=""/>
6>验证通过,接下来根据<action>元素的type属性来创建Action对象,会立即调用Action对象的DispatchAction对象的execute方法.

你可能感兴趣的:(面试,struts2.0)