您的位置:首页 > 编程语言 > Java开发

struts2中的Action

2015-08-01 13:11 555 查看
  Action的定义

  Action的生命周期

  Action的五大元素

  Action的定义

  传统的MVC框架中,Control层一般都是一个类似与Servlet的一个Java对象。因为从职责上讲,Control层需要完成以下的职责:

  1. 接收从Web容器传递过来的参数,并做恰当的类型转化

  2. 调用逻辑处理

  3. 搜集数据,并返回到视图

  而在这个其中的第一步和第三步,都离不开Web容器中的对象的处理。

  Struts2中的Action,与其他传统的MVC框架不同,使用了XWork的Action来构造Control层。让我们首先来看看Action的接口定义:

  Java代码



  /**

  * All actions may implement this interface, which exposes

  * the execute() method. However, as of XWork 1.1, this is

  * not required and is only here to assist users. You are

  * free to create POJOs that honor the same contract

  * defined by this interface without actually implementing

  * the interface.

  */

  public interface Action {

  /**

  * Where the logic of the action is executed.

  *

  * @return a string representing the logical result of the execution.

  *     See constants in this interface for a list of standard result values.

  * @throws Exception thrown if a system level exception occurs.

  *          Application level exceptions should be handled by returning

  *          an error value, such as Action.ERROR.

  */

  public String execute() throws Exception;

  }

  我们只需要实现这个接口,就可以在其中编写业务逻辑完成我们的功能。

  Java代码



  public class Index implements Action {

  private static final long serialVersionUID = -1070481751569420550L;

  /* (non-Javadoc)

  * @see com.opensymphony.xwork2.Action#execute()

  */

  public String execute() throws Exception {

  // write your logic here

  return SUCCESS;

  }

  }

  在这个接口定义中,我们可以明显看到与传统的MVC框架之间的区别:Struts2中的Action,并不需要依赖于特定的Web容器。我们看不到类似HttpServletRequest,HttpServletResponse等Web容器相关的对象。

  而这一点,也带来了问题:

  提问:Struts2的Action并不带有任何Web容器相关的对象,Action又是如何工作在Web容器中的呢?

  虽然Struts2的Action只是一个非常普通的Java对象,并不具备任何Web容器的特质,但是我们需要把Action放到一个更加大的环境中来看。事实上,Struts2为Action的执行,准备了完整的数据环境和执行环境。而这个执行环境,就保证了Action在Web容器中的顺利运行。

  在Struts2中,每个Http的请求,会被发送到一个Filter。而这个Filter,就会针对每个请求,创建出一个代码的执行环境,并在这个基础上,为每个执行环境配备与之对应的数据环境,这个数据环境中的内容,就来自于Web容器中的一个又一个对象。这样,就能够顺利调用Action执行代码而无需担心它是否运行在Web容器中了。

  至于这个执行环境和数据环境到底是什么,我们接下来会详细讲到。

  提问:Struts2的Action并不带有任何Web容器相关的对象,Action中又如何与Web容器进行通信并获取Web容器的相关对象呢?

  刚刚我们提到Struts2会为每个Http的请求建立一个执行环境和数据环境。其中,数据环境就成为了Action获取Web容器的基础。所以,当Action需要获取Web容器的相关对象,需要通过数据环境来进行。

  Struts2的Action的这一个重要特性,至少能为我们带来以下好处:

  1. 使得Struts2的Action非常易于测试

  如果我们完全不考虑Action的执行环境,仅仅把Action看作一个普通的Java对象,那么我们甚至可以直接new一个Action的对象,通过执行其中的方法完成测试。这样,我们就不需要任何的Mock,来模拟Web容器的环境。

  2. 结合Action的执行环境,使得Struts2在Control这个层次上,能够定义更加丰富的执行层次

  因为Action是一个普通的Java类,而不是一个Servlet类,完全脱离于Web容器,所以我们就能够更加方便地对Control层进行合理的层次设计,从而抽象出许多公共的逻辑,并将这些逻辑脱离出Action对象本身。事实上,Struts2也正是这么做的,无论是Interceptor,还是Result,其实都是抽象出了Action中公共的逻辑部分,将他们放到了Action的外面,从而更加简化了Action的开发。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: