Struts2中 Result类型配置详解

一个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页面中先接受参数,然后对其进行字节分解,然后进行解码。

时间: 02-03

Struts2中 Result类型配置详解的相关文章

Struts2中 Result类型配置详解(转)

一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwork2.Action接口中定义了一组标准的结果代码,可供开发人员使用,当然了只有我们的action继承ActionSupport 这个类才可以使用下面的结果代码,如下所示:public interface Action{    public static final String SUCCESS =

struts2中的constant配置详解

1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 3 "http://struts.apache.org/dtds/struts-2.0.dtd"> 4 <struts> 5 &

Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/pR_4sY0cJLs/优酷:http://v.youku.com/v_show/id_

Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/a6qIB7SqOlc/优酷:http://v.youku.com/v_show/id_

.Net中Web.config 配置详解

花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点.所以这里只介绍一些比较常用的节点. <?xml version="1.0"?> <!--注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来配置应用程序的设置.可以使用 Visual Studio 中的“网站”->“Asp.Net 配置”选项. 设置和注释的完整列表在 machine.config.

Struts2学习笔记二 配置详解

Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的namespace,然后在包下寻找名为HelloAction的action,反射创建控制器HelloAction对象,调用method指定的方法hello,拿到返回值“success”,去result的配置节找success对应的页面(hello.js),呈现给用户. 2.Struts的架构,具体参考这里

Struts2学习笔记(二)——配置详解

1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin.xml(配置插件) struts.xml(配置action或者常量等) struts.properties(常量配置) web.xml(配置JavaEE,如:监听器和过滤器) 2.Struts2配置文件详解 1)default.properties default.properties是Struts

struts2中struts.xml配置文件详解

struts.xml的常用配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts

Struts2中Result的配置

一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出. 一.结果类型 Struts2提供了很多的结果类型的,这里介绍最常用的四种. dispatcher:在服务器内跳转到结果页面(视图页面)中去,只可以跳转到视图页面,不能跳转到Action.(默认类型)redirect:客户端跳转(重定向),URL会发生变化,只可以跳转到视图页面,不能跳转到Action.chain:在服务器内跳转到Action