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的开发。
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的开发。
相关文章推荐
- sublime text 3 编译运行java代码方法
- eclipse中is missing required source folder问题的解决
- java--逻辑运算 位运算
- java--注释方法
- Java-- 变量
- MyEclipse去除网上复制下来的来代码带有的行号
- 修改MyEclipse默认生成的Servlet以及JSP页面
- Java_Web三大框架之Hibernate+jsp+selvect+HQL登入验证
- 解决NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
- MyEclipse 2015优化技巧
- Java手机开发平台 Java ME
- spring入门初体验(4)----事务的传播行为和隔离级别
- java中的接口
- Java Socket编程
- JAVA中堆和栈的区别
- phonegap-环境搭建(1)
- Java日志框架——SLF4J
- Java垃圾回收工作原理
- java多态简单例子 one
- Java基础——IO流(二)