Struts2笔记三之Result
1、struts.xml中action返回值result
1)result类型:
a). dispatcher forward,这个跳转必须是页面,不能是action,服务器端跳转
b). redirect 重定向,这个跳转必须是页面,不能是action,客户端跳转
c). chain forward到一个action,服务器端跳转
d). redirectAction 重定向,客户端跳转到另一个action,客户端跳转
e). stream 下载
服务器端跳转:页面上显示的是action地址,因为用户根本就不知道后台已经将请求转移到另外一个页面,后台自动跳转到新的url地址,浏览器仅请求一次
客户端跳转:页面上显示的是一个新的页面地址,用户可以明显知道跳转到另一个页面去了,后台告诉浏览器去访问一个新的url地址,所以redirect发了两次请求
2、在一个package中可以定义一个<global-results>,这个package中任何一个action返回的result只要与其对应,都会跳到这个global-result中对应的页面去
这里可以定义一个声明式Exception,在Action方法上抛出意思,在global捕获该异常,只要有该异常就返回一个返回值如:
<global-exception-mappings>
<exception-mappings result="globalError" exception="java.lang.Exception"></exception-mappings>
</global-exception-mappings>
<global-results>
<result name="globalError">/error.jsp</result>
</global-results>
这个最好定义在一个公共的package中,并且在这个package中定义一下公共内容,让其他package去extends这个package最好。
3、动态页面
package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.edifier.struts2.user.action.UserAction">
<result>${r}</result><!-- 这里的${r}是访问值栈里的r,这个不是el表达式,而是struts.xml中专门用来访问值栈的表达式 -->
</action>
</package>
public class UserAction extends ActionSupport {
private int type;
private String r;//用来保存动态页面地址
public void setR(String r) {
this.r = r;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
}
当请求为localhost:8081/Struts2Demo/user/user?type=1时,最后跳转的页面是user_success.jsp
当请求为localhost:8081/Struts2Demo/user/user?type=2时,最后跳转的页面是user_error.jsp
4、在用redirect的时候,会丢失request中的值,所以会需要重新传递参数。
public class UserAction extends ActionSupport {
private int type;
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
return "success";
}
}
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.edifier.struts2.user.action.UserAction">
<result type="redirect">/user_success.jsp?t=${type}</result><!-- 这里将type换一个名字重新传递到页面上去 -->
</action>
</package>
页面要接收需要: from actioncontext: <s:property value="#parameters.t"/>
如果是两个action之间传参在例如:执行完action1之后要直接跳转到action2,并且action1要传一些参数给action2,在struts.xml文件中的配置如下:
<action name="action1" method="" class="">
<result name="success" type="chain">
<param name="actionName">action2</param>
<param name="param1">${param1}</param>
<param name="param2">${param2}</param>
</result>
</action>
注意:
1. 若param1和param2是两个变量,那么在两个action中都要有他们的getter和setter
2. 若param1是常量,那么在action1中只要有一个param1的getter,在action2中要有param1的getter和setter
如果在两个action之间直接跳转而不用传参数,struts.xml文件可以和上面一样,只是没有param标签,还可以使用如下配置:
<action name="action1" method="" class="">
<result name="success" type="redirectAction">action2.action</result>
</action>
即可