二、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示例