当前位置:文档之家› Struts2配置Result

Struts2配置Result

配置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.ServletDispatcherResult"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.ServletDispatcherResult"default="true"/><result-type name="freemarker"class="org.apache.struts2.views.freemarker.FreemarkerResult"/><result-type name="httpheader"class="org.apache.struts2.dispatcher.HttpHeaderResult"/> <result-type name="redirect"class="org.apache.struts2.dispatcher.ServletRedirectResult"/><result-type name="redirectAction"class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/><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默认值是true2>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结果了。

相关主题