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
中,所以采用了
#
的方式来取出值。图示说明:
步骤三,编写链接页面 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 中去。