Struts2-关于struts.xml文件的package配置的说明

一个较为完整的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页)。

package元素属性
属性是否必要说明
name被其他包引用时的键
extend指定要扩展的包
namespace指定命名空间
abstract声明为抽象包
1、name属性和extend属性:
name属性是包的必要属性(相当于id),指定了包的名字,这个包的名字将作为其他包引用这个包的key,必须唯一。
<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。通过包的继承,优化了代码的重复性,提高了代码的重用性,降低了代码的维护量。
在项目中,一般自定义的包(父包,没有继承别的自定义的包)都是继承"struts-default"包,因为Struts2框架已经为我们提供了大量的拦截器(后面的章节会说明),通过继承该包即可享受该包下定义的拦截器带来的好处。"struts-default"包在struts2-core-2.3.15.1.jar下的struts-default.xml文件中。

2、namespace属性:
package元素的namespace属性可以将包中的action配置为不同的命名空间,这样在不同的命名空间可以存在相同的action,可以达到窄化URL映射的效果。当Struts2接收到一个请求时,它会将URL和namespace/action组成的action完整路径进行比较,如果找到,则将请求交由namespace下的该action进行处理;没有找到,则Struts2会在默认的命名空间中查找;仍然没有找到则会报错误。
当在package中没有声明namespace属性,则该package的命名空间为默认的命名空间,默认(相同)的命名空间中不允许存在相同的两个及以上action。如下面的代码中因为两个package的命名空间都是默认的命名空间,将会报错:
<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 执行了...


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值