在【Struts2一】 Struts Hello World http://bit1129.iteye.com/blog/2109365中配置了一个简单的Action,配置如下
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="/simple" namespace="/simple" extends="struts-default">
<action name="helloworld" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success">/htmls/user.jsp</result>
</action>
</package>
</struts>
result转发的四个常用类型
action配置项的子元素result包含两个属性,name和type,name属性值匹配action处理的结果,type则表示action结果的跳转类型,包含四个基本值:
1. dispatcher 表示forward,即请求跳转,当不指定type属性时,默认值就是dispatcher。request从当前action跳转到另一个视图(可以是jsp,action或者velocity等)时保持不变,跳转对用户是透明的
2. type=redirect,重定向
2.1 重定向表示重新发起一个请求,用户可以看到浏览器URL发生变化,因为是两个不同的请求,因此,当前action所对应的request,与之后的request是完全独立的,后面的request不能共享当前action对应 的request的设置的属性值
2.2 Struts2支持当前的action传递一些参数给给后面的视图,例如
<result type="redirect">/pages/abc.jsp?userId=${user.id}</result>
它表示,转发到/pages/abc.jsp时,可以带一个请求参数userId,参数值是${user.id},它表示从当前action的user对象中取出id属性,action有getUser()方法,user对象有getId()方法,这是ognl表达式
3.type=redirectAction,重定向到某个Action
3.1 跳转到同包内的Action,使用如下配置
<result type="redirectAction">helloworld</result>
它表示跳转到当前action所在包(package)下的namespace为helloworld的action
3.2 其它包下面的Action,使用如下配置
<result type="redirectAction">
<param name="actionName">otherAction</param>
<param name="namespace">otherNamespace</param>
</result>
4.plainText 纯文本内容
plainText表示要跳转的view以纯文本的方式返回内容,使用如下配置,当访问当前action时,返回的是abc.jsp的原始内容,而不是把abc.jsp解析成html代码的内容
<result type="plainText">
<param name="location">abc.jsp</param>
<param name="charSet">UTF-8</param> <!--表示以UTF-8的编码读取abc.jsp,而不是使用系统默认的字符编码-->
</result>
例子
1. /htmls/user.jsp
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!--message定义在Action中,可以直接使用${message}-->
<!--message定义在URL的请求参数中,则使用${param.message}-->
Hello, ${message}
</body>
</html>
2. HelloWorldAction.java
package com.tom.actions;
public class HelloWorldAction {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String executeAction() {
setMessage("Welcome to the Struts2 world");
return "success";
}
}
3. struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="resultType" namespace="/resultType" extends="struts-default">
<action name="plainText" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success" type="plainText">/htmls/user.jsp</result>
<!--浏览器看到的响应结果是user.jsp原始内容包括<html>等标签-->
</action>
<action name="dispatcher" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success" type="dispatcher">/htmls/user.jsp</result>
<!--因为是跳转,request不变,所以user.jsp中${message}应该被替换掉-->
</action>
<action name="redirect1" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success" type="redirect">/htmls/user.jsp</result>
<!---浏览器地址兰完整显示了user.jsp的请求地址http://localhost:8688/web/htmls/user.jsp-->
<!--${message}显示为空字符串,也就是说,如果直接请求jsp,如果jsp中JSTL没有匹配值,则显示为空-->
</action>
<action name="redirect2" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success" type="redirect">/htmls/user.jsp?message=${message}</result>
<!--user.jsp使用${param.message}这个JSTL表达式来接收参数-->
</action>
<action name="redirectAction1" class="com.tom.actions.HelloWorldAction" method="executeAction">
<!--HelloWorldAction转发到dispatcher这个action-->
<!--dispatcher这个action因为是forward到/htmls/user.jsp,因此,user.jsp能够获得dispatcher action的请求数据-->
<!--浏览器看到的最终URL是dispatcher这个action的URL-->
<result name="success" type="redirectAction">dispatcher</result>
</action>
<action name="redirectAction2" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success" type="redirectAction">
<param name="actionName">otherAction</param>
<param name="namespace">otherNamespace</param>
</result>
</action>
</package>
<package name="other" namespace="/resultType/otherNamespace" extends="struts-default">
<!--redirectAction2要跳转到这里来,那么这个action的namespace必须以是redirectAction2所在namespace为前缀-->
<action name="otherAction">
<!--使用ActionSupport来返回user.jsp,因为ActionSupport没有定义message,所有user.jsp中的message显示为空-->
<result>/htmls/user.jsp</result>
</action>
</package>
</struts>
全局(package范围的)result
对于一个项目来说,有些result的配置是统一的,而不是局限于某个包中,比如<result name="error">error.jsp>/result>,这个result应该是整个项目通用,Struts提供了一个global result的设置,
<global-results>
<result name="error">error.jsp</result>
<result name="exception">exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Throwable" result="exception">
</exception-mapping>
</global-exception-mappings>
遗憾的是globlal-results和global-exception-mappings,只能定义在package级别,即它们只能定义为package的子元素,定义成package的子元素后,那么同一个struts.xml其他package下的action就不能使用这些项目级别的result配置,解决办法,是定义一个抽象基本包,在这个base包中防止这些项目级别的全局配置,那么让各个包继承自这个包即可
1. struts.xml配置
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="base" namespace="" extends="struts-default" abstract="true">
<global-results>
<result name="error">/htmls/error.jsp</result>
<result name="exception">/htmls/exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Throwable" result="exception">
</exception-mapping>
</global-exception-mappings>
</package>
<package name="resultType" namespace="/resultType" extends="base">
<action name="error" class="com.tom.actions.HelloWorldAction" method="errorCall">
<!--不需要指定<result type="error"></result>来响应HelloWorldAction的error,由全局的result配置响应-->
</action>
<action name="exception" class="com.tom.actions.HelloWorldAction" method="exceptionCall">
<!--不需要指定<result type="exception"></result>来响应HelloWorldAction的exception,由全局的result配置响应-->
</action>
</package>
</struts>
2. HelloWorldAction.java代码
package com.tom.actions;
public class HelloWorldAction {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String executeAction() {
setMessage("Welcome to the Struts2 world");
return "success";
}
public String errorCall() {
return "error";
}
public String exceptionCall() {
throw new NullPointerException("This is a NPE");
}
}
3.