二、Beetl与Spring MVC整合

  本章主要介绍通过beetl-spring完成Beetl与Spring MVC整合的功能。和Beetl自带的BeetlSpringViewResolver及BeetlSpringView相比,本项目提供的BeetlViewResolver增强了视图解析器的功能,使多视图解析器各自使用各自的GroupTemplate以使用不同的Beetl配置成为可能。

2.1 BeetlViewResolver

  BeetlViewResolver是一个Spring MVC视图解析器实现,它具有以下属性,都是可选的:

 

参数名 参数类型

说明

常规配置属性

 contentType
 String

用于指定Http响应包Content-Type头

默认MIME类型为text/html 字符集通过GroupTemplate使用的ResourceLoader的charset推断(如果无法获取则取当前JVM进程的默认字符集)

 prefix,suffix  String

使用模版path的前缀和后缀 默认都为空字符串

BeetlView以如下方式进行字符串拼接以得到实际传给Beetl ResourceLoader的模版path:

path = prefix + viewName + suffix;

多视图解析器配置属性

 groupTemplate  GroupTemplate

该视图解析器所使用的GroupTemplate实例

默认视图解析器会取Spring上下文中唯一的GroupTemplate

如果Spring上下文中有多个GroupTemplate,该属性必须设置

 order  int

配置视图解析器的优先级

值越小优先级越高,默认为0。当Spring上下文中有多个视图解析器时,必须设置

详情请参见本章2.3小节。

 viewNames  List<String>

配置若干个带*号通配符表示的视图名表达式,只有视图名匹配其中一个表达式才会被当前视图解析器处理(在多视图解析器的环境下,如果当前视图解析器判定不能处理该视图名,就会让下一个解析器尝试处理)

默认所有接收到的视图名都被当前视图解析器处理,通常在多视图解析器环境下应该设置。

2.2 视图名与BeetlView

  BeetlView由BeetlViewResolver根据视图名产生。一般不手工生成该对象(在使用时,BeetlView需要Spring注入一些必须的环境数据)。

  并不是所有的视图名BeetlViewResolver都一定产生BeetlView实例,有两种特殊的情况:

视图名

说明
以"redirect:"为前缀时

表示重定向,不产生BeetlView渲染模版,而直接通过Servlet的机制返回重定向响应

redirect:前缀后面的内容为重定向地址,可以采用相对地址(相对当前url),绝对地址(完整的url)

如果采用/开头的地址,会自动的在前面接上当前Web应用的contentPath,即contentPath为test的Web应用中使用

redirect:/admin/login.html 实际重定向地址为 ${contentPath}/admin/login.html

以"forward:"为前缀时

表示转发,不产生BeetlView渲染模版。而是直接通过Servlet的机制转发请求(关于转发和重定向的区别,请自行查看Servlet API)

forward:前缀后面的内容为转发地址,一般都是以/开头相对于当前Web应用的根目录

其他 产生BeetlView渲染模版输出响应

2.3 Spring多视图解析器配置

  Spring上下文中,如果有多个视图解析器实例存在,会按照视图解析器的order设置从小到大对他们进行排序处理。(这里说的视图解析器主要是说的是UrlBasedViewResolver的实现子类,只有它才支持多视图解析器并存,大部分的Spring视图解析器类都是UrlBasedViewResolver的子类)。

  判断一个视图是否由该视图解析器处理,核心的方法是UrlBasedViewResolver的canHandle(),将视图名传入返回true/false以表示该视图名是否能处理,与上文描述的一样,默认的canHandle()实现是通过比对视图名对viewNames属性设置的视图名匹配表达式来完成的。如果canHandle()返回true,则视图会交给该解析器的resolveViewName()方法以返回对应的View实例,否则交给排在后面的视图解析器处理。

 

  对Beetl与Spring MVC整合及多视图解析器的配置,请参见beetl-spring-web-example示例