一个较为完整的action定义:
<struts>
<package name="default" extends="struts-default">
<action name="test" class="com.struts2.action.TestAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
private static final long serialVersionUID = 1L;
@Override
public String execute() throws Exception {
System.out.println(TestAction.class.getName() + " 执行了...");
return SUCCESS;
}
}
一、包(package):
Struts2的包类似于Java中的包,包提供了将action、result、result类型、拦截器和拦截器栈组织成为一个逻辑单元的一种方式。与Java不同的是,Struts2中的包可以扩展另外的包(类似于类的继承),从而“继承”原有包所有定义,包括action、result、result类型、拦截器和拦截器栈的配置(引用来自《struts2深入详解》的78页)。
属性 | 是否必要 | 说明 |
---|---|---|
name | 是 | 被其他包引用时的键 |
extend | 否 | 指定要扩展的包 |
namespace | 否 | 指定命名空间 |
abstract | 否 | 声明为抽象包 |
<package name="aaa" extends="struts-default">
<action name="test" class="com.struts2.action.TestAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
<package name="bbb" extends="aaa"></package>
在上述的代码中,name为"bbb"的包继承(extend)name为"aaa"的包,包"bbb"通过继承,即可拥有包"aaa"的action。通过包的继承,优化了代码的重复性,提高了代码的重用性,降低了代码的维护量。
<package name="aaa" extends="struts-default">
<action name="test" class="com.struts2.action.TestAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
<package name="bbb" extends="aaa">
<action name="test" class="com.struts2.action.TestAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
Struts2中存在一个比较特殊的命名空间,根空间即namespace="/",如果请求web应用的上下文路径下的action,那么框架会在根命名空间中查找相应的action,和其他命名空间一样,如果在根路径中找不到请求的action,Struts2框架会去默认的命名空间中查找。
示例:
<package name="aaa" namespace="/aaa" extends="struts-default">
<action name="test" class="com.struts2.action.AAAAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
<package name="bbb" namespace="/bbb" extends="struts-default">
<action name="test" class="com.struts2.action.BBBAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
<package name="/" namespace="/" extends="struts-default">
<action name="test" class="com.struts2.action.RootAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
<package name="default" extends="struts-default">
<action name="test" class="com.struts2.action.DefaultAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
上述struts.xml文件中的AAAAction,BBBAction,RootAction,都是由TestAction修改而来的,除了类名不一样外,其余的都一样。
假设访问localhost/struts2_test01/aaa/test.action,将在控制台打印出:com.struts2.action.AAAAction 执行了...
假设访问localhost/struts2_test01/bbb/test.action,将在控制台打印出:com.struts2.action.DefaultAction 执行了...
假设访问localhost/struts2_test01/test.action,将在控制台打印出:com.struts2.action.RootAction 执行了...
假设访问localhost/struts2_test01/abc/test.action,将在控制台打印出:com.struts2.action.DefaultAction执行了...
3、abstract属性:
如果包声明为abstract(即abstract="true"),在包中就无法定义action(即使定义了,也无法进行请求访问),它只能作为“父”包被其他包所继承,"struts-default"包就是一个抽象包。如:
<package name="aaa" namespace="/aaa" extends="struts-default" abstract="true">
<action name="test" class="com.struts2.action.AAAAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
<package name="default" extends="struts-default">
<action name="test" class="com.struts2.action.DefaultAction" method="execute">
<result name="success">/index.jsp</result>
</action>
</package>
假设访问localhost/struts2_test01/aaa/test.action,将在控制台打印出:com.struts2.action.DefaultAction 执行了...