一、result说明:
一个result代表了一个可能的输出。当action类的方法执行完后,会返回一个字符串,Struts2框架根据这个字符串去匹配该action下的result,然后像用户输出视图(也可以是重定向,接下来会讲)。
二、result的配置:
属性 | 是否必须 | 说明 |
name | 否 | 指定result的逻辑名 |
type | 否 | 指定result的类型,不同类型的result代表了不同类型的结果输出 |
<package name="default" extends="struts-default">
<action name="login" class="com.struts2.action.UserAction" method="login">
<result name="success" type="dispatcher">/index.jsp</result>
<result name="input" type="dispatcher">/login.jsp</result>
</action>
</package>
1、name属性:
在之前的关于struts.xml文件的action配置的说明中有说明com.opensymphony.xwork2.Action接口中定义了5个字符串常量(结果视图):
public static final String SUCCESS = "success"; // 数据处理成功 (成功页面)
public static final String NONE = "none"; //页面不跳转 return null; 效果一样,常用于ajax请求时
public static final String ERROR = "error"; //数据处理发送错误 (错误页面)
public static final String INPUT = "input"; //用户输入数据有误,通常用于表单数据校验 (输入页面)
public static final String LOGIN = "login"; //主要权限认证不通过 (登陆页面)
这个5个常量分别相应地对应着开发中常遇到的结果视图。
name属性可以省略,默认是success(和action中method属性省略默认就是execute()方法一样)。当然,除了这5种视图,Struts2允许定义任意的视图名。在action类中的方法中,方法的返回结果必须是一个字符串,即开发人员在方法中可以返回任意的字符串,并且在result元素的name属性中匹配上即可。
public String login() {
if("zhangsan".equals(username) && "123456".equals(password)){
return SUCCESS;
}
return INPUT;
}
2、结果类型:
在调用action类对请求进行处理后,就要向用户显示一个结果视图,这些视图由不同的结果类型来管理的。在Struts2中,可以通过实现com.opensymphony.xwork2.Result接口以表明是结果类型。在Struts2中预定了多种结果类型:
结果类型 | 说明 |
chain | 用于action的链式处理 |
dispatcher | 用于web资源的集成,包括jsp的集成 |
freemaker | 用于freemaker的集成 |
httpheader | 用于控制特殊的http行为 |
redirect | 用于重定向到另外的URL(web资源) |
redirectAction | 用于重定向到另外的action映射 |
stream | 用于向浏览器返回一个InputStream |
xslt | 用于XML/XSLT集成 |
painText | 用于显示某个特定页面(如jsp/HTML)的原始内容(即页面源代码) |
一般开发中常用的就这几个:chain、dispatcher、redirect、redirectAction、stream。下面对这几个结果类型进行讲解用法:
(1)chain:它也相当于请求转发。它一般情况下用于从一个action跳转到另一个action。
<package name="default" extends="struts-default">
<action name="login" class="com.struts2.action.UserAction" method="login">
<result name="success" type="dispatcher">/index.jsp</result>
<result name="input" type="chain">
<param name="actionName">test</param>
<param name="namespace">/aaa</param>
</result>
</action>
</package>
<package name="/aaa" namespace="/aaa" extends="struts-default">
<action name="test" class="com.struts2.action.TestAction">
<result type="dispatcher">/test.jsp</result>
</action>
</package>
如上代码所示,如果用户访问localhost://struts2_test01/login.action得到的字符串结果是"input",则将跳转到命/aaa/test.action下的execute方法,即将请求转发至TestAction类的execute方法进行处理。
注:上面的代码中,因为是跨namespace进行请求转发,所以需要在<result>元素中进行进一步的详细指定actionName和namespace,如果是转发到同一个namespace,则直接<result name="input" type="chain">/login</result>即可。
(2)dispatcher:它代表的是请求转发,也是默认值。它一般用于从action跳转到页面(jsp),这个是result的默认值。
<action name="test" class="com.struts2.action.TestAction">
<result type="dispatcher">/test.jsp</result>
</action>
(3)redirect:它代表的是重定向 它一般用于从action跳转到页面
<package name="default" extends="struts-default">
<action name="login" class="com.struts2.action.UserAction" method="login">
<result name="success" type="dispatcher">/index.jsp</result>
<result name="input" type="redirect">/login.jsp</result>
</action>
</package>
上面的代码中,如果login.action执行结果返回的字符串是"input",则Struts2框架会告诉浏览器(重定向)去访问localhost://struts2_test01/login,jsp,实现了重定向(浏览器地址会改变成:localhost://struts2_test01/login.jsp)。其中不能重定向到action,如果需要重定向到action,使用redirectAction即可。
(4)redirectAction:它代表的是重定向 它一般用于从action跳转另一个action。
<package name="default" extends="struts-default">
<action name="login" class="com.struts2.action.UserAction" method="login">
<result name="success" type="dispatcher">/index.jsp</result>
<result name="input" type="redirectAction">
<param name="actionName">test</param>
<param name="namespace">/aaa</param>
</result>
</action>
</package>
<package name="/aaa" namespace="/aaa" extends="struts-default">
<action name="test" class="com.struts2.action.TestAction">
<result type="dispatcher">/test.jsp</result>
</action>
</package>
上面的代码中,如果login.action执行结果返回的字符串是"input",则Struts2框架会告诉浏览器(重定向)去访问localhost://struts2_test01/aaa/test.action,实现了重定向(浏览器地址会改变成:localhost://struts2_test01/aaa/test.action)。其中不能重定向到jsp,只能是action,如果需要重定向到jsp,使用redirect即可。
(5)stream:代表的是服务器端返回的是一个流,一般用于下载。如:验证码的小图片等。不过也不太常用。