以前我们用Ajax有2种方式:
无外乎这2中做法。那么有什么缺点呢?
- 用 Javascript 写一堆Html拼接。杂、乱、尤其是 Javascript 功底不好的同学,N多错误,代码不讲究的同学,写完后别人看见就想吐。
- Java 代码拼接
Html代码一直是广大优质 Java 程序员所唾弃的,当然,JSP里写 Java 代码也是要被鄙视的。
进入主题,我们今天要使用Freemarker这个模版语言来返回Html代码,前端Ajax请求后直接显示。
Freemarker模版文件代码:
<ul class="cf"> <#if list?exists && list?size gt 0> <#list list as it> <li> <a class="pic fancybox" href="${it.url}" title="${it.fileName}"> <img src="${it.url}" /> a> <span class="myCouse_inf"> <h2><a href="javascript:void(0);">${it.fileName}a>h2> <h3> <a class="toux_sw" href="/member.html"> <img src="${it.userPic}" />${it.userName} </a> <a style="margin-left: 15px;" class=" icon_lev fancybox icon_lev2" title="${it.fileName}" href="${it.url}">预览</a> </h3> </span> </a> </li> </#list> <#else> <li style="width: 100%;"> <p style="display: block; text-align: center; font-size: 3em; height: 80px; line-height: 80px;"> 你没有分享任何信息,赶快分享你的作品吧。 </p> </li> </#if> <#if pageHtml?exists> <div class="pages"> ${pageHtml} </div></#if>
下面是Controller代码,使用的是 SpringMVC :
/*** 加载评论* @param key* @param pageNo* @param pageSize* @return*/@RequestMapping(value="comment/loadMessage",method=RequestMethod.POST)@ResponseBodypublic void loadMessage(String targetKey,Integer pageNo,Integer pageSize,HttpServletResponse response){Pagination<MessageComment> page =commentMessageService.findCommentByKey(targetKey, pageNo, pageSize);resultMap.put("list", page.getList());resultMap.put("targetKey", targetKey);String ftl = "message/comment/comment_template.ftl";FreemarkerOutHTMLUtils.outHtml(response,ftl , resultMap);}
下面是工具类代码:
public class FreemarkerOutHTMLUtils { static Configuration cfg = Ferrmarker.cfg; static { // 初始化FreeMarker配置 // 创建一个Configuration实例 //cfg = new Configuration(); // 设置FreeMarker的模版文件位置WEB-INF/templates } public static void outHtml(HttpServletResponse response,String path, Map<String,Object> parament) { try { // 取得模版文件 Template t = cfg.getTemplate(path); // 开始准备生成输出 // - 使用模版文件的charset作为本页面的charset // - 使用text/html MIME-type response.setContentType("text/html; charset=" + t.getEncoding());// + Writer out = response.getWriter(); parament.putAll(Ferrmarker.initMap);//加载配置 // 合并数据模型和模版,并将结果输出到out中 t.process(parament, out); } catch (Exception e) { LoggerUtils.fmtError(FreemarkerOutHTMLUtils.class,e,"处理模版中出现错误"); } }}
还有关键的一步,Freemarker配置设置,这里有很多种方式实现:
public static Map<String,Object> initMap = new LinkedHashMap<String,Object>() ;static {/**Freemarker Config*///1、创建Cfgcfg = new Configuration();//2、设置编码cfg.setLocale(Locale.getDefault()) ;cfg.setEncoding(Locale.getDefault(),"UTF-8") ;/**添加自定义标签*/APITemplateModel api = SpringContextUtil.getBean("api",APITemplateModel.class);cfg.setSharedVariable("api", api);FreeMarkerConfigExtend ext = SpringContextUtil.getBean("freemarkerConfig",FreeMarkerConfigExtend.class);Configuration vcfg = ext.getConfiguration();Set<String> keys = vcfg.getSharedVariableNames();for (String key : keys) {TemplateModel value = vcfg.getSharedVariable(key);cfg.setSharedVariable(key, value);}try {FreeMarkerConfigExtend.putInitShared(cfg);} catch (TemplateModelException e) {logger.error("添加Freemarker自定义方法失败;" ,e);}try {cfg.setDirectoryForTemplateLoading(new File(freemarkerPath));} catch (IOException e) {LoggerUtils.fmtError(Ferrmarker.class,e, "加载Freemarker 目录失败%s", freemarkerPath);}IUser token = TokenManager.getToken();initMap.put("token", token);initMap.put("_time", new Date().getTime());initMap.put("NOW_YEAY", Constant.NOW_YEAY);initMap.put("_v", Constant.VERSION);//版本号,重启的时间initMap.put("domain_static", Constant.DOMAIN_STATIC);//后台域名}
前端代码呢?
var data = {"userId":"${token.id}",pageNo:"${pageNo?default(1)}"};$.post("/ishare/loadShare.shtml",data,function(html){$("#outHtml").html(html);});
887

被折叠的 条评论
为什么被折叠?



