首先介绍一下namespace
Struts2的配置文件struts.xml当中有一个元素package ,这个元素有一个属性是 namespace。这个属性的作用是什么呢?
1. 确定该包内的action URL路径
例如:
Java代码
<package name="rodom" namespace="/templates" extends="struts-default">
<action name="testAction" class="test.web.TestAction">
<result>test.jsp </result>
</action>
</package>
假设应用contextpath名字为tianxia,应用服务器端口号为8080若在浏览器中访问
testAction此时URL的路径为 http://localhost:8080/tianxia/ templates/
testAction.action
在配置namespace时注意的是在templates名字前加“/”
2. 确定返回jsp或ftl等文件的物理路径
如上面的配置test.jsp需放在templates目录下struts才能够找到
若想访问应用根目录下的文件例如index.jsp则如下配置:
<result>/index.jsp </result>
接下来讨论一下 <result type=”chain”>的配置
当action结果调用另一个action时result的类型设置为chain,则表示被调用的action会保持调用action的属性值。
Type=“chain”时 result标签的参数可以有下面4个
• actionName
• namespace
• method
• skipActions
举个例子:
配置如下:
Java代码
<action name="fm" class="test.web.SimpleAction">
<result type="chain">
<param name="actionName">chaintest </param>
<param name="method">look </param>
</result>
</action>
<action name="chaintest" class="test.web.ChainAction">
<result type="freemarker">test.ftl </result>
</action>
<action name="fm" class="test.web.SimpleAction">
<result type="chain">
<param name="actionName">chaintest </param>
<param name="method">look </param>
</result>
</action>
<action name="chaintest" class="test.web.ChainAction">
<result type="freemarker">test.ftl </result>
</action>
Java代码
public class SimpleAction extends ActionSupport{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute()
{
message = "hello ";
}
}
public class SimpleAction extends ActionSupport{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute()
{
message = "hello ";
}
}
Java代码
public class ChainAction extends ActionSupport{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute()
{
message += " tianxia!";
System.out.println(message);
}
}
public class ChainAction extends ActionSupport{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute()
{
message += " tianxia!";
System.out.println(message);
}
}
当调用”fm”这个action返回SUCCESS时fm会调用test.web.ChainAction类的look()方法
控制台上会打印 hello tianxia!这说明SimpleAction的message被保存到ChainAction。
此处需要注意的是,
1.一个Action调用其它Action用chain的方式,调用者中的集合类中的元素依然会保存到被调用者执行。
2. <result type="chain"> chaintest! look </result>不能访问到test.web.ChainAction的look方法