(五)Struts2处理结果管理

当Action处理完用户请求时,处理结果应该通过视图资源实现,但将哪个视图呈现给浏览者呢。由<result.../>来决定 Action处理完用户请求后,返回一个普通字符串。整个普通字符串就是一个逻辑视图名。 通过配置文件将逻辑视图和物理视图联系起来。一旦系统收到Action返回的逻辑视图名,就把对应的物理视图呈现给浏览者。 struts2支持多种视图技术。当一个Action处理用户请求后,仅仅返回一个字符串,这个字符串只是逻辑视图名 逻辑视图名可以和很多视图资源关联。例如 JSP,FreeMarker等

 

一、结果类型

1
2
3
4
<result../>属性
            name:逻辑视图名称,应该与Action返回的字符串相同,如果不填写,默认为success
            type:结果视图类型,不写的时候默认值为dispatcher(请求转发)
            name是去哪里,type是怎么去。<br>

二、struts内建支持的常用结果类型:

1
2
3
4
5
6
7
8
9
-chain:Action链式处理。当一个Action处理完成之后,系统并不想转发到视图资源,而是希望下一个Action进行处理,此时就需要这个类型。 
 
-dispatcher:请求转发
 
-redirect:重定向
 
-redirectAction:重定向到其他Action
 
-stream:向浏览器返回一个InputStream的结果类型(一般用于文件下载)

 例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struts.xml文件配置
        当发送请求demo1时,返回的结果转发到demo2的Action处理 
 
        <package name="demo" extends="struts-default">
 
            <action name="demo1" class="com.cad.struts2.Hello" >
                <result type="chain">demo2</result>
            </action>
 
            <action name="demo2" >
                <result name="success" >/welcome.jsp</result>
                <result name="error">/error.jsp</result>
            </action>
 
        </package>

 

三、不同包之间的请求转发  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<package name="demo" extends="struts-default">
 
    <action name="demo1" class="com.cad.struts2.Hello" >
        <result type="chain">
            //因为结果类型都有对应的实现类,我们到请求转发的实现类中发现,有actionName和namespace两个参数,并提供了get和set方法
            //使用的是注入的思想,在请求转发之前,先调用setNamespace和setActionName赋值
            <param name="actionName">demo2</param>
            <param name="namespace">/user</param>
        </result>
    </action>
 
</package>
<package name="demo1" extends="struts-default" namespace="/user">
    <action name="demo2" >
        <result name="success" >/welcome.jsp</result>
        <result name="error">/error.jsp</result>
    </action>
</package>
 
重定向也是一样。

 

四、自定义结果类型

(1)需要实现一个结果类型类,继承StrutsResultSupport类 我们这里面使用我们的验证码小工具,输出一个验证码 至于这个验证码小工具,以前的文章中有详细的说明。

1
2
3
4
5
6
7
8
9
10
11
public class VcodeResult extends StrutsResultSupport {
 
    @Override
    protected void doExecute(String arg0, ActionInvocation arg1) throws Exception {
        VerifiCode v=new VerifiCode();
        HttpServletResponse response=ServletActionContext.getResponse();
        BufferedImage  b=v.getImage();
        v.output(b, response.getOutputStream());
    }
 
}

(2)然后再创建一个Action类 ,什么都不用写

1
2
3
public class VcodeAction extends ActionSupport {
 
    }

(3)在struts.xml中进行配置

1
2
3
4
5
6
7
8
9
10
<package name="vcode" extends="struts-default" >
    //配置我们自定义的结果类型
    <result-types>
        <result-type  name="vcode" class="com.cad.struts2.VcodeResult"></result-type>
    </result-types>
    //我们还是在我们的原页面,所以不需要指定其他页面,type即为我们的自定义结果类型
    <action name="vcode" class="com.cad.struts2.VcodeAction">
        <result name="success" type="vcode"></result>
    </action>
</package

(4)我们可以在自定义的结果类型类中添加get和set方法,来方便我们的一些参数自定义。 例如我们添加了weight,height的get和set方法。

         我们就可以自定义验证码的长宽等。这也又体现了我们的注入思想。 我们前面请求转发前设置nameSpace和actionName和我们做的其实是相同的操作。

  

1
2
3
4
5
6
<action name="vcode" class="com.cad.struts2.VcodeAction">
    <result name="success" type="vcode">
        <param name="weight">100</param>
        <param name="height">100</param>
    </result>
</action>

 

五、全局结果视图和局部结果视图  

我们在包中定义了自己的结果类型,只有在自己的包或者子包中才能使用,在别的包中还是无法使用这个结果类型,为了所有的Action都能使用,我们需要将其变为全局。 我们只需要定义一个包,继承struts2的默认配置文件

然后如果我们需要这个结果类型,只需要我们的包继承这个包即可。 在<global-results>中配置全局参数,所有的action使用这个类型生成的验证码尺寸都一样。

1
2
3
4
5
6
7
8
9
10
11
<package name="myresult" extends="struts-default">
    <result-types>
        <result-type  name="vcode" class="com.cad.struts2.VcodeResult"></result-type>
    </result-types>
    <global-results>
        <result>
            <param name="weight">500</param>
            <param name="height">1000</param>
        </result>
    </global-results>
</package>

  

 

  

  

posted @   跃小云  阅读(282)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示