Struts2中 Result类型配置详解
Struts2中 Result类型配置详解
(2012-12-01 20:34:33)二、result结果类型详解
type 所有类型 :(在struts2-core.jar/struts-default.xml中可以找到)
| Type 类型值 | 作用说明 | 对应类 | 
| chain | 用来处理Action 链 | com.opensymphony.xwork2.ActionChainResult | 
| dispatcher(默认值) | 用来转向页面,通常处理 JSP | org.apache.struts2.dispatcher.ServletDispatcherResult | 
| redirect | 重定向到一个URL | org.apache.struts2.dispatcher.ServletRedirectResult | 
| redirectAction | 重定向到一个 Action | org.apache.struts2.dispatcher.ServletActionRedirectResult | 
| plainText | 显示源文件内容,如文件源码 | org.apache.struts2.dispatcher.PlainTextResult | 
| 
 freemarker 
 | 处理 FreeMarker 模板 | org.apache.struts2.views.freemarker.FreemarkerResult | 
| httpheader | 控制特殊 http 行为的结果类型 | org.apache.struts2.dispatcher.HttpHeaderResult | 
| stream 
 | 向浏览器发送 InputSream 对象,通常用来处理文件下载,还可用于返回 AJAX 数据。 
 | org.apache.struts2.dispatcher.StreamResult 
 | 
| velocity | 处理 Velocity 模板 | org.apache.struts2.dispatcher.VelocityResult | 
| xslt | 处理 XML/XLST 模板 | org.apache.struts2.views.xslt.XSLTResult | 
说明: A、location参数用于指定action执行完毕后要转向的目标资源,parse属性是一个布尔类型的值,如果为true,则解析location参数中的OGNL表达式;如果为false,则不解析。parse属性的默认值就是true. location参数是默认的参数,在所有的Result实现类中,都定义了一个字符串类型的DEFAULT_PARAM静态常量,专门用于指定默认的参数名。 DEFAULT_PARAM常量的定义:public static final String DEFAULT_PARAM=“location”; B、在设置location参数时,可以在参数值中使用OGNL表达式。 <action name=“viewNews” class=“com.ibm.ViewNewsAction” <result name=“success” type=“dispatcher”> <!--如果参数是中文:请参看最底部例子--> <param name=“location” >/viewNews.jsp?id=${id}</param> <param name=“parse” >true</param> </result> </action> 考虑到默认值的使用(dispatcher和location都是默认值),上述可以简化为: <action name=“viewNews” class=“com.ibm.ViewNewsAction”> <result name=“success” >viewNews.jsp?id=${id}</result> </action> 2、redirect结果类型(重定向到一个Url,也可以是Action或一个页面) Redirect结果类型在后台使用HttpServletResponse的sendRedirect方法将请求重定向到指定的URL,它的实现类是org.apache.struts2.dispatcher.ServletRedirectResult.该类同样有二个属性(property):location和parse,在使用redirect结果类型的场景中,用户要完成一次与服务器之间的交互,浏览器需要完成两次请求,因此第一次请求中的数据在第二次请求中是不可用的,这意味在目标资源中是不能访问action实例、action错误以及错误等。 如果有某些数据需要在目标资源中访问, i、一种方式是将数据保存到Session中, ii、另一种方式是通过请求参数来传递数据。 示例(1)、<result name="success" type="redirect"> <param name="location">foo.jsp</param> <param name="parse">false</param><!--不解析OGNL--> </result> 示例(2)、 <package name="passingRequestParameters"extends="struts-default"namespace="/passingRequestParameters">
<-- Passparameters (reportType, width and height),重定向到Url并且传参 ,如果参数是中文:请参看最底部例子-->
<!-- The redirect-action url generated will be : /genReport/generateReport.jsp?reportType=pie&width=100&height=100 -->
<actionname="gatherReportInfo" class="...">
<resultname="showReportResult" type="redirect">
<param name="location">generateReport.jsp</param>
<param name="namespace">/genReport</param>
<param name="reportType">pie</param>
<param name="width">100</param>
<param name="height">100</param>
</result>
</action>
</package>
3、redirectAction结果类型(重定向到一个Action) 他经常用于防止表单重复提交,比方说在增加完用户之后要显示列表 redirectAction结果类型的实现类是org.apache.struts2.dispatcher.ServletActionRedirectResult,该类是ServletRedirectResult的子类,因此我们也就可以判断出redirectAction结果类型和redirect结果类型的后台工作原理是一样的,即都是利用HttpServletResponse的sendRedirect方法将请求重定向到指定的URL。 示例、 <package name="public"extends="struts-default">
<action name="login"class="...">
<!--Redirect to another namespace 重定向到不同命名空间下的 action --> <result type="redirectAction">
<param name="actionName">dashboard</param>
<param name="namespace">/secure</param>
</result>
</action>
</package>
<package name="secure"extends="struts-default" namespace="/secure">
<-- Redirectto an action in the same namespace,重定向到同一命名空间下的action -->
<action name="dashboard" class="...">
<result>dashboard.jsp</result>
<result name="error"type="redirectAction">error</result>
</action>
<action name="error" class="...">
<result>error.jsp</result>
</action> </package>
<package name="passingRequestParameters"extends="struts-default"namespace="/passingRequestParameters">
<-- Passparameters (reportType, width and height),重定向到Action并且传参,如果参数是中文:请参看最底部例子 -->
<!-- TheredirectAction url generated will be : /genReport/generateReport.action?reportType=pie&width=100&height=100 -->
<action name="gatherReportInfo" class="...">
<result name="showReportResult" type="redirectAction">
<param name="actionName">generateReport</param>
<param name="namespace">/genReport</param>
<param name="reportType">pie</param>
<param name="width">100</param>
<param name="height">100</param>
<param name="empty"></param>
<param name="supressEmptyParameters">true</param>
</result>
</action>
</package>
4、链接类型 result:chain(从一个Action转发到另一个Action) chain结果类型有4个属性,分别是:
actionName (default) - the name of the action that will be chained to
namespace - used to determine which namespace the Action is in that we're chaining. If namespace is null, this defaults to the current namespace
method - used to specify another method on target action to be invoked. If null, this defaults to execute method
skipActions - (optional) the list of comma separated action names for the actions that could be chained to
示例、 <package name="public"extends="struts-default">
<!-- Chain creatAccount to login, using the default parameter ,链接到同一命名空间下的Action,-->
<action name="createAccount" class="...">
<result type="chain">login</result>
</action>
<actionname="login" class="...">
<!--Chain to another namespace -->
<result type="chain">
<param name="actionName">dashboard</param>
<param name="namespace">/secure</param>
</result>
</action>
</package>
<package name="secure" extends="struts-default"namespace="/secure">
<actionname="dashboard" class="...">
<result>dashboard.jsp</result>
</action>
</package> 5、HttpHeader Result:HttpHeader(用来控制特殊的Http行为) httpheader结果类型很少使用到,它实际上是返回一个HTTP响应的头信息 示例:<result name="success"type="httpheader"> <paramname="status">204</param> <paramname="headers.a">a custom header value</param> <paramname="headers.b">another custom header value</param> </result> <result name="proxyRequired"type="httpheader"> <paramname="error">305</param> <paramname="errorMessage">this action must be accessed through aprozy</param> </result> 6、Stream Result(向浏览器发送InputSream对象,通常用来处理文件下载) <result name="success"type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">imageStream</param>
<param name="contentDisposition">attachment;filename="document.pdf"</param>
<param name="bufferSize">1024</param> </result> 7、PlainText Result(显示原始文件内容,例如文件源代码) <action name="displayJspRawContent">
<result type="plaintext">/myJspFile.jsp</result> </action>
<action name="displayJspRawContent">
<result type="plaintext">
<param name="location">/myJspFile.jsp</param>
<param name="charSet">UTF-8</param>
</result> </action> 若仅设置type="plainText"的话,页面中显示中文时会乱码,这时就可以借助它的charSet属性以解决中文显示时的乱码问题,如果不设置charSet属性,反而去配置struts.i18n.encoding全局属性,是不能解决问题的 设置charSet属性的目的就是让JSP页面的编码与明文显示时的编码一致 8、Velocity Result(处理Velocity模板) <result name="success"type="velocity"> <paramname="location">foo.vm</param> </result> 9、XLS Result(处理XML/XLST模板) <result name="success" type="xslt">
<paramname="location">foo.xslt</param>
<paramname="matchingPattern">^/result/[^/*]$</param>
<paramname="excludingPattern">.*(hugeCollection).*</param> </result> 10、 FreeMarkerResult (处理FreeMarker模板) <result name="success"type="freemarker">foo.ftl</result>
附、另外第三方的Result类型还包括JasperReportsPlugin,专门用来处理JasperReport类型的报表输出。
<%@ tagliburi="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@ taglib prefix="s"uri="/struts-tags" %>
<%-- Show usage; Used in Header --%>
<tiles:importAttribute name="title"scope="request"/>
<html>
<head><title><tiles:getAsStringname="title"/></title></head>
<body>
<tiles:insertAttribute name="header"/>
<pid="body">
<tiles:insertAttributename="body"/>
</p>
<p>Noticethat this is a layout made in JSP</p>
</body>
</html>
注意!!!!.传递中文
记住永远不要在浏览器的地址栏中传递中文。在传递中文前先进行编码
A.action中
public class User extends ActionSupport{ private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Override public String execute() throws Exception { // TODO Auto-generated method stub username=URLEncoder.encode("郭蕾","utf-8");//先进行编码 System.out.println(username); return "redirect"; } }
B.struts.xml中 <action name="redirect" class="action.User"> <result type="redirect" name="redirect"> /redirect.jsp?username=${username}//如果要传递两个参数,中间用&代替& </result> </action> 在这里使用了类似于el表达式的方式传值,${username}其中username为action中定义的 C.redirect.jsp中
<body> 重定向 <%String s=request.getParameter("username"); s=new String(s.getBytes("iso8859-1"),"utf-8"); s=URLDecoder.decode(s,"utf-8"); out.println(s); %> </body>
重定向中传递中文先进行编码,在jsp页面中先接受参数,然后对其进行字节分解,然后进行解码。
参考博文连接: http://struts2.group.iteye.com/group/wiki/1462-result-in-struts2http://hi.baidu.com/langmanyuai/item/228e047ad6dc753d714423b0

 
 转载
转载 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号