玩技术,Geeker
一个原创技术文章分享网站

Struts2学习之处理结果

处理结果原理

在最开始的《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学习之处理结果

分享到:更多 ()

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    赞!给初学的我很多指引!

    GSM6个月前 (09-12)回复

在这里玩技术,享受技术带来的疯狂

捐赠名单关于果冻