原文链接:https://blog.csdn.net/xiandafu/article/details/44216905

作者:Beetl作者,闲大赋

浏览器通过AJAX,服务器返回json数据,无刷新的更新视图的这种模式在WEB开发中我已经用了很长时间了,记得最早是08年的时候用的,当时传递JSON数据让我眼前一亮。这种方式是只需要采用工具包将模型序列化成json格式就行,js UI库总能识别这种格式,轻易的生成新的视图片段。

然而时过境迁。这种传递AJAX JSON方式渐渐有了新的问题。
JSON序列化库无法完美的序列化模型对象。序列化库总期望输入一个Object,但实际上前端有可能需要多个Object,这样,你不得不再创建一个序列化专用的Object。 另外,序列化逻辑都很简单,就是将所有对象属性都序列化。尽管JSON Lib 能提供属性过滤,属性格式化等,但扪心自问,远远不如模板渲染功能完善。模板语言提供了丰富的语句和扩展来处理模型对象。另外JSON Lib在序列化对象互相引用,处理的也不好。在模板语言里,这将不存在问题。总而言之,开发人员为了序列化JSON,不得不创建新的视图对象,不得不侵入原有的模型以规定序列化逻辑。以我认为最好的FastJSON工具为列,你能看到各种开发者问的问题(我直接从fastjson论坛行找来最近的帖子).

-在使用 fastjson转map,怎么让map中为null的值等于""呢
-FastJson 1.2.4 日期类型 ISO8601格式序列化问题...
- 建议@JSONType注解添加allows属性,允许设置允许序列化的属性数(作者注:我也建议其他Annotation,用于控制渲染逻辑,事实上,由于缺少语言特性,fastJson会应接不暇这种类似的渲染逻辑建议)
- fastjson 支持escape嘛,防止xss?

2 随着前端技术发展,程序员不再需要easyui,extjs这种前端框架了。因为这种框架不是以视觉为中心的,视觉人员无法左右这种框架。现在更流行的方式还是模板方式,只不过通过前端模板引擎来完成 :输入是JSON和前端模板,输出就是更新后的DOM。 那么问题就来了,这种方式是不是还不如直接后端模板引擎渲染呢?何必费劲的序列化成json,然后,用功能较弱的前端模板引擎来渲染。有点舍近求远的味道。

3 对于有些需要SEO的网站,使用AJAX JSON是致命的问题,因为搜索引擎不能执行javascript,扒到的网页是个空壳子。很不友好。目前也没有太好的办法。据说有一种是仍然采用ajax,但会提供一个不可见的url给搜索引擎以提供正确内容。 另外,据说google搜索引擎有专门的模拟器来模拟javascript执行以获得SEO内容,但属于研发中。

4 对于一个复杂页面,如果多个部分都是用AJAX 请求,这简直是要了Web服务器的命。现在服务器不怕CPU忙,就怕请求多。因此AJAX JSON 这中方式在复杂页面里也是非常不好用的。用的后果就是服务器复杂成倍增加,而页面真正的内容又加载不出来。这同样也没有办法去改善。

吐槽了这么多AJAX+JSON,该说说Beetl是怎么解决的了。

Beetl的解决方法是Ajax+HTML片段,这种方式也不新鲜,但是Beetl有自己独特的解决方法。Beetl引入了新的语法标记#ajax 此语法仅仅标记了一段模板块,后面跟一个id表示ajax片段的名字。如果模板正常渲染视图,模板引擎会忽略#ajax标记,正常渲染模板所有内容。如果渲染的视图带有#id,如 index.html#top10,则模板引擎仅仅渲染#ajax top10标记的内容。如下一个index.html模板:
页面其他内容
.......
<div id="top10">

%>
ajax top10:

{ <#table data="${topData}" var ="row,index"> <#tr name="名称">${row.name}<#tr> <#tr name="积分">${row.score}<#tr> </#table> <#page data="${topData}" url="/indexTop10.html"/> <%} //end ajax top 10 %> </div> ...... 页面其他内容

此模板包含多部分,在此仅仅列出ajax部分,ajax内部是个table标签,或者是其他任何beetl 模板引擎代码都可以。
当用户请求index.html页面的时候,后台controller可能是这样
public String index(){
int page = this.getParameter("top10",0);
this.setAttr("topData",service.getTop10(page ));
//设置其他index需要的数据
this.setAttr("userInfo"...);
this.setAttr("menu"...);
return "/index.html";
}

当用户对top10进行翻页操作的时候,客户端js会发起一个ajax请求到/indexTop10.html,后台controller可能是这样代码
public String indexTop10(){
int page = this.getParameter("top10",0);
this.setAttr("topData",service.getTop10(page ));
return "/index.html#top10";
}

注意到模板渲染的视图是"/index.html#top10",而不是"/index.html",这保证了模板引擎仅仅渲染top10 片段。客户端只需要调用jquery 代码$("#top10").load("/indexTop10.html?page="+xxx) 即可实现无刷新翻页

相对于文章刚开始列举的ajax+json 4大槽点,ajax+beetl都能完美解决。模板的语言功能渲染模板比简单的对象化序列化功能更强,也比前端模板引擎更强。SEO毫无问题,页面受到搜索引擎欢迎。一次渲染不会对服务器造成过多的访问压力。另外,从开发角度来说,开发人员面对的问题也简单多了,能提高了开发效率。

由于Ajax+Beetl 仍然是一种Ajax+HTML的改进,那还是会有AJAX+HTML这种模式的一些些缺点,比如,网络传输数据会增加一些.还有模板渲染性能肯定不如json序列化的性能。如果你的硬件环境很吃紧,你需要慎重考虑这种方式,但一般据我了解,企业应用或者web网站,这些都不是问题。另外一个潜在问题是ajax+json,返回的json数据可以多次在前端处理,比如渲染多个DOM节点,而Ajax+beetl则不行,你只能先渲染一个Dom节点,然后通过js来获取你需要的数据再渲染其他DOM节点,但这种情况也是非常少见的。

---------------------
作者:闲大赋
来源:CSDN
原文:https://blog.csdn.net/xiandafu/article/details/44216905
版权声明:本文为博主原创文章,转载请附上博文链接!

还在用Json完成Ajax,改用Beetl吧的更多相关文章

  1. 谈JSON在Ajax中的使用

    JSON是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.AJAX是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术.之前也曾介绍过在PHP语言中使用JSON的文章, ...

  2. JSON 在Ajax数据交换中的简单运用

    随着浏览器内核更新,原先的json.js在最新的谷歌浏览下不管用了,运行报错,特此修改下代码,不使用json.js,使用Object自带的json转换方法,修改时间,2016年10月26日. 首先需要 ...

  3. Json和Ajax

    LogDao接口 package com.log.dao; import java.util.List; import com.log.Vo.LogInfoVo; import com.log.bea ...

  4. struts2:使用JQuery、JSON和AJAX处理请求

    目的 在struts2中使用JQuery.JSON.AJAX等技术处理用户请求,并返回结果.返回结果可以是以JSONObject的方式返回,也可以是以JSONArray方式返回结果. 实现 1. 创建 ...

  5. 金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)

    本文作者:丁同舟,来自金蝶随手记技术团队. 1.前言 本文接上篇<金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)>,以iOS端的Objective-C代 ...

  6. Django---CSRF的装饰器,CSRF的流程,JSON数据格式,ajax技术(基于JQ实现)

    Django---CSRF的装饰器,CSRF的流程,JSON数据格式,ajax技术(基于JQ实现) 一丶CSRF相关的装饰器 from django.utils.decorators import m ...

  7. 项目:jSon和Ajax登录功能

    组件化网页开发 / 步骤二 · 项目:jSon和Ajax登录功能 要熟练编写封装的$.ajax({........})

  8. Json与Ajax(注册实例)

    需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: "./server/slider.json", type: "po ...

  9. JavaScript JSON 与 AJAX

    JavaScript JSON 与 AJAX JSON 是一种轻量的数据交互格式,与 AJAX 配合完成前端页面与服务端的信息传递,本文介绍 JSON 的使用.原生 AJAX 写法.JSONP 跨域解 ...

随机推荐

  1. Vue学习之路2-项目初搭建

    1.检查环境是否全部安装成功 2.创建项目 2.1.打开dos命令窗口,使用dos命令转到项目文件夹下: 2.2.输入创建项目命令:vue init webpack myproject1 创建不同的打 ...

  2. eclipse设置新建jsp默认编码格式utf-8

  3. JAVA常用API的总结(2)

    这篇是常用API的结束了,写完的话可以继续往后复习了. 1.基本类型包装类的介绍与相关代码实现 对于数据包装类的特点就是可以将基本数据类型与字符串来回切换,接下来我会通过介绍Integer类的形式,来 ...

  4. ASP+中文显示之两种解决方法

    作者刚開始写ASP+程序时候碰到的第一个比較大的问题就是中文显示问题,执行后发现ASP+从数据库中读  取出来的中文所有变成了?????,有点相似jsp中的这个频率出现最高的中文显示问题了,查了资料发 ...

  5. jar包的MANIFEST.MF文件

    打包可执行jar包时,MANIFEST.MF总是个让人头疼的东西,经常出现这种那种问题. 一个例子: ================================================= ...

  6. Parallel 类并行任务(仅仅当执行耗时操作时,才有必要使用)

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  7. 在 .NET Core 中结合 HttpClientFactory 使用 Polly(下篇)

    译者:王亮作者:Polly 团队原文:http://t.cn/EhZ90oq声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的(包括标题).其中可能会去除一些不影响理解但本人实在不知道如 ...

  8. aelf帮助C#工程师10分钟零门槛搭建DAPP&私有链开发环境

    aelf是一个可扩展的去中心化云计算区块链平台,支持高性能合约并行执行.原生多链数据交互.存储使用高性能分布式数据库. aelf整个系统可以在windows.osx及linux运行,团队在osx环境下 ...

  9. jeecg字典表-系统字典

    新建字典 录入字典信息 添加类型 录入完类型后效果 新建列表用户 保存 同步数据库 同步完之后,对应的数据库中会创建对应的表. 测试表功能 保存之后,数据库保存对应的字段 生成代码 刷新工程之后,生成 ...

  10. openstack搭建之-基础服务配置(7)

    基础环境准备,所需服务器及说明 172.16.2.51     base.test.com 基础服务节点 172.16.2.52     ctrl.test.com 控制节点 172.16.2.53  ...