目录
1、struts2的result
2、result类型
3、chain、redirect、redirectaction的区别
4、Result关于param的理解
5、全局视图
6、自定义(扩展)result类型
1、struts2的result一个提交到服务器的处理通常可以分为两个阶段,第一个阶段查询服务状态(查询或者更新数据库),第二阶段选择一个合适的结果页面其返回给用户。
struts2提供了对不同种类返回结果的支持,常见的有JSP、FreeMarker、Velocity等。
struts2支持同的返回类型:
chain 用来处理Action链
dispatcher 用来转向页面,通常用来处理JSP(默认)
freemarker 处理FreeMarket模板
httpheader 用来控制特殊的Http行为
redirect 重定向到一个URL
redirectAction 重定向到一个Action
stream 向浏览器发送InputStream对象,通常用来处理文件下载。
velocity 处理Velocity模板
xslt 处理XML/XSLT模板
plaintext 显示原始文件内容,例如文件的源代码。
1)dispatcher:服务器跳转到页面,通常来处理JSP,默认类型。
2)redirect:重定向到页面。
public String redirect() {
message= "message中有值";
return"redirect";
}
struts.xml
<package name="chapter3"namespace="/chapter3" extends="struts-default">
<action name="redirectAction"
class="chapter3.action.Chapter3Action"method="redirect">
<result name="redirect"type="redirect">/redirect.jsp</result>
</action>
</package>
注意的地方:外部中转不能带值过去,并且页面不能受保护
传参数:
<action name="redirectAction"class="chapter3.action.Chapter3Action" method="redirect">
<result name="redirect"type="redirect">/redirect.jsp?message=${message}</result>
</action>
页面:
${param.message}<br>
3)chain类型
服务端(内部)跳转到其他的Action;
action:
public String action2() {
message = "action2中设置的值";
return "action2";
}
struts.xml
<package name="chapter32"namespace="/chapter32" extends="struts-default">
<action name="action2"class="chapter3.action.Chapter3Action"method="action2">
<result name="action2" type="chain">
<paramname="actionName">redirectAction</param>
<param name="namespace">/chapter3</param>
</result>
</action>
</package>
4)redirectAction:外部跳转到Action;
action:
public String action3() {
message = "action3中设置的值";
return "action3";
}
struts.xml
<action name="action3"class="chapter3.action.Chapter3Action"method="action3">
<result name="action3"type="redirectAction">redirectAction</result>
</action>
跨命名空间的外部跳转:
public String action4() {
message = "我是action4中设置的值";
return "action4";
}
struts.xml
<action name="action4"class="chapter3.action.Chapter3Action"method="action4">
<result name="action4"type="redirectAction">
<param name="actionName">redirectAction</param>
<param name="namespace">/chapter3</param>
</result>
</action>
Chain Result:
这个result调用另外的一个action,连接自己的拦截器栈和result。
actionName (默认) - 被调用的action的名字
namespace - 被调用的action的名称空间. 如果名称空间为空,这默认为当前名称空间
method - 用于指定目标action的另一个方法被调用. 如果空,默认为excute方法
Redirect Action Result:
这个Result使用ActionMapperFactory提供的ActionMapper来重定位浏览器的URL来调用指定的action和(可选的)namespace。可以在任意点上改变URL模式而不会影响你的应用程序,因此强烈推荐使用这个Result而不是标准的redirect result来解决重定位到某个action的情况。
ActionName (默认) - 重定位到的action名
namespace - action的名称空间. 如果为null,则为当前名称空间
Redirect Result:
调用{@link HttpServletResponse#sendRedirect(String) sendRedirect}方法来转到指定的位置。HTTP响应被告知使浏览器直接跳转到指定的位置(产生客户端的一个新请求)。这样做的结果会使刚刚执行的action(包括action实例,action中的错误消息等)丢失, 不再可用。这是因为action是建立在单线程模型基础上的,传递数据的唯一方式就是通过Session或者可以为Ognl表达式的web参数(url?name=value)。
location (默认) - action执行后跳转的地址.
parse - 默认为true. 如果设置为false, location参数不会被当作Ognl表达式解析。
注:
1)当使用type=“redirectAction”或type=“redirect”提交到一个action并且需要传递一个参数时。这里是有区别的:a.使用type=“redirectAction”时,结果就只能写Action的配置名,不能带有后缀:“.action”;b.使用type=“redirect”时,结果应是action配置名+后缀名
2)redirect:action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失。
3)redirect-action:action处理完后重定向到一个action,请求参数全部丢失,action处理结果也全部丢失。
4)chain:action处理完后转发到一个action,请求参数全部丢失,action处理结果不会丢失。
param参数设置:
name:可选属性,指定设置参数名称
value:可选属性,指定参数的值
一般用于返回json、stream、字符等等。
5、全局视图<package name="test3" namespace="/test3" extends="struts-default"> <!-- 全局的视图 --> <global-results> <result name="message">/WEB-INF/page/Global.jsp</result> </global-results> <!-- 使用全局视图 如果<action>中没有相应的<result>,Struts2就会使用全局的<result> --> <action name="message" class="cn.action.ActionTest" method="global"> </action> </package> <!—在其他包中使用全局视图 就要使用包的继承 如下: --> <package name="base" extends="struts-default"> <!-- 全局的视图 --> <global-results> <result name="message">/WEB-INF/page/Global.jsp</result> </global-results> </package> <!-- 使用全局视图 extends="base"--> <package name="test4" namespace="/test4" extends="base"> <action name="message" class="cn.action.ActionTest" method="global"> </action> </package>6、自定义(扩展)result类型
通过查找资料得知(http://hi.baidu.com/hfsdaccp/item/26e261873d025655840fabaa)自定义的实现方法:
实现方式:直接扩展struts2的结果集StrutsResultSupport
例如实现返回类型是String的类型:
public class StringResultType extends StrutsResultSupport { private static final long serialVersionUID = 1L; private String contentTypeName; private String stringName = ""; public StringResultType() { super(); } public StringResultType(String location) { super(location); } protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { HttpServletResponse response = (HttpServletResponse) invocation .getInvocationContext().get(HTTP_RESPONSE); // String contentType = (String) // invocation.getStack().findValue(conditionalParse(contentTypeName, // invocation)); String contentType = conditionalParse(contentTypeName, invocation); if (contentType == null) { contentType = "text/plain; charset=UTF-8"; } response.setContentType(contentType); PrintWriter out = response.getWriter(); // String result = conditionalParse(stringName, invocation); String result = (String) invocation.getStack().findValue(stringName); out.println(result); out.flush(); out.close(); } public String getContentTypeName() { return contentTypeName; } public void setContentTypeName(String contentTypeName) { this.contentTypeName = contentTypeName; } public String getStringName() { return stringName; } public void setStringName(String stringName) { this.stringName = stringName; } }
使用的方法:
Action:
package test; import com.opensymphony.xwork2.ActionSupport; public class MyAction extends ActionSupport{ String result="abc"; public String ajax() { return "ajaxResponse"; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } }
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="test" extends="struts-default"> <result-types> <result-type name="string" class="test.StringResultType"></result-type> </result-types> <action name="myAction" class="test.MyAction" > <result name="ajaxResponse" type="string"> <param name="stringName">result</param> </result> </action> </package> </struts>
无非也就是将string结果集进行申明,然后给返回“ajaxResponse”的结果绑定变量名。这里定义返回Action的String result变量,即“abc”。