Struts2配置Result

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

配置Result
一个result代表了一个可能的输出。

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

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

1.结果映射
在struts.xml文件中,使用result元素来配置result映射。

result元素有两个可选的属性:
在Struts2中允许定义一个默认的Result类型,这是通过result-type元素来定义的。

在框架的默认配置文件struts-default.xml中,在struts-default.xml包中有如下的一个配置:
<result-types>
<result-type name="dispatcher"
class="org.apache.struts2.dispatcher.ServletDispatcherRe
sult"default="true"/>
</result-types>
result-type元素的default属性指定名为dispatcher的结果类型,
dispatcher结果类型使用ServletAPI中的ResultDispatcher将请求导向到目
标资源(通常是JSP页面)。

如果在使用result元素配置result映射时,没有使用
type类型,那么框架就将使用默认的dispatcher类型。

由于Struts2中的包是可以继承的,所以我们定义的package只要继承了
struts-default包,因此也继承了默认的结果类型,所以可以省略result元素的
type属性。

如果没有指定result元素的name属性,那么框架将把它命名为”success”。

2.结果类型
在框架调用Action对请求进行处理之后,就要向用户呈现一个结果视图,Struts2支持多种类型的视图,这些视图是由不同的结果类型来管理的。

一个结果类型就是实现了com.opensymphony.xwork2.Result接口的类,在Struts2中定义了多种结果类型,如下表所示:
plainText用于显示某个特定页面(例如JSP,HTML)的原始内容(即页面的代码)
结果类型在包中使用result-type元素定义,以下列出的结果类型都是在框架的默认配置
文件struts-default.xml中定义的。

<result-types>
<result-type name="chain"
class="com.opensymphony.xwork2.ActionChainResult"/> <result-type name="dispatcher"
class="org.apache.struts2.dispatcher.ServletDispatcherR
esult"default="true"/>
<result-type name="freemarker"
class="org.apache.struts2.views.freemarker.FreemarkerResu
lt"/>
<result-type name="httpheader"
class="org.apache.struts2.dispatcher.HttpHeaderResult"/> <result-type name="redirect"
class="org.apache.struts2.dispatcher.ServletRedirectResu
lt"/>
<result-type name="redirectAction"
class="org.apache.struts2.dispatcher.ServletActionRedire
ctResult"/>
<result-type name="stream"
class="org.apache.struts2.dispatcher.StreamResult"/> <result-type name="velocity"
class="org.apache.struts2.dispatcher.VelocityResult"/> <result-type name="xslt"
class="org.apache.struts2.views.xslt.XSLTResult"/> <result-type name="plainText"
class="org.apache.struts2.dispatcher.PlainTextResult"/> </result-types>
我们也可以创建自己的结果类型注册到引用程序中。

首先需要编写一个实现了
com.opensymphony.xwork2.Result接口的类,然后在struts.xml文件中使
用result-type元素来注册你的结果类型。

自定义的结果类型可以生成E-mail,或者生成JMS消息,也可以生成图像等。

3.常用结果类型
1>dispatcher结果类型:
Struts2在后台使用Servlet API的RequestDispatcher来转发请求,因此在用户的整个请求/相应过程中,目标Servlet/JSP接收到的
request/response对象,与最初的Servlet/JSP相同。

disptcher结果类型的实现类是:
org.apache.struts2.dispatcher.ServletDispatcherResult
该类有两个属性: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>
其中,location参数用于指定action执行完毕之后要转向的目标资源,parse是一个布尔值的属性,如果为true,则解析lcation参数中的OGNL表达式,如果为false,则不解析。

parse默认值是true
2>redirect结果类型:
redirect结果类型在后台使用HttpServletResponse的sendRedirect方法,将请求重定向到URL,它的实现类是
org.apache.struts2.dispatcher.ServletRedirectResult.
在使用redirect时,用户要完成一次与服务器之间的交互,浏览器需要发送两次请求。

过程如下:
1.浏览器发出一个请求,Struts2框架调用对应的Action实例对请求进
行处理,
2.Action返回”success”结果码,框架根据这个结果码选择对应的结果
类型,这里使用的死redirect结果类型.
3.ServletRedirectResult在内部使用HttpServletReponse的
sendRedirect方法将请求重定向到目标资源。

4.浏览器重新发起一个针对目标资源的新的请求。

5.目标资源作为响应呈现给用户。

使用redirect结果类型,实际上是告诉浏览器目标资源所在位置,让浏览球重新访问目标资源。

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

如果有某些数据需要在目标资源中访问,一种是将数据保存在Session中,另一种方式是通过参数来传递数据。

3>redirectAction结果类型
redirectAction结果类型的实现类是org.apache.struts2.
dispatcher.ServletActionRedirectResult,该类是
ServletDispatcherResult的子类,所以redirectAction结果类型和redirect结果类型的后台工作原理是一样的,即都是利用
HttpServletResponse的sendRedirect方法将请求重定向到指定的
URL。

redirectAction结果类型主要是用于重定向到action,在请求处理完成之后如果需要重定向到另一个action,建议使用redirectAction 类型。

使用redirectAction结果类型,可以简化那些带有名称空间的action URL的设置。

ServletActionRedirect类在内部使用
ActionMapper来构建访问action的URL,这样就不需要在struts.xml 配置文件中去手动编码访问action的URL了。

redirectAction结果类型有两个参数,如下所示:
1>actionName
指定要访问的action的名字,该参数是默认参数。

2>namespace
指定action所属的名称空间。

如果没有使用这个参数,那么默认
使用当前的名称空间。

实例如下:
<package name="default"namespace="/"extends="struts-default"> <action name="news*"
class="org.struts2.lesson05.News{1}Action">
<result name="success">/WEB-INF/News/{1}.jsp</result>
<result name="login"type="redirectAction">
<param name="actionName">loginPage</param>
<param name="namespace">/login</param>
</result>
</action>
<action name="*_*"class="org.struts2.lesson05.{1}Action"
method="{2}">
<result>/WEB-INF/News/{0}.jsp</result>
</action>
</package>
<package name="login"extends="struts-default"
namespace="/login">
<action name="loginPage"
class="org.struts2.lesson05.LoginAction">
<result>/WEB-INF/News/login.jsp</result>
</action>
</package>
4.全局结果
在某些场景中,可能有多个action需要访问同一个结果,例如在论坛系统中,用户在发帖回帖时都需要先登录,这时,我们就需要配置一个全局的login
结果了。

全局结果也是在包中定义的,在这个包中的所有action可以共享全局结果,全局结果也是使用result结果来配置,只不过不是在action元素中嵌套,
而是在元素中嵌套。

<package name="global"extends="struts-default"
namespace="/bbs">
<global-results>
<result name="error">/WEB-INF/error.jsp</result>
<result name="login"
type="redirectAction">login</result>
</global-results>
<action name="addAriticle"
class="org.struts2.lesson05.bbs.AddAriticleAction">
<result>/WEB-INF/BBS/list.jsp</result>
</action>
<action name="login"
class="org.struts2.lesson05.bbs.LoginAction">
<result>/WEB-INF/BBS/login.jsp</result>
</action>
</package>
当请求/bbs/addAriticle.action时,AddAriticleAction的Execute方法如果返回login结果码,那么框架将首先在addAriticle这个action的配置中查找嵌套的局部结果。

如果没有找到匹配的局部结果,那么就在全局结果中查找,找到后,应用redirectAction结果类型将请求重定向到/bbs/login.action,如果用户登录失败或者发帖失效,Action 返回error结果码,此时全局中的error.jsp页面将呈现给用户。

5.动态结果。

相关文档
最新文档