1、package元素
package用来管理action:使用了面向对象的思想
属性:
name:用来定义包名,注意:同一个配置文件中包名是唯一的。
extends:指定所继承的包,一般情况下需要继承struts-default包
truts-default.xml中定义着struts-default这个包。
truts-default.xml是在我们的struts.xml加载之前加载。
abstract:指定包是抽象的,只能被继承,含有action的包不能是抽象的,默认值是false。
namespace:名称空间
名称空间 + 动作名称 = 访问路径
<package name="p1" extends="struts-default" namespace="/a/b"></package>
struts2查找动作的方法:
1:先按照用户输入的路径查找路径: /a/b/c/d/action1.action
如果没有找到再向上一层路径找:/a/b/c 找到了(不会再继续向上找)该路径则执行第二步
再向上一层路径找:/a/b 找到了(不会再继续向上找)该路径则执行第二步,找不到继续向上一级找
再向上一层路径找:/a 没找到 找到了(不会再继续向上找)该路径则执行第二步
再找/ 也没有的话去默认命名空间下找。
都没找到直接报错
2:找action: 先在当前的命名空间下找 ,如果没有找到则取默认的命名空间(没有写namespace属性的)下找 ,如果还找不到报错
一般只要我们有默认命名空间的pakege标签时,第一步是不会报错的。
action元素
属性:
name:动作名称
class:动作类全名。默认的动作类是:com.opensymphony.xwork2.ActionSupport
是在struts-default.xml中定义的
method:动作类中的方法名称。默认是public String execute(){}
要求:
1.public的
2.返回值必须是String
3.没有参数
一般样式:
<action name="action1" class="com.qianfeng.web.action.TestAction1" method="test1">
<result name="success">/success.jsp</result>
</action>
那我们的动作类是怎么定义和实现的呢?
a.方式一:动作类就是一个POJO(Plain Old Java Object 原始的java对象)
然后定义方法,然后我们就可以这样访问了,需要规定动作类和方法名
<!-- 第一种创建动作类的配置 -->
<action name="action1" class="com.qianfeng.web.action.TestAction1" method="test1">
<result name="success">/success.jsp</result>
</action>
方式二:动作类实现com.opensymphony.xwork2.Action接口。
常量:给动作方法返回值用的。用常量可以使你的应用规范和统一。
在实现这个接口时,我们要重写execute()方法,这样我们访问时可以不说明method了
<!-- 第二种创建动作类的配置,因为默认执行execute()方法,所以省略 method -->
<action name="action2" class="com.qianfeng.web.action.TestAction2">
<result name="success">/success.jsp</result>
</action>
c.方式三:动作类继承com.opensymphony.xwork2.ActionSupport 推荐使用
这也是我们一般应用的方法,如果不重写execute()方法时,调用ActionSupport中默认的execute()方法
<!-- 第三种创建动作类的配置,默认执行execute()方法-->
<action name="action3" class="com.qianfeng.web.action.TestAction3">
<result name="success">/success.jsp</result>
</action>
动作的访问
a.使用通配符:
升级版:
优先级:绝对匹配优先。使用通配符的按照在配置文件中的先后顺序进行匹配的。
动态执行动作方法 :
动作名!动作方法名.action
动作名!动作方法名
<a href="${pageContext.request.contextPath }/user!addUser.action">添加用户</a>
<a href="${pageContext.request.contextPath }/user!updateUser.action">修改用户</a>
<a href="${pageContext.request.contextPath }/user!deleteUser.action">删除用户</a>
<a href="${pageContext.request.contextPath }/user!findUser.action">查找用户</a>
action