目录

1struts2result. 1

2result类型... 1

3chainredirectredirectaction的区别... 3

4Result关于param的理解... 3

5、全局视图... 4

6、自定义(扩展)result类型... 4

1struts2result

一个提交到服务器的处理通常可以分为两个阶段,第一个阶段查询服务状态(查询或者更新数据库),第二阶段选择一个合适的结果页面其返回给用户。

struts2提供了对不同种类返回结果的支持,常见的有JSPFreeMarkerVelocity等。

struts2支持同的返回类型:

chain         用来处理Action

dispatcher        用来转向页面,通常用来处理JSP(默认)

freemarker       处理FreeMarket模板

httpheader       用来控制特殊的Http行为

redirect    重定向到一个URL

redirectAction          重定向到一个Action

stream     向浏览器发送InputStream对象,通常用来处理文件下载。

velocity    处理Velocity模板

xslt            处理XML/XSLT模板

plaintext           显示原始文件内容,例如文件的源代码。


2result类型

1dispatcher:服务器跳转到页面,通常来处理JSP,默认类型。

2redirect:重定向到页面。

public String redirect() {  

    message= "message中有值";  

    return"redirect";  

}  

struts.xml

<package name="chapter3"namespace="/chapter3" extends="struts-default">  

       <action name="redirectAction"

class="chapter3.action.Chapter3Action"method="redirect">  

           <result name="redirect"type="redirect">/redirect.jsp</result>  

       </action>  

</package>  

注意的地方:外部中转不能带值过去,并且页面不能受保护

传参数:

<action name="redirectAction"class="chapter3.action.Chapter3Action" method="redirect">  

   <result name="redirect"type="redirect">/redirect.jsp?message=${message}</result>  

</action>  

页面:

${param.message}<br>

3chain类型

服务端(内部)跳转到其他的Action

action:

public String action2() {  

   message = "action2中设置的值";  

   return "action2";  

}  

struts.xml

<package name="chapter32"namespace="/chapter32" extends="struts-default">  

   <action name="action2"class="chapter3.action.Chapter3Action"method="action2">  

       <result name="action2" type="chain">  

           <paramname="actionName">redirectAction</param>  

           <param name="namespace">/chapter3</param>  

       </result>  

   </action>  

</package>  

4redirectAction:外部跳转到Action

action

public String action3() {  

   message = "action3中设置的值";  

   return "action3";  

}  

struts.xml

<action name="action3"class="chapter3.action.Chapter3Action"method="action3">  

   <result name="action3"type="redirectAction">redirectAction</result>  

</action>  

跨命名空间的外部跳转:

public String action4() {  

   message = "我是action4中设置的值";  

   return "action4";  

}  

struts.xml

<action name="action4"class="chapter3.action.Chapter3Action"method="action4">  

   <result name="action4"type="redirectAction">  

       <param name="actionName">redirectAction</param>  

       <param name="namespace">/chapter3</param>  

   </result>  

</action>  


3chainredirectredirectaction的区别

Chain Result

这个result调用另外的一个action,连接自己的拦截器栈和result

actionName (默认) - 被调用的action的名字

namespace - 被调用的action的名称空间. 如果名称空间为空,这默认为当前名称空间

method - 用于指定目标action的另一个方法被调用. 如果空,默认为excute方法

Redirect Action Result

这个Result使用ActionMapperFactory提供的ActionMapper来重定位浏览器的URL来调用指定的action(可选的)namespace。可以在任意点上改变URL模式而不会影响你的应用程序,因此强烈推荐使用这个Result而不是标准的redirect result来解决重定位到某个action的情况。

ActionName (默认) - 重定位到的action

namespace - action的名称空间. 如果为null,则为当前名称空间

Redirect Result

调用{@link HttpServletResponse#sendRedirect(String) sendRedirect}方法来转到指定的位置。HTTP响应被告知使浏览器直接跳转到指定的位置(产生客户端的一个新请求)。这样做的结果会使刚刚执行的action(包括action实例,action中的错误消息等)丢失, 不再可用。这是因为action是建立在单线程模型基础上的,传递数据的唯一方式就是通过Session或者可以为Ognl表达式的web参数(url?name=value)

location (默认) - action执行后跳转的地址.

parse - 默认为true. 如果设置为false, location参数不会被当作Ognl表达式解析。



注:

1)当使用type=“redirectAction”或type=“redirect”提交到一个action并且需要传递一个参数时。这里是有区别的:a.使用type=“redirectAction”时,结果就只能写Action的配置名,不能带有后缀:.action”;b.使用type=“redirect”时,结果应是action配置名+后缀名

2redirectaction处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失。

   3redirect-actionaction处理完后重定向到一个action,请求参数全部丢失,action处理结果也全部丢失。

   4chainaction处理完后转发到一个action,请求参数全部丢失,action处理结果不会丢失。


4Result关于param的理解

param参数设置:

name:可选属性,指定设置参数名称

value:可选属性,指定参数的值

一般用于返回jsonstream、字符等等。

5、全局视图
<package name="test3" namespace="/test3" extends="struts-default">
    <!-- 全局的视图 -->
    <global-results>
        <result name="message">/WEB-INF/page/Global.jsp</result>
    </global-results>
                                                                        
    <!-- 使用全局视图   如果<action>中没有相应的<result>,Struts2就会使用全局的<result> -->
    <action name="message"  class="cn.action.ActionTest" method="global">
    </action>
</package>
                                                                    
<!—在其他包中使用全局视图      就要使用包的继承 如下: -->
<package name="base" extends="struts-default">
    <!-- 全局的视图 -->
    <global-results>
        <result name="message">/WEB-INF/page/Global.jsp</result>
    </global-results>
</package>
<!-- 使用全局视图   extends="base"-->
<package name="test4" namespace="/test4" extends="base">
    <action name="message"  class="cn.action.ActionTest" method="global">
    </action>
</package>
6、自定义(扩展)result类型

   通过查找资料得知(http://hi.baidu.com/hfsdaccp/item/26e261873d025655840fabaa)自定义的实现方法:


实现方式:直接扩展struts2的结果集StrutsResultSupport

例如实现返回类型是String的类型:

public class StringResultType extends StrutsResultSupport {
    private static final long serialVersionUID = 1L;
    private String contentTypeName;
    private String stringName = "";
    public StringResultType() {
        super();
    }
    public StringResultType(String location) {
        super(location);
    }
    protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {
        HttpServletResponse response = (HttpServletResponse) invocation
                .getInvocationContext().get(HTTP_RESPONSE);
        // String contentType = (String)
        // invocation.getStack().findValue(conditionalParse(contentTypeName,
        // invocation));
        String contentType = conditionalParse(contentTypeName, invocation);
        if (contentType == null) {
            contentType = "text/plain; charset=UTF-8";
        }
        response.setContentType(contentType);
        PrintWriter out = response.getWriter();
        // String result = conditionalParse(stringName, invocation);
        String result = (String) invocation.getStack().findValue(stringName);
        out.println(result);
        out.flush();
        out.close();
    }
    public String getContentTypeName() {
        return contentTypeName;
    }
    public void setContentTypeName(String contentTypeName) {
        this.contentTypeName = contentTypeName;
    }
    public String getStringName() {
        return stringName;
    }
    public void setStringName(String stringName) {
        this.stringName = stringName;
    }
}

使用的方法:

Action

package test;
import com.opensymphony.xwork2.ActionSupport;
public class MyAction extends ActionSupport{
    String  result="abc";
    public String ajax() {
        return "ajaxResponse";
    }
    public String getResult() {
        return result;
    }
    public void setResult(String result) {
        this.result = result;
    }
}

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="test" extends="struts-default">
        <result-types>
            <result-type name="string" class="test.StringResultType"></result-type>
        </result-types>      
        <action name="myAction" class="test.MyAction" >
            <result name="ajaxResponse" type="string">
                <param name="stringName">result</param>
            </result>
        </action>
    </package>
</struts>

   无非也就是将string结果集进行申明,然后给返回“ajaxResponse”的结果绑定变量名。这里定义返回ActionString  result变量,即“abc”。