Action的结果值传递类型

一个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的,然后转到INPUT所对应的页面:

若JSP页面中表单是用普通
编写的,发生错误而返回该页面时,则原数据将消失 若JSP页面中表单是用编写的,发生错误而返回该页面时,则原数据仍存在 若没有提供name值为input的,那么发生错误时,将直接在浏览器中提示404错误

除了这些预定义的结果码外,开发人员也可以定义其它的结果码来满足自身应用程序的需要。

Result配置由两部分组成:一部分是result映射,另一部分是result类型。

一、配置 result映射

在result映射的配置中,在指定实际资源的位置时,可以使用绝对路径,也可以使用相对路径。绝对路径以斜杠(/)开头,相对于当前的Web应用程序的上下文路径;相对路径不以斜杠(/)开头,相对于当前执行的action的路径,也就是namespace指定的路径。

例如:


    
            success.jsp
            /error.jsp
    

如果当前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元素的内容是属性的值。例如:


    /success.jsp
    true

说明:

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表达式。


        
        /viewNews.jsp?id=${id}
        true
    

考虑到默认值的使用(dispatcher和location都是默认值),上述可以简化为:


    viewNews.jsp?id=${id}

2、redirect结果类型(重定向到一个Url,也可以是Action或一个页面)

Redirect结果类型在后台使用HttpServletResponse的sendRedirect方法将请求重定向到指定的URL,它的实现类是org.apache.struts2.dispatcher.ServletRedirectResult.该类同样有二个属性(property):location和parse,在使用redirect结果类型的场景中,用户要完成一次与服务器之间的交互,浏览器需要完成两次请求,因此第一次请求中的数据在第二次请求中是不可用的,这意味在目标资源中是不能访问action实例、action错误以及错误等。

如果有某些数据需要在目标资源中访问:

i、一种方式是将数据保存到Session中

ii、另一种方式是通过请求参数来传递数据

示例(1)、

  
    foo.jsp
    false

示例(2)、

  
<-- Passparameters (reportType, width and height),重定向到Url并且传参 ,如果参数是中文:请参看最底部例子-->  
  

     

        

         generateReport.jsp  

         /genReport  

         pie  

         100 

         100 

       

    

 

3、redirectAction结果类型(重定向到一个Action)

常用于防止表单重复提交,比方说在增加完用户之后要显示列表
redirectAction结果类型的实现类是org.apache.struts2.dispatcher.ServletActionRedirectResult,该类是ServletRedirectResult的子类,因此我们也就可以判断出redirectAction结果类型和redirect结果类型的后台工作原理是一样的,即都是利用HttpServletResponse的sendRedirect方法将请求重定向到指定的URL。

示例、

  
      
         
          
           dashboard 
           /secure 
         
     
 



  
<-- Redirectto an action in the same namespace,重定向到同一命名空间下的action -->
   
      
        dashboard.jsp 
        error 
     
    
      
        error.jsp
     
 



  
<-- Passparameters (reportType, width and height),重定向到Action并且传参,如果参数是中文:请参看最底部例子 --> 
 
      
          
            generateReport 
            /genReport 
            pie 
            100
            100
            
            true 
         
     

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


这个Result使用ActionMapperFactory提供的ActionMapper来重定位浏览器的URL来调用指定的action和(可选的)namespace. 这个Result比ServletRedirectResult要好.因为你不需要把URL编码成xwork.xml中配置的ActionMapper提供的模式. 这就是说你可以在任意点上改变URL模式而不会影响你的应用程序.

redirctAction在转发时无法携带原有的参数,而使用chain类型则直接将参数等信息传递到下一个action

示例、

  
 
      
        login
     
      
     
          
            dashboard 
            /secure 
         
     
 

首先是 删除商品的控制器所对应的xml配置文件如下

  
  
      
        displaycart  
    error.html  
  

删除成功后,其中用type=chain的拦截器,指定让其去执行displaycart的控制器,

  
      
    error.html  
  

而这个displaycart的控制器其实就是刷新显示了当前的购物车了

5、HttpHeader Result:HttpHeader(用来控制特殊的Http行为)

httpheader结果类型很少使用到,它实际上是返回一个HTTP响应的头信息

示例:

  
    204
    a custom header value      another custom header value 
 
  
    305
    this action must be accessed through aprozy 
 

6、Stream Result(向浏览器发送InputSream对象,通常用来处理文件下载)

  
    image/jpeg 
    imageStream 
    attachment;filename="document.pdf"
    1024 

7、PlainText Result(显示原始文件内容,例如文件源代码)

 
    /myJspFile.jsp 
  
 
      
        /myJspFile.jsp 
        UTF-8
     
 
若仅设置type="plainText"的话,页面中显示中文时会乱码,这时就可以借助它的charSet属性以解决中文显示时的乱码问题,如果不设置charSet属性,反而去配置struts.i18n.encoding全局属性,是不能解决问题的
设置charSet属性的目的就是让JSP页面的编码与明文显示时的编码一致

8、Velocity Result(处理Velocity模板)

  
    foo.vm 
 

9、XLS Result(处理XML/XLST模板)

  
    foo.xslt 
    ^/result/[^/*]$ 
    .*(hugeCollection).* 
 

10、 FreeMarkerResult (处理FreeMarker模板)

foo.ftl

附、另外第三方的Result类型还包括JasperReportsPlugin,专门用来处理JasperReport类型的报表输出。

<%@ tagliburi="http://tiles.apache.org/tags-tiles" prefix="tiles"%> 
<%@ taglib prefix="s"uri="/struts-tags" %> 
<%-- Show usage; Used in Header --%> 
  
 
   <tiles:getAsStringname="title"/>  
 
     
        
          
    

Noticethat this is a layout made in JSP


注意!!!!.传递中文

记住永远不要在浏览器的地址栏中传递中文。在传递中文前先进行编码

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中


     
     /redirect.jsp?username=${username}//如果要传递两个参数,中间用&代替& 

在这里使用了类似于el表达式的方式传值,${username}其中username为action中定义的

C.redirect.jsp中


重定向
    <%String s=request.getParameter("username");
    s=new String(s.getBytes("iso8859-1"),"utf-8");
    s=URLDecoder.decode(s,"utf-8");
    out.println(s);
    %>

重定向中传递中文先进行编码,在jsp页面中先接受参数,然后对其进行字节分解,然后进行解码。

你可能感兴趣的:(Action的结果值传递类型)