一。Action 配置结果
<action name="Login" class="lee.LoginAction"> <!-- 为success 的逻辑视图配置 Result ,type 属性指定结果类型 --> <result name="success" type="dispatcher"> <!-- 指定该逻辑视图对应的实际视图资源 --> <param name="location">/a.jsp</param> </result> </action>
<param name...>的name属性有如下2个值:
》 location:参数指定了逻辑视图对应的实际视图资源
》 parse:指定是否允许在实际视图名中使用 OGNL 表达式,默认 true。
以上可以简写为:
<action name="Login" class="lee.LoginAction"> <!-- 为success 的逻辑视图配置 Result ,type 属性指定结果类型 --> <result name="success">/a.jsp </result> </action>
之所以能简写,是因为:
如果 <result> 没有指定 location 参数 ,系统将<result > /a.jsp </result>中间的字符串当成实际视图;如果没有指定name属性,则 name 属性采用默认值: success ;如果没有指定 type 属性,则采用默认结果 dispatcher 类型。
struts 支持的处理结果类型
struts-default.xml 文件中
<result-types> <!-- Action 链式处理的结果类型 --> <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult" /> <!-- 用于与 JSP 整合的结果类型 --> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true" /> <!-- 用于与freeMarker 整合的结果类型 --> <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult" /> <!-- 用于控制特殊的 HTTP 行为的结果类型 --> <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult" /> <!-- 用于直接跳转到其他 URL 的结果类型 --> <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult" /> <!-- 用于直接跳转到其他 Action 的结果类型 --> <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult" /> <!-- 用于向浏览器返回一个 InputStream 的结果类型 --> <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult" /> <!-- 用于整合 Velocity 的结果类型 --> <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult" /> <!-- 用于整合 XML/XSLT 的结果类型 --> <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult" /> <!-- 用于显示某个页面原始代码的结果类型 --> <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> </result-types>
除了以上内容,在 struts2-jasperreports-plugin.jar 的 struts-plugin.xml 还定义了别的 如 JSF之类的结果类型
二。plainText 结果类型
plainText 是把该页面的 HTML代码显示在浏览器中
<action name="Login" class="lee.LoginAction"> <!-- 为success 的逻辑视图配置 Result ,type 属性指定结果类型 --> <result name="success" type="plainText">/a.jsp</result> </action>
上面的代码,在页面中会出现 中文乱码问题, 解决办法如下:
<action name="Login" class="lee.LoginAction"> <!-- 为success 的逻辑视图配置 Result ,type 属性指定结果类型 --> <result name="success" type="plainText"> <!-- 指定该逻辑视图对应的实际视图资源 --> <param name="location">/a.jsp</param> <!-- 指定使用特定的编码集来处理页面代码 --> <param name="charSet">GBK</param> </result> </action>
三。redirect 结果类型
这个类型与 dispatcher 相对, dispatcher 是将请求转发 “Forward” 到指定的 JSP ; 而 redirect 是将请求重定向 “Redirect” 到指定的视图资源。
redirect 是 HttpServletResponse 的 sendRedirect(String),重定向就是重新产生一个请求,因此此前的所有请求参数,请求属性, Action 实例 和 Action 中封装的属性全部丢失。重定向以后地址栏显示新的地址。
<action name="Login" class="lee.LoginAction"> <!-- 为success 的逻辑视图配置 Result ,type 属性指定结果类型 --> <result name="success" type="redirect">/a.jsp</result> </action>
四。redirectAction 结果类型
redirectAction 与 redirect相似,区别是 redirectAction 使用 ActionMapperFactory 提供的 ActionMapper 来重定向请求。
当需要让一个 Action 处理结束后,直接重定向到另一个 Action 时,使用。
redirectAction有 2 个 参数
1. actionName : 该参数指定重定向的 Action 名
2. namespace : 该参数指定需要重定向的 Action 所在的命名空间
<package name="public" extends="struts-default"> <action name="Login" class="lee.LoginAction"> <result name="success" type="redirectAction"> <!-- 指定重定向的 actionName --> <param name="actionName">dashboard</param> <!-- 指定重定向的 actionName 的命名空间 --> <param name="namespace">/secure</param> </result> </action> </package> <package name="secure" extends="struts-default" namespace="/secure"> <action name="dashboard" class="lee.Dashboard"> <result name="success">dashboard.jsp</result> <!-- 配置一个 在同一个命名空间中的 redirectAction --> <result name="error" type="redirectAction">error</result> </action> <action name="error"> <result>error.jsp</result> </action> </package>
再次声明 redirectAction 也是重定向,所以 此前的 Action 处理结果,请求参数,请求属性都会丢失。
五。动态结果
也就是之前说过的 使用表达式语法匹配
<action name="crud_*" class="lee.CrudAction" method="{1}"> <result name="input">/input.jsp</result> <result>/{1}.jsp</result> </action>
上面代码可以处理所有匹配 crud_*.action 的请求。
例如: crud_create.action 请求,系统将调用 lee.CrudAction 类的create()方法来处理。当处理结果为 input 字符串时,将转到 /input.jsp 页面; 当处理结果为 success 字符串时,将转入 create.jsp 页面。
以上内容还能使用 OGNL 表达式让请求参数来决定结果
六。请求参数决定结果
${属性名} 处理请求,属性名 就是对应 Action 实例里的属性 ,而且还能使用完全的 OGNL 表达式, 如下:
${属性名.属性名.属性名}
<action name="crud_*" class="lee.CrudAction" method="{1}"> <result name="input" type="redirect">edit.action?skill=${curSkill.name}</result> </action>
对于上面的代码, 要求在对应的 Action 实例里 包含 curSkill 属性,并且 curSkill 属性必须包含 name 属性,否则${curSkill.name} 将为 null
例子:
class MyAction extends ActionSupport{
private String target;
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public String execute() throws Exception{
this.target="yo";
return SUCCESS;
}
}
<action name="myAction" class="lee.MyAction"> <result>/${target}.jsp</result> </action>
以上 action 会跳转到 myAction 中 target 的值 所指向的页面
七。全局结果
<package name="public" extends="struts-default"> <global-results> <result name="success">/&{target}.jsp</result> </global-results> <action name="Login" class="lee.LoginAction" /> </package>
注意:
1. Action 内没有匹配任何的结果,但这不会影响系统运转,因为有一个 success 的全局 result ,这个全局的结果的作业范围对所有的 Action 都有效。
2. 如果 Action 里包含一个与全局结果同名的 result ,则 Action 里的局部 result 会覆盖 global-results 里的 result。