SpringMVC + Freemarker 模版的使用

来源:互联网 发布:范玮琪人品知乎 编辑:程序博客网 时间:2024/06/08 00:28

最近2年,接触的公司, Java  的View层,大多都是在使用模版语言,更多的在使用 Freemarker  。更多 Freemarker  信息请点击:Freemarker  

后面我会介绍 Freemarker  更多的东西。更多我亲身体验的东西。今天就说下 Freemarker  做模版怎么使用。

以前我们用Ajax有2种方式:

  1. 通过 Ajax  从后台获取数据,返回前端页面,然后循环拼接字符串。
  2. 通过 Ajax  请求后台,后台拼接字符串成Html代码,返回前端直接展示。

无外乎这2中做法。那么有什么缺点呢?

  1. 用 Javascript  写一堆Html拼接。杂、乱、尤其是 Javascript  功底不好的同学,N多错误,代码不讲究的同学,写完后别人看见就想吐。
  2. Java  代码拼接Html代码一直是广大优质 Java  程序员所唾弃的,当然,JSP里写 Java  代码也是要被鄙视的。

进入主题,我们今天要使用Freemarker这个模版语言来返回Html代码,前端Ajax请求后直接显示。

Freemarker模版文件代码:

  1. <ul class="cf">
  2. <#if list?exists && list?size gt 0>
  3. <#list list as it>
  4. <li>
  5. <a class="pic fancybox" href="${it.url}" title="${it.fileName}">
  6. <img src="${it.url}" />
  7. a>
  8. <span class="myCouse_inf">
  9. <h2><a href="javascript:void(0);">${it.fileName}a>h2>
  10. <h3>
  11. <a class="toux_sw" href="/member.html">
  12. <img src="${it.userPic}" />${it.userName}
  13. </a>
  14. <a style="margin-left: 15px;" class=" icon_lev fancybox icon_lev2"
  15. title="${it.fileName}" href="${it.url}">预览</a>
  16. </h3>
  17. </span>
  18. </a>
  19. </li>
  20. </#list>
  21. <#else>
  22. <li style="width: 100%;">
  23. <p style="display: block; text-align: center; font-size: 3em;
  24. height: 80px; line-height: 80px;">
  25. 你没有分享任何信息,赶快分享你的作品吧。
  26. </p>
  27. </li>
  28. </#if>
  29. <#if pageHtml?exists>
  30. <div class="pages">
  31. ${pageHtml}
  32. </div>
  33. </#if>


下面是Controller代码,使用的是 SpringMVC  

  1. /**
  2. * 加载评论
  3. * @param key
  4. * @param pageNo
  5. * @param pageSize
  6. * @return
  7. */
  8. @RequestMapping(value="comment/loadMessage",method=RequestMethod.POST)
  9. @ResponseBody
  10. public void loadMessage(String targetKey,Integer pageNo,Integer pageSize,
  11. HttpServletResponse response){
  12. Pagination<MessageComment> page =
  13. commentMessageService.findCommentByKey(targetKey, pageNo, pageSize);
  14. resultMap.put("list", page.getList());
  15. resultMap.put("targetKey", targetKey);
  16. String ftl = "message/comment/comment_template.ftl";
  17. FreemarkerOutHTMLUtils.outHtml(response,ftl , resultMap);
  18. }


下面是工具类代码:

  1. public class FreemarkerOutHTMLUtils {
  2. static Configuration cfg = Ferrmarker.cfg;
  3. static {
  4. // 初始化FreeMarker配置
  5. // 创建一个Configuration实例
  6. //cfg = new Configuration();
  7. // 设置FreeMarker的模版文件位置WEB-INF/templates
  8. }
  9. public static void outHtml(HttpServletResponse response,String path,
                        Map<String,Object> parament) {
  10. try {
  11. // 取得模版文件
  12. Template t = cfg.getTemplate(path);
  13. // 开始准备生成输出
  14. // - 使用模版文件的charset作为本页面的charset
  15. // - 使用text/html MIME-type
  16. response.setContentType("text/html; charset=" + t.getEncoding());// +
  17. Writer out = response.getWriter();
  18. parament.putAll(Ferrmarker.initMap);//加载配置
  19. // 合并数据模型和模版,并将结果输出到out中
  20. t.process(parament, out);
  21. } catch (Exception e) {
  22. LoggerUtils.fmtError(FreemarkerOutHTMLUtils.class,e,"处理模版中出现错误");
  23. }
  24. }
  25. }


还有关键的一步,Freemarker配置设置,这里有很多种方式实现:

  1. public static Map<String,Object> initMap = new LinkedHashMap<String,Object>() ;
  2. static {
  3. /**Freemarker Config*/
  4. //1、创建Cfg
  5. cfg = new Configuration();
  6. //2、设置编码
  7. cfg.setLocale(Locale.getDefault()) ;
  8. cfg.setEncoding(Locale.getDefault(),"UTF-8") ;
  9. /**添加自定义标签*/
  10. APITemplateModel api = SpringContextUtil.getBean("api",APITemplateModel.class);
  11. cfg.setSharedVariable("api", api);
  12. FreeMarkerConfigExtend ext =
                        SpringContextUtil.getBean("freemarkerConfig",FreeMarkerConfigExtend.class);
  13. Configuration vcfg = ext.getConfiguration();
  14. Set<String> keys = vcfg.getSharedVariableNames();
  15. for (String key : keys) {
  16. TemplateModel value = vcfg.getSharedVariable(key);
  17. cfg.setSharedVariable(key, value);
  18. }
  19. try {
  20. FreeMarkerConfigExtend.putInitShared(cfg);
  21. } catch (TemplateModelException e) {
  22. logger.error("添加Freemarker自定义方法失败;" ,e);
  23. }
  24. try {
  25. cfg.setDirectoryForTemplateLoading(new File(freemarkerPath));
  26. } catch (IOException e) {
  27. LoggerUtils.fmtError(Ferrmarker.class,e, "加载Freemarker 目录失败%s", freemarkerPath);
  28. }
  29. IUser token = TokenManager.getToken();
  30. initMap.put("token", token);
  31. initMap.put("_time", new Date().getTime());
  32. initMap.put("NOW_YEAY", Constant.NOW_YEAY);
  33. initMap.put("_v", Constant.VERSION);//版本号,重启的时间
  34. initMap.put("domain_static", Constant.DOMAIN_STATIC);//后台域名
  35. }


前端代码呢?

  1. var data = {"userId":"${token.id}",pageNo:"${pageNo?default(1)}"};
  2. $.post("/ishare/loadShare.shtml",data,function(html){
  3. $("#outHtml").html(html);
  4. });

ps:这就解决了,有疑问的联系我,知无不答,后面我有时间,开一个Freemarker专讲。

本文来自:http://www.sojson.com/blog/39.html