spring 基本不用介绍了,是目前最好的 IOC 容器了,它的 mvc 架构也十分出色,特别是基于标注的开发方式,免除了大多数框架庞大配置的缺点。而 mustache 则是新兴的模板语言,难能可贵的是在各个主流语言下都有对应的解析器,恰好有机会尝试将 spring mvc 的 view 层替换为 mustache ,感觉很不错~~
1.写个 controller
public class Product{ private String name; // setter . getter }
@Controller public Test(){ @RequestMapping("/{id}") public String personal(@PathVariable int id, Model model) throws Exception { Product d = manager.getProduct(id); model.addAttribute("product", d); return "personal"; } }
controller 没有改变,通过 resetful 的 url 暴漏查询服务.
2.下载 mustache 解析器以及 viewresolver
java 解析器 就列在 mustache 主页上,不多说..
而 viewresolver 也已经有人封装好了,但是对于中文用户就欠考虑了,我修改了下放在 这里
3.配置 mustache viewresolver
在 xx-servlet.xml 中配置:
<bean id="viewResolver" class="org.springframework.web.servlet.view.mustache.MustacheViewResolver"> <property name="cache" value="false"/> <property name="nullValue" value=""/> <property name="prefix" value="/WEB-INF/mustache/"/> <property name="suffix" value=".htm"/> <property name="templateLoader"> <bean class="org.springframework.web.servlet.view.mustache.MustacheTemplateLoader"> <property name="encoding" value="utf-8"/> </bean> </property> <property name="contentType"> <value>text/html; charset=utf-8</value> </property> </bean>
其中特别注意的是
当取值为 null时,默认解析器会抛出异常,而经常想要的效果是直接渲染为空字符串,那么需要配置:
<property name="nullValue" value=""/>
中文需要告诉解析器模板文件的编码(否则就系统默认了),一般是 utf-8
<property name="encoding" value="utf-8"/>
也要告诉 viewresolver 最后要修改 content-type 头,否则默认为 iso8859-1 ,浏览器会显示乱码
<value>text/html; charset=utf-8</value>
view name 与模板文件对应和其他类型的 viewresolver 一样。模板文件放在 WEB-INF/mustache 下,根据控制器返回的 view name 来找对应的模板文件并结合 model 渲染出来.
4.模板文件编写
第一步已经在 controller 中将 Product 的实例放在 model 的 product 属性上. 那么就可以直接在模板中读到 Product 的实例值
<h1>{{product.name}}</h1>
如果 Product 实例有多个字段的话,可以采用直接把当前实例作为其属性的 context:
<ul> {{#product}} <li> {{name}} </li> <li> {{price}} </li> {{/product}} </ul>
优点:
最大的优点即是可以前后端共用模板,初始屏可以由后端渲染,接下来的无跳转局部刷新可以由 js 取得服务器端模板和数据在客户端直接渲染.