Action 处理完用户请求后,将返回一个普通字符串,整个普通字符串就是一个逻辑视图名,必须在 struts.xml 文件中完成逻辑视图和物理视图资源的映射。一旦系统收到 Action 返回的某个逻辑视图名,系统就会把对应的物理视图资源呈现给用户。
Struts2在 struts xml 文件中使用<result.../>元素来配置结果,根据<result.../>元素所在位置的不同, Struts2提供了两种结果:
局部结果:将<result.../>作为<action.../>元素的子元素配置。
全局结果:将<result.../>作为<global-results.../>元素的子元素配置。
局部结果
局部结果是通过在<action.../>元素中定义<result.../>子元素进行配置的,一个<action.../>元素可以有多个<result.../>子元素 ,这表示 Action 可以对应多个结果。
配置<result.../>元素时通常需要指定如下两个属性:
name:该属性指定所配置的逻辑视图名。
type:该属性指定结果类型。
<action name="Login" class="LoginAction">
<!--为 success 的逻辑视图配置 Result, type 属性指定结果类型-->
<result name="success" type="dispatcher">
<!--指定该逻辑视图对应的实际视图资源-->
<param name="location">thank_you.jsp</param>
</result>
</action>
该<result.../>元素下<param.../>子元素配置的参数名由 name 属性指定,此处的 name 属性可以为如下两个值。
location:该参数指定了该逻辑视图对应的实际视图资源。
parse:该参数指定是否允许在实际视图名字中使用 OGNL 表达式,该参数值默认为 true 。如果设置该参数值为 false ,则不允许在实际视图名中使用表达式。通常无须修改该属性值。
因为通常无须指定 parse 参数值, 也可以省略type="dispatcher",这是系统将使用默认类型就是type="dispatcher",如果又省略了 name="success"即name属性,系统将采用默认的 name 属性值 success,因此可采用如下简化形式来配置实际视图资源:
<action name="Login" class="LoginAction">
<result>thank_you.jsp</result>
</action>
结果类型type
Struts2内建的支持结果类型如下:
chain 结果类型 :Action 链式处理的结果类型。
dispatcher 结果类型:默认结果类型,用于指定使用 JSP 作为视图的结果类型。
freemarker 结果类型:用于指定使用 FreeMarker 模板作为视图结果类型。
httpheader 结果类型:用于控制特殊的 HTTP 行为的结果类型。
redirect 结果类型:用于直接跳转到其他 URL 的结果类型。
redirectAction 结果类型:用于直接跳转到其他 Action 的结果类型。
stream 结果类型:用于向浏览器返回 InputStream (一般用于文件下载)。
velocity 结果类型:用于指定使用 Velocity 模板作为视图的结果类型。
xslt 结果类型:用于与 XML/XSLT 整合的结果类型。
plainText 结果类型:用于显示某个页面的原始代码的结果类型。
plainText 结果类型
使用 plainText 结果类型时可指定如下两个参数:
location:指定实际的视图资源。
charSet:指定输出页面时所用的字符集。
它主要用于显示实际视图资源的源代码,配置代码如下:
<result type="plainText">
<!--指定实际的视图资源-->
<param name="location">welcome.jsp</param>
<!--指定使用指定的字符集来处理页面代码-->
<param name="charSet">GBK</param>
</result>
在上面的配置片段中,配置<result.../>元素时,并未指定<result.../>元素的 name 属性,意味着 name 属性值为 success ;上面的粗体字代码显式指定了 type 属性值为 plainText 类型,plainText 结果类型指定将视图资源当成普通文本处理,所以该结果类型会导致输出页面的源代码。
redirect结果类型
配置 redirect 类型的结果,可以指定如下两个参数:
location :该参数指定 Action 处理完用户请求后跳转的地址。
parse:该参数指定是否允许在 location 参数值中使用表达式,该参数值默认为 true
指定 redirect 结果类型会将请求 redirect (重定向)到指定的视图资源,重定向会丢失所有的请求参数、请求属性,也会丢失Action 的处理结果。该效果与HttpServletResponse的sendRedirect(String)方法相同。
<action name="login" class="LoginAction">
<!--指定结果的类型为 redirect,这意味着系统该 Action 将重定向到 welcome jsp 页面-->
<result type="redirect">/welcome.jsp</result>
</action>
使用 redirect 类型的结果时,不能重定向到用/WEB-INF/路径下任何资源,因为重定向相当于重新发送请求,而Web 应用的/WEB-INF/路径资源是受保护资源。
redirectAction结果类型
当需要让一个 Action 处理结束后,直接将请求重定向(是重定向,不是转发) 另一个 Action 时, 就应该使用redirectAction结果类型。
配置 redirectAction 结果类型时,可以指定如下两个参数:
actionName:该参数指定重定向的 Action 名。
namespace:该参数指定需要重定向的 Action 所在的命名空间。
下面是一个使用 redirectAction 结果类型的配置实例:
<package...>
<action name="login" class="LoginAction">
<!--配置 redirectAction 结果类型的 Result ,重定向另一个命名空间的 Action-->
<result type="redirectAction">
<!--指定重定向的 actionName-->
<param name="actionName">dashboard</param>
<!--指定重定向的 Action 所在的命名空间-->
<param name="namespace">/secure</param>
</result>
</action>
<package ...>
<!--定义被转入的 Action-->
<action name="dashboard" class="Dashboard">
<result>/WEB- INF/content/dashboard.jsp</result>
<!--配置 redirectAction 结果类型的 Result,重定向同一个命名空间的 Action -->
<result name="error" type="redirectAction">error</result>
</action>
<action name="error">
<result>/WEB-INF/content/error.jsp</result>
</action>
</package>
动态结果
动态结果的含义是指在指定实际视图资源时使用了表达式 ,通过这种语法可以允许 Action 理完用户请求后,动态转入实际的 视图资源。
<action name="crud_*" class="lee.CrudAction" method="{1}">
<result name="input">/WEB-INF/content/input.jsp</result>
<result>/WEB-INF/content/{1}.jsp</result>
<alllowed-methods>create</allowed-methods>
</action>
上面的配置 片段有一个 name="crud_*" 的 Action ,这 Action 可以处理所有匹配 crud_*.action 模式 的请求。例如有一个 crud_create.action 的请求,系统将调用 lee.CrudAction 类的 create()方法来处理用户请求。当Action 处理用户请求结束后,配置了两个结果。当处理结果为 input 字符串时,系统将转/WEB-INF/content/input.jsp页面。当处理结果为 success 字符串 时, 系统将转入 create.jsp 页面。这就是资源的动态生成, crud_create 匹配 crud_*模式时, 第一个星号(*)的值是 create ,因/WEB-INF/content/{1}.jsp的{1}代表 create,对应/WEB-INF/content/create.jsp 资源。
与配置 class 属性和 method 属性相比 ,配置<result.../>元素 ,还允许使用 OGNL 表达式,这种用法允许根据 Action 属性值来定位视图资源。
Action 属性值决定物理视图资源
配置<result.../>元素时, 不仅可以使用${N}表达式形式来指定视图资源,还可以使用${属性名}的方式来指定视图资源。
见如下的例子:
MyAction.java
publc class MyAction extends ActionSupport{
//封装请求参数的 target 成员变量
private String target;
//省略了所有的 setter getter 方法
public String execute() throws Exception{
addActionMessage (”恭喜您,您己经成功转向 ;
return SUCCESS ;
}
...
}
struts.xml例子:
<struts>
...
...
<package name="lee" extends="struts-default">
<!--配置处理用户请求的 Action-->
<action name="MyAction" class="MyAction">
<!--配置 Result ,使用 OGNL 表达式来指定视图资源-->
<result>/WEB-INF/content/${target}.jsp</result>
</action>
</package>
...
...
</struts>
<result>/WEB-INF/content/${target}.jsp</result>:这里要求在对应的 Action 类里应该包含 target 属性一一该属性值将决定实际的视图资源。如果没有target 属性游览器则会报错。
全局结果
当在<global-results.../>元素中配置</result.../>元素时,该</result.../>元素配置了一个全局结果,全局结果将对所有的 Action 都有效。
<package name="lee" extends="struts-default">
<!--定义全局结果-->
<global-results>
!一配置 Result ,使用 OGNL 表达式来指定视图资源一〉
<result>/WEB-INF/content/${target}.jsp</result>
</global-results>
<action name="MyAction" class="MyAction"/>
...
...
</package>
上面的配置片段配置了Action ,但在该 Action 没有配置任何的结果一一但这不会影响系统的运转,因为提供了一个名为 success 全局结果,而这个全局结果的作用范围对所有的 Action 都有效。
如果一个 Action 里包含了与全局结果同名的结果,局部结果会覆盖全局结果。