据小菜了解,对于java开发,涉及到页面展示时,比较主流的有两种解决方案:

1. struts2+vo+el表达式。

这种方式,重点不在于struts2,而是vo和el表达式,其基本思想是:根据页面需要的信息,构造出一个实体,这个实体中包含了界面需要的所有属性,通常这个实体是由N个表中的字段构成的,俗称vo。由于vo的属性可以是String、List、Map等等等,又可以vo套vo,因此这种方式非常灵活,也非常好用。

在后台对vo进行赋值,通过struts2封装到request中,然后在界面用el表达式,通常是${}、forEach标签什么的,即可构造出界面。

但这种方式小菜却不是很看好。因为这种利用标签控制html,依然是把表现和控制混杂在一起,html里边混杂了大量el控制标签,很不美观。

当然,小菜不可能因为这么简单的理由拒绝这种方式,读者仔细思考可以发现,利用el表达式生成html代码,这是一个在服务器端执行的动作,在服务器端解析完成之后,才发送到客户端浏览器上,这样做会占用大量服务器资源,而且速度缓慢。

示例代码:

<c:forEach var='bm' items="${contractAuditVo.borrowerModels}"><table><tbody><tr><td>借款人编号:</td><td><p>${bm.borrowerId }</p></td></tr><tr><td>客户编号:</td><td><p>${bm.customerId }</p></td></tr><tr><td>曾用名:</td><td><p>${bm.usedName }</p></td></tr></tbody></table>
</c:forEach>

         2. Json+ajax+拼html

这种方法一般是基于ajax请求,要求服务器端返回一个json类型的json字符串,这个json串中包含了界面所需的所有信息,界面拿到json串后,构造出html,完成界面展示。

小菜推荐这种方法,通过这种方式编写的页面,反应速度非常快,用户体验非常好。

因为服务器端只需要提供一个json串,由客户端完成解析,因此服务器承受的压力很小,目前的电脑配置都较高,客户端的浏览器解析js脚本很快,因此页面体验效果好。

解析的过程大致是通过Jquery的each方法,进行遍历。

但是小菜利用这种方式时,犯了一个致命的错误,小菜是通过原始的拼接html的方式,页面中写了大量html+=”<div>”;,这种写法使页面变得非常凌乱,几乎不可以维护。

示例代码:

 var contractTextHtml="";
$.each(jsonObject.cl,function(i,n){contractTextHtml="";//插入合同文本数据contractTextHtml+="<div title='出借人信息---"+hiddenNull(n.cm.lenderName)+"' style='overflow:auto;padding:5px;'>";contractTextHtml+="<table class='ui-table ui-table-noborder'>";contractTextHtml+="<tbody>";contractTextHtml+="<tr><td>合同编号:</td><td><p>"+hiddenNull(n.cm.contractId)+"</p></td></tr>";contractTextHtml+="<tr class='ui-table-split'><td>出借人姓名:</td><td><p>"+hiddenNull(n.cm.lenderName)+"</p></td></tr>";contractTextHtml+="<tr><td>出借人证件类型:</td><td><p>"+hiddenNull(n.cm.lenderIdType)+"</p></td></tr>";contractTextHtml+="<tr class='ui-table-split'><td>出借人证件号:</td><td><p>"+hiddenNull(n.cm.lenderIdNum)+"</p></td></tr>";contractTextHtml+="<tr><td>出借金额:</td><td><p>"+hiddenNull(n.cm.lenderAmount)+"</p></td></tr>";contractTextHtml+="<tr class='ui-table-split'><td>出借人编号:</td><td><p>"+hiddenNull(n.cm.lenderNo)+"</p></td></tr>";contractTextHtml+="<tr><td>出借人银行帐号:</td><td><p>"+hiddenNull(n.cm.lenderBankAccount)+"</p></td></tr>";contractTextHtml+="<tr class='ui-table-split'><td>撮合编号:</td><td><p>"+hiddenNull(n.cm.makeMatchNo)+"</p></td></tr>";contractTextHtml+="</tbody>";contractTextHtml+="</table>";contractTextHtml+="</div>";$("#textList").append(contractTextHtml);
});

造成这种问题的根本原因在于拼接html打乱了html原有的层次结构,看不出来哪里是哪里,没有了层次结构的代码,堆在那里就像是一坨垃圾。

el表达式构造html优点是能够保持html原有格式,js构造html优点是速度快省资源,为什么我们不能把二者的优点结合在一起呢?这就是Handlebars.js。

既然要在项目中引入js模版引擎,就必须进行技术选型,严格考核之后,才可以引入,就好像是木桶效应,不能让他成为项目中的短板。

Handlebars.js是一款基于Jquery的插件,以json对象为数据源,支持逻辑判断、循环等操作,同时具有非常好的扩展性,体积60KB左右,经过小菜仔细的分析研究,这是一款不可多得的js模版引擎。

引用地址:http://www.cnblogs.com/iyangyuan/p/3471267.html

转载于:https://blog.51cto.com/issac/1564754

js模版引擎handlebars.js实用教程——为什么选择Handlebars.js相关推荐

  1. js模版引擎handlebars.js实用教程——结束语

    返回目录 有了这些功能,[ajax json Handlebars]替代[vo el表达式]不成问题,新时代的曙光已经来临,最佳解决方案在此,您还等什么? 教程到此结束...祝读者学习愉快... 转载 ...

  2. js模版引擎handlebars.js实用教程——with-终极this应用

    返回目录 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <META http-equiv=Content-Type conten ...

  3. js模板引擎渐进--后记

    至此,算是完成了一个系列了. 本来是想写的更详细的,但是太详细每次说的东西就少的可怜. 在学习的过程中,每次的改进改动博主都是复制一个新的文件进行,整个有二十多篇,中间有很多小细节的东西,集中在 ea ...

  4. js模板引擎渐进--if/else(7)

    有了 each 的经验后,要实现 if/else 这种指令就简单了-------在  case '}' 处对 varcode 进行指令的判断即可. 模板代码: {if data.value==1}&l ...

  5. Handlebars.js 模板引擎

    介绍 Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less template"(无逻辑模 ...

  6. js模板引擎 之handlebars.js

    最近在接触郑州知识库,里面使用到的技术是值得自己学习的. 该项目前端使用的是handlebars.js模板引擎框架.模板引擎框架用于数据与结构分离的思想,实现页面动态分离的效果. 1.为什么使用模板引 ...

  7. Handlebars js模版

    参考Handlebars网站:http://handlebarsjs.com/ 首先下载handlebars-1.0.0.beta.6.js和jquery-1.7.1.min.js 1).最简单的Ha ...

  8. 简单实用的js模板引擎

    转自:微点阅读  https://www.weidianyuedu.com 不足50行的js模板引擎,支持各种js语法: <script id="test_list" typ ...

  9. vue 绘制波形图 wavesurfer.js (音频/视频) 【实用教程】

    安装 wavesurfer.js cnpm i wavesurfer.js --save 无 cnpm 的先运行 npm i cnpm -g 全局安装 cnpm 绘制音频波形图 常用的配置参数详见注释 ...

最新文章

  1. 【最短路】hxk化学课
  2. Linux系统的常用命令的使用
  3. MyBatis在insert插入操作时返回主键ID的配置
  4. 关于Nand ECC 错误
  5. Python 模块之 string.py
  6. Qt中如何获得文件和文件夹的路径信息
  7. python抽象基类的作用_Python:多态、鸭子模型和抽象基类
  8. fckeditor异常总结---WARN No appenders could be found for logger的解决方法
  9. 练手级计算机,快来打怪
  10. npm安装模块版本符_Java SE 9:模块和模块描述符基础知识(第2部分)
  11. VS真难用:好好的编译工程,换个机器完全不能编译;换高版本还是不能编译
  12. Windows服务器配置与管理-------DHCP服务器搭建与管理
  13. idea打包servlet成war包部署在tomcat
  14. class文件反编译后的汉字乱码问题
  15. dell 恢复介质_Dell OS Recovery Tool如何重装系统 Dell OS Recovery Tool如何创建USB恢复介质...
  16. 哈佛专家推荐5种最健康食物
  17. SwiftUI的多列列表
  18. iOS 应用上架流程(提交到AppStore)
  19. Photoshop如何查看各种字体
  20. 移动、ipad、PC端浏览器的判断

热门文章

  1. Effective C++ 条款05
  2. 秀尔算法:破解RSA加密的“不灭神话” --zz
  3. Oracle 11g R2 64位在 win7 64位的安装流程图解
  4. Java troubleshooting guide
  5. java+mysql中文乱码问题
  6. 使用ioctl向linux内核传递参数的方法实例
  7. codility上的问题(26) Hydrogenium 2013
  8. 使用ServiceStackRedis链接Redis简介
  9. WPF 提供了以下关键帧动画类[msdn]
  10. AVP 6目GoPro全景拼接