action result-types

struts-2.1.7

chain:用来处理Action链,被跳转的action中仍能获取上个页面的值,如request信息.

dispatcher:用来转向页面,通常处理JSP.

freemaker:处理FreeMarker模板.

httpheader:控制特殊HTTP行为的结果类型.

redirect:重定向到一个URL,被跳转的页面中丢失传递的信息,如request.

redirectAction:重定向到一个Action,跳转的页面中丢失传递的信息.

stream:向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据.

velocity:处理Velocity模板.

xslt:处理XML/XLST模板.

plainText:显示原始文件内容,例如文件源代码.



chain    

action处理完后转发到一个action,请求参数全部丢失,action处理结果不会丢失。

处于chain中的action属于同一个http请求,共享一个ActionContext。

<package name="public" extends="struts-default">
     <!-- Chain creatAccount to login, using the default parameter -->
     <action name="createAccount" class="...">
         <result type="chain">login</result>
     </action>
     <action name="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">
     <action name="dashboard" class="...">
         <result>dashboard.jsp</result>
     </action>
</package>


dispatcher    

   用来转向页面,通常处理JSP    

httpheader    

   控制特殊HTTP行为的结果类型    

<action name="test" class="com.iss.action.TestAction">
        <result name="success" type="httpheader">
        <param name="status">400</param>
        </result>
</action>
当action返回SUCCESS的时候,会将响应状态修改为400,客户端错误的请求,还有其他的状态可以自行尝试,比如为100时,浏览器会在请求一段时间之后继续当前页面,500则为服务器内部错误等等具体为什么会产生这样的结果,当然得把源码翻出来了下面是HttpHeaderResult的一些成员变量,private的可以作为param的name属性。
    /** The default parameter */
     public static final String DEFAULT_PARAM = "status";
     private boolean parse = true;
     private Map<String,String> headers;
     private int status = -1;
     private int error = -1;
     private String errorMessage;
下面是具体执行操作过程,可以看到response.setStatus等操作
 public void execute(ActionInvocation invocation) throws Exception {
         HttpServletResponse response = ServletActionContext.getResponse();
         ValueStack stack = ActionContext.getContext().getValueStack();
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
         if (status != -1) {
             response.setStatus(status);
         } else if (error != -1) {
             if (errorMessage != null) {
                 String finalMessage = parse ? TextParseUtil.translateVariables(
                     errorMessage, stack) : errorMessage;
                 response.sendError(error, finalMessage);
             } else
                 response.sendError(error);
         }
        if (headers != null) {
             for (Iterator iterator = headers.entrySet().iterator();
                  iterator.hasNext();) {
                 Map.Entry entry = (Map.Entry) iterator.next();
                 String value = (String) entry.getValue();
                 String finalValue = parse ? TextParseUtil.translateVariables(value, stack) : value;
                 response.addHeader((String) entry.getKey(), finalValue);
             }
         }
     }

stream    

   向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据    

这个返回类型主要用作下载文件或者在浏览器上显示PDF等文档。

此处给一个显示PDF文档示例:

项目web.xml中

<mime-mapping>  
     <extension>pdf</extension>  
     <mime-type>application/pdf</mime-type>  
 </mime-mapping>

struts.xml中

<action name="test" class="com.iss.action.TestAction">
   <result name="success" type="stream">

       <param name="contentType">application/pdf</param>

       <param name="inputName">inputStream</param>

       <param name="contentDisposition">filename="a.pdf"</param>                  

   </result>
</action>

TestAction.java中

public class TestAction extends ActionSupport
{
   private InputStream inputStream;

   public InputStream getInputStream()
   {
       return inputStream;
   }
   @Override
   public String execute() throws Exception
   {
       inputStream = new FileInputStream("xxxxx/a.pdf");//要下载或显示的文件路径  
       return SUCCESS;
   }
}

需要注意的地方是struts.xml中inputName的值要与TestAction中的属性名相同,在此处就是inputStream  

plainText    

显示原始文件内容,例如文件源代码    

<result name="err" type="plaintext">
    <param name="location">具体的位置</param>
    <param name="charSet">字符规范(如GBK)</param>
</result>


redirect    

   action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也        全部丢失。

   调用{@link HttpServletResponse#sendRedirect(String) sendRedirect}方法来转到指定的位置. HTTP响应被告知使浏览器直接跳转到指定的位置(产生客户端的一个新请求). 这样做的结果会使刚刚执行的action(包括action实例,action中的错误消息等)丢失, 不再可用. 这是因为action是建立在单线程模型基础上的. 传递数据的唯一方式就是通过Session或者可以为Ognl表达式的web参数(url?name=value)
location (默认) - action执行后跳转的地址.

parse - 默认为true. 如果设置为false, location参数不会被当作Ognl表达式解析.

<result name="success" type="redirect">
  <param name="location">foo.jsp</param>
  <param name="parse">false</param>
</result>
<result  type= "redirect "> list.action?pageBean.pageNumber=${pageBean.pageNumber}</result>
<result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}&amp;elementId=${elementId}</result>

redirectAction    

action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失。这个Result使用ActionMapperFactory提供的ActionMapper来重定位浏览器的URL来调用指定的action和(可选的)namespace.这个Result比ServletRedirectResult要好.因为你不需要把URL编码成xwork.xml中配置的ActionMapper提供的模式.这就是说你可以在任意点上改变URL模式而不会影响你的应用程序. 因此强烈推荐使用这个Result而不是标准的redirect result来解决重定位到某个action的情况.

ActionName (默认) - 重定位到的action名
namespace - action的名称空间. 如果为null,则为当前名称空间

<result name="topic" type="redirectAction">
 <param name="actionName">findTopics</param>
 <param name="topicId">${topicId}</param>
</result>
<result name="err" type="redirecAction">
 <param name="actionName">重定向的Action名</param>
 <param name="namespace">重定向Action所在的名字空间</param>
</result>
<package name="passingRequestParameters" extends="struts-default"                    namespace="/passingRequestParameters">
 <-- Pass parameters (reportType, width and height) -->
 <!--
   The redirect-action url generated will be :
   /genReport/generateReport.action?reportType=pie&width=100&height=100
  -->
   <action name="gatherReportInfo" class="...">
      <result name="showReportResult" type="redirect-action">
         <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>
      </result>
   </action>
</package>
<action name="enterpreinfo" class="preinfoBusinessAction" method="enterPreinfoSub">
    <result name="success" type="redirectAction">
showpreinfo?preinfo.order_number=${preinfo.order_number}&amp;preinfo.company_name=${preinfo.company_name} </result>
    <result name="error" type="redirect">
        <param name="location">/error.jsp</param>
    </result>
</action>

因为使用了redirectAction,所以要注意不能将showpreinf?preinfo.order_number=${preinfo.order_number}写成showpreinf.action?preinfo.order_number=${preinfo.order_number}

在这个配置文件里,多个参数的连接符使用了"&amp;",但XML的语法规范,应该使用"&amp;"代替"&",原理和HTML中的转义相同,开始没有注意,在struts分析配置文件时,总是报出这样的错误:

The reference to entity "preinfo" must end with the ';' delimiter.

?

进行上面说明的替换后,就正常了。


注:redirect与redirectAction区别

一、使用redirect需要后缀名 使用redirectAction不需要后缀名
二、type="redirect" 的值可以转到其它命名空间下的action,而redirectAction只能转到同一命名空下的 action,因此它可以省略.action的后缀直接写action的名称。

如:

<result name="success" type="redirect">viewTask.action</result>
<result name="success" type="redirecAtction">viewTask</result>


你可能感兴趣的:(action,result-types)