struts-2.1.7

action result-types_第1张图片

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。


     
     
         login
     
     
         
         
             dashboard
             /secure
         
     


     
         dashboard.jsp
     


dispatcher    

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

httpheader    

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


        
        400
        

当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 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中

 
     pdf  
     application/pdf  
 

struts.xml中


   

       application/pdf

       inputStream

       filename="a.pdf"                  

   

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    

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


    具体的位置
    字符规范(如GBK)


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表达式解析.


  foo.jsp
  false

 list.action?pageBean.pageNumber=${pageBean.pageNumber}
/topicAction!findTopics.do?topicId=${topicId}&elementId=${elementId}

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,则为当前名称空间


 findTopics
 ${topicId}


 重定向的Action名
 重定向Action所在的名字空间


 <-- Pass parameters (reportType, width and height) -->
 
   
      
         generateReport
         /genReport
         pie
         100
         100
      
   

    
showpreinfo?preinfo.order_number=${preinfo.order_number}&preinfo.company_name=${preinfo.company_name} 
    
        /error.jsp
    

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

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

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

?

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


注:redirect与redirectAction区别

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

如:

viewTask.action
viewTask