IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Struts2学习之处理结果

    果冻想发表于 2016-04-28 14:34:48
    love 0

    处理结果原理

    在最开始的《Struts2学习之初见Struts2》这篇文章中,也简单的说了说struts2中如何给请求者发送响应内容。这篇文章就对struts2中到底是如何处理响应结果进行详细的总结。

    通过前面的文章,我们知道Action只是Struts2控制器的一部分,所以它不能直接生成对浏览器的响应。Action只负责处理请求,负责生成响应的视图组件,通常就是JSP页面,而Action会为JSP页面提供显示的数据。当Action处理用户请求结束后,将返回一个普通字符串,整个普通字符串就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把对应的物理视图呈现给浏览者。

    关于浏览者、控制器和视图资源之间的时序图如下:

    Struts2处理结果时序图

    如上图所示,Action处理完用户请求后,并未直接将请求转发给任何具体的视图资源,而是返回一个代表逻辑视图的普通字符串,Struts2框架收到这个逻辑视图后,把请求转发到对应的视图资源,视图资源将处理结果呈现给用户。

    通过返回一个代表逻辑视图的普通字符串,这样的设计将Action类和Struts2框架进行了解耦、分离,提高了更好的代码复用性。这就是在Struts2框架中处理结果的基本原理。

    配置处理结果

    控制器Action会返回一个代表逻辑视图的普通字符串,我们需要在struts.xml中将逻辑视图和物理视图进行映射,Struts2在struts.xml文件中使用<result .../>元素来配置结果,根据<result .../>元素所在位置的不同,Struts2提供了以下两种结果:

    • 局部结果:将<result .../>作为<action .../>元素的子元素配置
    • 全局结果:将<result .../>作为<global-results .../>元素的子元素配置

    配置<result .../>元素时通常需要指定如下两个属性:

    • name:该属性指定所配置的逻辑视图名
    • type:该属性指定结果类型

    下面就分别对如何配置局部结果和全局结果进行详细的总结。

    配置局部结果

    前面的文章中,在struts.xml中都是这样配置逻辑视图和物理视图之间的映射的:

    <action name="login" class="com.jellythink.practise.LoginAction">
        <result name="default">/default.jsp</result>
    </action>
    

    上面的这种写法使用了最简单的形式,使用了很多默认的值,如果写完整了,它应该是这个样子的:

    <action name="login" class="com.jellythink.practise.LoginAction">
        <result name="success" type="dispatcher">
            <param name="location">/success.jsp</param>
        </result>
    </action>
    

    这才是最繁琐,最原始的写法;既指定了需要映射的逻辑视图名(success),也指定了结果类型(dispatcher),并使用子元素的形式来指定实际视图资源。

    对于上面使用<param .../>子元素配置结果的形式,其中<param .../>元素用于配置一个参数,与所有配置参数的地方相似,配置参数需要指定参数名和参数值。<param .../>元素配置的参数名由name属性指定,此处的name属性可以取如下两个值:

    • location:该参数指定了该逻辑视图对应的实际视图资源
    • parse:该参数指定是否允许在实际视图名字中使用OGNL表达式,默认值true。

    由于不同的结果类型可以配置不同的参数,具体的请参见这里。那么为什么这么繁琐的写法可以简化成那么简单的写法呢?

    在配置处理结果时,如果配置<result .../>元素时没有指定location参数,系统将会把<result ...> ... </result>中间的字符串当成实际视图资源;如果没有指定name属性,则name属性采用默认值:success;如果没有指定type属性,则采用Struts2的默认结果类型。基于此,我们就可以写出最简单的形式。

    配置全局结果

    如果将<result .../>元素配置在<global-results .../>元素中,那么该<result .../>元素就配置了一个全局结果,全局结果将对所在包中的所有Action都有效。例如以下配置代码:

    <package name="lee" extends="struts-default" namespace="/Login" >
        <!--定义全局结果-->
        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>
        <action name="login" class="com.jellythink.practise.LoginAction" />
    </package>
    

    虽然在<action .../>中没有配置任何的<result .../>,由于配置了全局结果,所以这并不会妨碍系统的运行。

    如果一个Action里包含了与全局结果里同名的结果,则Action里的局部Result会覆盖全局的Result。也就是说,当Action处理用户请求结束后,首先会在本Action里的局部变量里搜索逻辑视图对应的结果,只有在Action里的局部结果里找不到逻辑视图对应的结果,才会到全局结果里搜索。

    总结

    到这里就总结的差不多了,关于Struts2处理结果的学习,后面还有很多篇文章的,这里只是一个开始了。后面的文章再见。

    果冻想-一个原创技术文章分享网站。

    2016年2月19日 于呼和浩特。

    未经允许不得转载:果冻想 » Struts2学习之处理结果



沪ICP备19023445号-2号
友情链接