`
yiminghe
  • 浏览: 1431543 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

using mustache with spring mvc

    博客分类:
  • java
阅读更多

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 取得服务器端模板和数据在客户端直接渲染.

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics