struts2笔记2.5

系统 1428 0

11.Result 配置详解

说明 :在前面的许多案例中我们所用到的 Action 基本都继承自 ActionSupport 这个类,而在这个类中我们定义了五个字段: SUCCESS NONE ERROR INPUT LOGING 。我们可以直接返回这些字段值,这些字段值实质是被定义成: String SUCCESS=”success” 这样的形式,所以我们只要在 Result 元素中用它们的小写即可。
<result>
标准完整形式如下:

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

       < param name = "location" > /default.jsp </ param >

</ result >

如果我们都采用默认的形式,最终可以简写成: < result > /default.jsp </ result >

探讨 type 类型

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

以上对 type 类型作简要的说明,下面来看实例:当一个 Action 处理后要返回的 Result 是另一个 Action 时,作如何配置,关键就是配置 type 类型。下面建立 struts2result 项目 说明
步骤一:建立两个 Action:TestAction Test2Action
步骤二: web.xml 配置省略。 struts.xml 主要配置内容如下:

< struts >

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

       < action name = "test" class = "com.asm.TestAction" >

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

              < param name = "actionName" > test2 </ param >

           </ result >

       </ action >

 

       < action name = "test2" class = "com.asm.Test2Action" >

           < result name = "success" > /test2Suc.jsp </ result >

       </ action >  

    </ package >

</ struts >
说明 :在名为“ test ”的 action 中,我们配置 result 元素的 type 类型值为 chain ,意为将继续把 Action 传递到下一个名为 test2 Action 中去,在 test2.action 中会把页面转向到 test2Suc.jsp 中去。在 type 类型为 chain 时,它的 param 4 个值可配,除了这里用到的 name=”actionName” 外(必须配置,否则报错),还有 name=namespace|method|skipActions 。其中 namespace 指定要转向到 action 的名字空间,由于此处是转到 Action 位于同一个 namespace 下,而 namesapace 的默认值 the current namespace ,所以可以省略不写 ( 需要说明的是如果要跳到别的名称空间的 action 中去,除了使用 namespace 指定外,还可以用: / 要跳去 action 所在名称空间的值 / 要跳去的 action name ) Method 用于指定转向到一个目标 action 所调用的方法,默认是调用下一个 action execute 方法,所以此处仍可以省略。 SkipActions 是一个可选的属性,一般不用。具体可以参看 chain 所对应类的 api 帮助。
在本实例中,我们还在 TestAction 中设定一个 username 字段,并在 execute 方法执行为它赋了值,并在 test2Suc.jsp 中引用了此值。其实这种做法在 web 开发中还是很有用处,比如可以代替隐藏域。需要注意的是之所以在 action 的传递中能把设定的这个值保存下去,主要是因为转向都是服务器跳转。如果我们跳转时采取了客户端跳转,比如在 test2 action result 中指定 type 类型为 redirect ,要想传递参数可以在 result 指向的 jsp 页面中附加参数即可,我们可以在 test2 action result 中写成:
< result name = "success" type = "redirect" >
/test2Suc.jsp?username=${username}
</ result >    随后在 test2Suc.jsp 页面中引用时会出现三个问题: 1.EL 表达式引用失效,( EL 表达式应该使用 ${param.username} 形式)。我们也可以使用 <%=request.getParameter("username")%> 获取参数值。   2. 由于在前面的 TestAction 中设定的值为中文,而附加到这里的 uri 请求的参数后面时会出现乱码问题。(可以使用 URI 编码再解码解决此问题) 3. 值栈取值失效:因为 每一次 request 共享同一个值栈,所以服务器端的 forward 跳转也是能共享同一值栈得。但是着当 test action 执行后把请求交由 test2 action 时, test2 action 采取的是 redirect 重定向到 test2Suc.jsp 页面,这时其实就是重发的一次 request, 所以在 test action 保存的值栈内容全部失效。这也就是为什么我们要附加参数的原因。而参数是保存在 actionContext 中,所以采用了 # 的方式来取出值。图示说明:

 
struts2笔记2.5
 

步骤三,编写链接页面 index.jsp 。发布测试:

全局 result

如果我们所有的 action 均有可能跳到相同的页面,则不防使用全局 result 。为了方便引用我们专门建立一个 package 来存放公共的 result 。在会用到个全局的跳转时,只需要把继承自这个公共的 package 即可。

建立公共包,代码如下:

< package name = "pubResult" extends = "struts-default" abstract = "true" >

       < global-results >

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

       </ global-results >

</ package >

由于它下面没的 action 配置,所以我们可以像默认的 struts-default 包一样,声明 abstract=true ,这样声明表示此 packgage 下不会有 action ,它一般是用来让别的 package 继承。随后再在要用到全局 result 中引用这个公共的 package 。代码如下:

< package name = "testGlobal" extends = "pubResult" >

    < action name = "error" class = "com.asm.ErrorAction" ></ action >

    < action name = "error2" class = "com.asm.Error2Action" ></ action >

</ package > 这样操作相当于把全局的 result 加到了此 package 下的所有 action 中去。

 

struts2笔记2.5


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论