一个result代表了一个可能的输出。当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出。
com.opensymphony.xwork2.Action接口中定义了一组标准的结果代码,可供开发人员使用,当然了只有我们的action继承ActionSupport 这个类才可以使用下面的结果代码,如下所示:
public interface Action
{
    public static final String SUCCESS = “success”;
    public static final String NONE = “none”;
    public static final String ERROR = “error”;
    public static final String INPUT = “input”;
    public static final String LOGIN = “login”;
}
   其中 Struts2应用在运行过程中若发现addFieldError()中有信息或者类型转换失败或着输入校验失败等情况
那么它会自动跳转到name为input<result/>,然后转到INPUT所对应的页面
若JSP页面中表单是用普通<form>编写的,发生错误而返回该页面时,则原数据将消失
若JSP页面中表单是用<s:form/>编写的,发生错误而返回该页面时,则原数据仍存在
若没有提供name值为input的<result/>,那么发生错误时,将直接在浏览器中提示404错误 
  除了这些预定义的结果码外,开发人员也可以定义其它的结果码来满足自身应用程序的需
要。
    Result配置由两部分组成:一部分是result映射,另一部分是result类型。下面我们分别对
这两部分进行介绍。
一、配置 result映射
   在result映射的配置中,在指定实际资源的位置时,可以使用绝对路径,也可以使用相对路径。
绝对路径以斜杠(/)开头,相对于当前的Web应用程序的上下文路径;
相对路径不以斜杠(/)开头,相对于当前执行的action的路径,也就是namespace指定的路径。

例如:
  <package name="default" extends="struts-default" namespace="/admin">
    <action name="login" class="com.ibm.LoginAction">
            <result>success.jsp</result>
            <result name="error">/error.jsp</result>
    </action>
 </package>
    如果当前Web应用程序的上下文路径是/Shop,那么请求/Shop/admin/login.action,执行成功后,转向的页面路径为:/Shop/admin/success.jsp;执行失败后,转向的页面路径为/Shop/error.jsp.

二、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

  1、dispatcher结果类型
   Struts2在后台使用Servlet API 的RequestDispatcher来转发请求,因此在用户的整个请求/响应过程中,目标Servlet/JSP接收到的request/response对象,与最初的Servlet/JSP相同。
 
   Dispatcher结果类型的实现是org.apache.struts2.dispatcher.ServletDispatcherResult,该类的二个属性(property):location和parse,这两个属性可以通过struts.xml配置文件中的result元素的param子元素来设置。param元素的name属性指定结果类型实现类的属性名,param元素的内容是属性的值。例如:
  <result name=“success”  type=“dispatcher”>
    <param name=“location” >/success.jsp</param>
     <param name=“parse” >true</param>
</result>

  说明:
   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}//如果要传递两个参数,中间用&amp;代替&</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

最新文章

  1. HDU 1863
  2. jquery 中的几个函数方法
  3. 面向对象与面向过程 $this的注意事项和魔术方法set和get
  4. c# 控制服务启动停止
  5. shell调试选项
  6. 自动备份多个MOSS站点集的脚本
  7. Ubuntu终端字体颜色方案
  8. CSS实现三角形图标的原理《转载》
  9. ERP库位分布看板(库位管理)
  10. GitHub开源:升讯威微信营销系统(第三方微信平台)完整源代码
  11. [搬运]在C#使用.NET设计模式的新观点
  12. Libgdx1.6.2发布,跨平台游戏开发框架
  13. 在项目管理中如何保持专注,分享一个轻量的时间管理工具【Flow Mac版 - 追踪你在Mac上的时间消耗】
  14. javaMail的使用以及trying to connect to host &quot;1xxx@163.com&quot;, port 25, isSSL false异常
  15. Spring Security(二十):6.2.3 Form and Basic Login Options
  16. mac 电脑连接linux 服务器
  17. kickstart
  18. java操作特殊字符需要注意的点
  19. java redis client jedis 测试
  20. windows下elasticsearch配置及spring boot 简单demod的 整合

热门文章

  1. Android复制assets目录下的图片到内存
  2. Java与邮件系统交互之使用Socket验证邮箱是否存在
  3. Idea 201601注册码
  4. 发布FTP服务,防火墙配置
  5. sublime返回上一编辑位置
  6. Android Studio开发第四篇版本管理Git(下)
  7. Ubuntu下的杀毒
  8. 二十七、EFW框架BS系统开发中的MVC模式探讨
  9. java数据库连接池性能对比
  10. Eclipse项目名出现红叉