当前位置: 代码迷 >> Web前端 >> result配备
  详细解决方案

result配备

热度:497   发布时间:2012-11-22 00:16:41.0
result配置

一个result代表了一个可能的输出。当Action类的方法执行完时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出。

?

com.opensymphony.xwork2.Action接口中定义了一组标准的结果代码,可供开发人员使用,如下所示:

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”;

}

?

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

?

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

?

?

?

struts.xml文件中,action元素的子元素result元素用来配置result映射。result元素有两个可选的属性:如下:

属性

是否必须

说明

name

指定result的逻辑名

type

指定result的类型,不同类型的result代表了不同的结果输出。

?

result元素中含有<param>子元素,可以用来指定结果对应的实际资源的位置。param元素有一个必需的属性name,用于指定参数名,param元素的内容给出参数值。如果要指定资源的位置,name属性的值需要设置为location

?

<param>子元素的name属性有如下两个值:

location :指定该逻辑视图对应的实际视图资源。

parse :指定在视图资源名称中是否可以使用OGNL表达式。默认值为true,表示可以使用,如果值为false,表示不支持OGNL表达式。

charSet:指定使用特定的编码集来处理页面。

?

使用<result>元素配置结果映射的标准配置形式如下:

<action name="addBook" class="action.AddBook">

??? <result name="success" type="dispatcher">

??????? <param name="location">/allBooks.jsp</param>

??? </result>

</action>

?

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

?

<result>元素可以配置在<action>元素中,也可以配置在<action>元素外,根据这两种配置,可以将Result的配置分为两种:局部result和全局result

?

局部result:<result…/>作为<action…/>元素的子元素配置。作用范围是这个Action。一个<action…/>可以由多个<result…/>元素,即一个Action可以有多个结果。

?

全局result: <result…/>作为<global-results/>元素的子元素配置。作用范围是整个包。

<package name="default" extends="struts-default">

??? <global-results>

? ??????<result name="error">/error.jsp</result>

??? </global-results>

??? <action name="addBook" class="action.AddBook">

??????? <result>/addSuccess.jsp</result>

??? </action>

</package>

?

配置一个全局result,名称为error。如果default包下的任何Action返回字符串ERROR,那么都可以调用该result,页面将会返回error.jsp

?

注意:当一个Action的局部result与全局result重名时,那么对于该Action的返回视图来说,局部result会覆盖全局result

?

?

?

result类型

?

struts2中允许定义一个默认的Result类型,这是通过result-type元素来定义的。在框架的默认配置文件struts-default.xml中,在struts-default包中有如下的一个配置:

?<result-types>

??? <result-type name="dispatcher" class="org.apache.struts2.dispatche.ServletDispatcherResult" default="true">

?????? </result-type>

?</result-types>

?

result-type元素的default属性指定名为dispatcher的结果类型为默认的结果类型。dispatcher结果类型使用Servlet API中的RequestDispatcher将请求导向到目标资源,通常是JSP页面。如果你在使用result元素配置result映射时,没有使用type属性,那么框架将使用默认的dispatcher类型。

?

由于struts2中的包是可继承的,在上面的实例中定义的default包继承自struts-default包,因此也继承了默认的结果类型定义(当然,也可以在“子”包中定义自己的默认结果类型)。既然有了默认的结果类型,而所需要使用的也正是这种结果类型,那么就可以省略result元素的type属性。

result的配置中,当结果类型为dispatcher时,如果你使用param子元素为该类型的result设置location参数(这是最常用的参数),那么param子元素也是可以省略的。此外如果你没有指定result元素的name属性,那么框架将把它命名为“success.使用框架提供的这些默认设置,简化配置:

?

location参数是默认的参数,在所有的Result实现类中,都定义了一个字符串类型的DEFAULT_PARAM静态常量,专门用于指定默认的参数名。 DEFAULT_PARAM常量的定义:public static final String DEFAULT_PARAM=location;

?

?

<package name="default" extends="struts-default">

??? <action name="login" class="com.ibm.LoginAction">

?? ???????? ?<!-- 省略name属性,框架将其命名为“success, 配置名为success的结果映射,结果类型为dispatcher -->

?? ???????? ?<result>/success.jsp</result>

?? ???????? ?<!-- 省略param子元素,直接在result元素的内容中给出实际资源的位置-->

??? ?????? ?????? ?<result name="error">/error.jsp</result>

??? </action>

</package>

?

简化的<result…/>配置:

<action name=”xxx” class=”xxx”>

<result name=”xxxxxx” type=”xxxxxx”>/xxx.jsp</result>

</action>

注意:

如果没有指定location参数,系统会把<result>…</result>中间的字符串当成实际视图资源;

如果没有指定<result…/>name属性, 则默认name=”success”.

如果没有指定<result…/>type属性,则默认type=”dispatcher”.

?

?

Struts2支持的处理结果类型

Struts2默认了一系列的结果类型,struts-default.xml配置文件中的<result-types>元素中定义。

<result-types>元素定义了一个结果类型, name属性指定结果类型的名字。class属性指定了该结果类型的实现类.

在框架调用Action对请求进行处理之后,就要向用户呈现一个结果视图。Struts2支持多种类型的视图,这些视图是由不同的结果类型来管理的。一个结果类型就是实现了com.opensymphony.xwork2.Result接口的类,在struts2中,预定义了多种结果类型。

归纳起来,struts214种返回结果类型:

结果类型

说明

chain

Action链式处理结果类型.

chart

用于整合JFreeChart的结果类型.

dispatcher

用于JSP整合的结果类型.

freemarker

用于FreeMarker整合的结果类型.

httpheader

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

jasper

用于JasperReports整合的结果类型.

jsf

用于JSF整合的结果类型.

redirect

用于直接跳转到其他URL的结果类型.

redirectAction

用于直接跳转到其他Action的结果类型.

stream

用于向浏览器返回一个InputStream(一般用于文件下载).

tiles

用于Tiles整合的结果类型.

velocity

用于Velocity整合的结果类型.

xslt

用于XML/XSLT整合的结果类型.

plaintext

用于显示某个页面的源代码的结果类型.

?

以上结果类型在默认配置文件struts-default.xml文件中使用<result-type>元素来定义。

?

dispatcher结果类型

dispatcher结果类型是将请求Forword(转发)到指定的资源。Struts2的默认结果类型。

使用dispatcher结果类型时,由于只是将结果类型转发到指定资源。所以能够保留请求信息。所以dispatcher在浏览器的url中可以显示请求action。而不是页面文件名称。

?

?

redirect结果类型

redirect结果类型用来Redirect(重定向)到指定的视图资源。系统将调用HttpServletResponsesendRedirect(String)方法重定向指定视图资源。

重定向的效果就是重新产生一个请求。即重定向会丢失所有请求参数、请求属性、Action的返回结果。

?

Redirect结果类型在后台使用HttpServletResponsesendRedirect方法将请求重定向到指定的URL,它的实现类是org.apache.struts2.dispatcher.ServletRedirectResult

在使用redirect结果类型的场景中,用户要完成一次与服务器之间的交互,浏览器需要完成两次请求,如下图:

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="Picture_x0020_21" o:spid="_x0000_s1026" type="#_x0000_t75" style='position:absolute;left:0;text-align:left;margin-left:-5.6pt; margin-top:3.55pt;width:373.2pt;height:197.75pt;z-index:1'> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->?

?

?

?

?

?

?

?

?

?

?

?

?

?


由于在一次用户交互过程中存在着两次请求,因此第一次请求中的数据在第二次请求中是不可用的,这意味在目标资源中是不能访问action实例、action错误以及错误等。

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

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

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

?

?

?

?

redirectAction结果类型

redirectAction结果类型直接将请求重定向(重新生成一个全新的请求)到另一个Action

redirect结果类型相似,所有请求参数,请求属性,Action的返回结果将会丢失。

redirect结果类型不同的是,redirectAction使用ActionMapperFactory类的ActionMapper实现重定向。

?

配置redirectAction结果类型时,<param.../>可以指定两个参数:

actionName :该参数指定重定向的Action名。必选参数。

namespace :该参数指定需要重定向的Action所在的命名空间。可选参数。

?

redirectAction结果类型可以简化带有命名空间的Action的访问。

?

redirectAction结果类型的实现类是org.apache.struts2.dispatcher.ServletActionRedirectResult,该类是ServletDispatcherResult的子类,因此我们也就可以判断出redirectAction结果类型和redirect结果类型的后台工作原理是一样的,即都是利用HttpServletResponsesendRedirect方法将请求重定向到指定的URL

?

那么redirectredirectAction有什么区别呢?

从结果类型的名字上,我们可以大致判断出redirectAction结果类型主要是用于重定向到action。也就是说,在请求处理完成后,如果你需要重定向到另一个action,那么建议你使用redirectAction结果类型。

?

使用redirectAction结果类型可以简化对那些带有名称空间的action URL的设置,ServletActionRedirectResult类在内部使用ActionMapper来构建访问actionURL,这样你就不需要在struts.xml配置文件中手动去编码访问actionURL.

?

?

例:在struts.xml文件中使用redirectAction结果类型

<package name="default" extends="struts-default">

??? <action name="test" class="action.Test">

??????? <result type="redirectAction">

<!--[if gte vml 1]><v:line id="_x0000_s1027" style='position:absolute; left:0;text-align:left;flip:x;z-index:2' from="105.85pt,14.4pt" to="222.85pt,108.9pt"> <v:stroke endarrow="block" /> </v:line><![endif]--><!--[if !vml]--><!--[endif]-->??????????????? <param name="actionName">test2.action</param>

??????????????? <param name="namespace">/temp</param>

??????? </result>

??? </action>

</package>

<package name="secure" extends="struts-default" name="/temp">

??? <action name="test2" class="action.Test">

??????? <result name="success">/testSuccessful.jsp</result>

??? </action>

</package>

?

?

如果两个Action在同一个命名空间,可以省略namespace参数。

?

?

Stream结果类型

Stream类型的result一般是指将原始数据直接传递给HttpServletResponse,这种结果类型在用户下载文件(例如PDF文件等)等情况下非常有意义。

配置stream类型的result,一般可以指定下面几个参数:

contentType:指定传递给浏览器的stream类型,默认类型为text/plain.

contentlength:数据流的字节长度(用于浏览器显示进度条)

contentDispostion:指定文件的内容规格,默认值为inline.

inputName:数据流的属性,默认值为inputstream

bufferSize:缓冲区容量,默认为1024.

?

示例:

<result name="success" type="stream">

??? <param name="contentType">image/jpeg</param>

??? <param name="inputName">imageStream</param>

??? <param name="contentDisposition">filename="document.pdf"</param>

??? <param name="bufferSize">1024</param>

? </result>

?

?

chain结果类型

Struts2框架支持配置多个Action组成一条Action链或者工作流,Action链通过拦截器ChainingInterceptor完成的。

ChainingInterceptor在源Action执行完毕后,将源Action的用户请求参数、值栈、session的数据赋值给目的Action,就是说,在执行多个Action过程中,参数都是保留的。前一个动作的状态在后一个动作里仍然保持。

<!--[if gte vml 1]><v:shape id="Picture_x0020_4" o:spid="_x0000_s1028" type="#_x0000_t75" style='position:absolute;left:0;text-align:left; margin-left:27.25pt;margin-top:2.05pt;width:589.65pt;height:257.35pt; z-index:3'> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image004.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]-->

?
?
<!--[endif]-->?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?


例:

<package name="myPackage1" extends="struts-default">

??? <action name="test1" class="action.Test1">

??????? <result type="chain">test2</result>

??? </action>

??? <action name="test2" class="action.Test2">

??????? <result type="chain">

??????????? <param name="success">/testSuccessful.jsp</param>

??????????? <param name="namespace">/namespace2</param>

??????? </result>

??? </action>

</package>

<package name="myPackage2" extends="struts-default" name="/namespace2">

??? <action name="test3" class="action.Test3">

??????? <result type="chain">test3</result>

??? </action>

</package>

?

动作test1test2test3组成动作链。

?

?

httpheader结果类型

用来把一个HTTP状态发送到浏览器。

使用httpheader结果类型时,代码如下:

<default-action-ref name="test1" />

<action name="test3" class="action.Test3">

??? <result type="httpheader">

??????? <param name="status">404</param>

??? </result>

</action>

?

<default-action-ref? />元素用来定义默认的动作,如果某个URL没有与之匹配的动作,这个默认地址将被调用。

上述代码定义了一个名为test1的默认地址,使用httpheader结果类型把一个404状态发给浏览器。如果没有匹配的动作,用户将收到一个404状态报告。

?

plainText

plainText结果类型可能不是很常用,但是它是一个非常有趣的结果类型,因为它可以用于输出JSPHTML的源代码。想一想,你制作一个在线实例教程,用户看完页面效果后,想看看你的页面如何编写的,点击你提供的“查看源代码链接” ,整个页面的源代码就以页面的形式在浏览器中显示出来,这个功能是不是很贴心呢!

?

通常情况下,要想在浏览器中显示一个JSP或页面的代码,你必须对其中的标记使用实体引用或字符引用的方式来做置换,这样才能在浏览器中显示页面代码。不过如果这样做,一方面工作量太大,另一方面你的源文件也被破坏了。所以我们通常是编写一个转换程序,在页面输出时,由程序读取页面的内容,将其中的特殊字符转换成对应的字符引用,然后再输出到浏览器中。

?

struts2中你不需要这样去编写这样的程序了,直接使用plainText结果类型就可以实现输出页面源代码的功能。

?

plainText结果类型有两个参数,如下所示:

Location:指定要输出原始内容的页面(JSPHTML)。该参数是默认的。

charSet:指定输出页面内容时使用的字符编码。这个字符编码将被用作设置响应类型(例如:Content-Type=text/plain;charset=GBK),以及使用Reader对象读取文件时的编码。

?

<action name=displayJspRawContent>

<result type=plaintext>

?????? <param name=location >/myJspFile</param>

?????? <param name=charSet >GBK</param>

</result>

</action>

?

如果你在myJspFile.jsp中使用了中文,那么需要设置charSet参数为GBK或者GB2312,否则在浏览器中显示时会出现乱码。

?

?

?

xslt结果类型

?

?

?

?

velocity结果类型

?

?

?

?

通配符配置result

<action name="*Crud" class=“com.xxx.Crud" method="{1}">

??? <result name="success">/{1}.jsp</result>

</action>

?

?

?

使用OGNL动态结果

<result>元素值使用OGNL表达式实现。

例如:

<action name="ognlTest" class="action.OGNLTest">

??? <result name="success ">/${personName}.jsp</result>

</action>

?

?

这里表达式的参数为personName

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

  相关解决方案