常用的结果集类型:
1.dispather:转发到某个页面(默认)
2.chain:转发到某个action,多个action的链式结构。(如果需要用户填写的信息分好多个页面,但是又不想一个页面提交后立即保存,而是所有页面都填写完的时候再一起保存,这时候就需要用chain。多个action都存在于值桟中)
3.redirect:重定向到一个页面
4.redirectAction:重定向到一个动作名称
5.plainText:以村文本的形式输出jsp页面内容(显示源码)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 自动加载 -->
<constant name="struts.devMode" value="true" />
<!-- 1.redirect -->
<package name="xxc1" namespace="/testRedirect" extends="struts-default">
<action name="testRedirect">
<result type="redirect" name="success">/testRedirect.jsp</result>
</action>
</package>
<!-- 2.chain 转发到当前包下的action-->
<package name="xxc2" namespace="/testChain_current" extends="struts-default">
<action name="testChain">
<result type="chain" name="success">a2</result>
</action>
<action name="a2">
<result type="dispatcher" name="success">/testChain.jsp</result>
</action>
</package>
<!-- 3.chain 转发到其他包下的action-->
<package name="xxc0" namespace="/other" extends="struts-default">
<action name="a2">
<result type="dispatcher" name="success">/testChain_other.jsp</result>
</action>
</package>
<package name="xxc3" namespace="/testChain_other" extends="struts-default">
<action name="testChain">
<!--
<result type="chain" name="success">/other/a2</result> 这样写是错误的,因为标签里的内容struts2把它当作一个action的name属性来看待
以下两种方式是同一个意思
<result type="chain" name="success">a2</result>
<result type="chain" name="success">
<param name="actionName">a2</param>
</result>
-->
<!-- 转发到另一个包下的action -->
<result type="chain" name="success">
<param name="namespace">/other</param><!-- prarm标签里的name属性,去对应的结果集的类中去看属性(必须要有set方法) -->
<param name="actionName">a2</param>
</result>
</action>
</package>
<!-- 4.redirectAction 重定向到一个action 也可以重定向不同包下的action,参照3-->
<package name="xxc4" namespace="/testRedirectAction" extends="struts-default">
<action name="testRedirectAction1">
<result type="redirectAction" name="success">testRedirectAction2</result>
</action>
<action name="testRedirectAction2">
<result type="dispatcher" name="success">/testRedirectAction.jsp</result>
</action>
</package>
<!-- 5.plainText 将网页的源码展现出来 ,转发-->
<package name="xxc5" namespace="/testPlainText" extends="struts-default">
<action name="testPlainText">
<result type="plainText" name="success">/testPlainText.jsp</result>
</action>
</package>
</struts>
1.从上图可以看出,如果要定义结果集就必须实现Result接口。
2.如果要跳转到<result>中定义的结果页面中,就需要继承StrutsResultSupport抽象类,因为这个类中的execute方法中有获取<result>标签中定义的结果页面名称的操作。
3.如果不需要跳转到<result>标签中指定的结果页面,那么只要直接继承Result接口即可。
自定义结果集:
/**
* 继承StrutsResultSupport表示需要获取<result>标签中的内容
*/
public class MyResult extends StrutsResultSupport {
//这个属性在struts.xml中可以通过<result>中的<param name="name">xxc</param>进行赋值
private String name;
protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {//finalLocation表示result标签中的内容
System.out.println(name);
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
RequestDispatcher dispatcher = request.getRequestDispatcher(finalLocation);
dispatcher.forward(request, response);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试Action:
public class TestMyResultAction extends ActionSupport {
public String execute(){
return "myResult";
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 自定义结果集配置 -->
<package name="myResult" namespace="/" extends="struts-default">
<result-types>
<result-type name="myResult" class="com.xxc.myResult.MyResult"></result-type>
</result-types>
</package>
<!-- 测试action,这里需要继承自定义结果集所在的包,这样才有了自定义结果集的跳转方法 -->
<package name="testMyResult" namespace="/" extends="myResult">
<action name="testMyResult" class="com.xxc.myResult.TestMyResultAction">
<!--
<result name="myResult">index.jsp</result>
-->
<result type="myResult" name="myResult"><!-- 注意:这里的type写自定义的结果集的name -->
<!--
StrutsResultSupport抽象类中的有location属性
在execute方法中,通过conditionalParse对location属性的解析获得lastFinalLocation
lastFinalLocation = conditionalParse(location, invocation);
所以这里写param name="location" index.jsp相当于给StrutsResultSupport抽象类中的
location属性赋值,之为index.jsp
-->
<param name="location">index.jsp</param>
<param name="name">xxc</param>
</result>
</action>
</package>
</struts>