在最开始的《Struts2学习之初见Struts2》这篇文章中,也简单的说了说struts2中如何给请求者发送响应内容。这篇文章就对struts2中到底是如何处理响应结果进行详细的总结。
通过前面的文章,我们知道Action只是Struts2控制器的一部分,所以它不能直接生成对浏览器的响应。Action只负责处理请求,负责生成响应的视图组件,通常就是JSP页面,而Action会为JSP页面提供显示的数据。当Action处理用户请求结束后,将返回一个普通字符串,整个普通字符串就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把对应的物理视图呈现给浏览者。
关于浏览者、控制器和视图资源之间的时序图如下:
如上图所示,Action处理完用户请求后,并未直接将请求转发给任何具体的视图资源,而是返回一个代表逻辑视图的普通字符串,Struts2框架收到这个逻辑视图后,把请求转发到对应的视图资源,视图资源将处理结果呈现给用户。
通过返回一个代表逻辑视图的普通字符串,这样的设计将Action类和Struts2框架进行了解耦、分离,提高了更好的代码复用性。这就是在Struts2框架中处理结果的基本原理。
控制器Action会返回一个代表逻辑视图的普通字符串,我们需要在struts.xml中将逻辑视图和物理视图进行映射,Struts2在struts.xml文件中使用<result .../>
元素来配置结果,根据<result .../>
元素所在位置的不同,Struts2提供了以下两种结果:
<result .../>
作为<action .../>
元素的子元素配置<result .../>
作为<global-results .../>
元素的子元素配置配置<result .../>
元素时通常需要指定如下两个属性:
下面就分别对如何配置局部结果和全局结果进行详细的总结。
前面的文章中,在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属性可以取如下两个值:
由于不同的结果类型可以配置不同的参数,具体的请参见这里。那么为什么这么繁琐的写法可以简化成那么简单的写法呢?
在配置处理结果时,如果配置<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学习之处理结果