55dwr - 购物车案例(实现购物车)
用户购物车的 Java 表示基于 Map。当 Item 添加到购物车中时,Item 本身作为键被插入 Map。Map 中对应的值是一个 Integer,代表购物车中指定 Item 的数量。所以 Cart.java 有一个字段 contents,声明为 Map<Item,Integer>。
使用复杂类型作为哈希键给 DWR 带来一个问题 —— 在 JavaScript 中,数组的键必须是标量的。所以,DWR 无法转换 contents Map。但是,对于购物车用户界面来说,用户需要查看的只是每个商品的名称和数量。所以我向 Cart 添加了一个名为 getSimpleContents() 的方法,它接受 contents Map 并根据它构建一个简化的 Map<String,Integer>,只代表每个 Item 的名称和数量。这个用字符串作为键的 map 表示可以由 DWR 的转换器转换成 JavaScript。
客户对 Cart 感兴趣的其他字段是 totalPrice,它代表购物车中所有商品的金额汇总。使用 Item,我还提供了一个合成的成员叫作 formattedTotalPrice,它是金额汇总的格式化好的 String 表示。
转换购物车
为了不让客户代码对 Cart 做两个调用(一个获得内容,一个获得总价),我想把这些数据一次全都发
给客户。为了做到这一点,我添加了一个看起来有点儿怪的方法,如清单 5 所示:
清单 5. Cart.getCart() 方法:
虽然这个方法在普通的 Java 代码中可能完全是多余的(因为在调用这个方法时,已经有对 Cart 的引用),但它允许 DWR 客户让 Cart 把自己序列化成 JavaScript。
除了 getCart(),需要远程化的另一个方法是 addItemToCart()。这个方法接受目录 Item 的 ID 的 String 表示,把这个商品添加到 Cart 中并更新总价。方法还返回 Cart,这样客户代码在一个操作中就能更新Cart 的内容并接收购物车的新状态。
清单 6 是扩展的 dwr.xml 配置文件,包含 Cart 类进行远程所需要的额外配置:
清单 6. dwr.xml 加入 Cart 类
在这个版本的 dwr.xml 中,我添加了 Cart 的 creator 和 convertor。create 元素指定应当把addItemToCart() 和 getCart() 方法远程化,而且重要的是,生成的 Cart 实例应当放在用户的会话中。所以,购物车的内容在用户的请求之间会保留。
Cart 的 convert 元素是必需的,因为远程的 Cart 方法返回的是 Cart 本身。在这里我指定在 Cart 的序列化 JavaScript 形式中应当存在的成员是 simpleContents 这个图和 formattedTotalPrice 这个字符串。
如果对这觉得有点儿不明白,那么只要记住 create 元素指定的是 DWR 客户可以调用的 Cart 服务器端方法,而 convert 元素指定在 Cart 的 JavaScript 序列化形式中包含的成员。
相关文章
- (尚026)Vue_案例_动态初始化显示(尚025)
- 微服务架构案例(06):通过业务、应用、技术、存储方面,聊聊架构
- SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件
- Google Earth Engine(GEE)——Join连接的案例分析
- 【MATLAB教程案例85】通过matlab实现有限差分法求解微分方程
- 【FPGA教程案例42】图像案例2——通过verilog实现图像二值化处理,通过MATLAB进行辅助验证
- 【FPGA教程案例6】基于vivado核的双口RAM设计与实现
- 【FPGA教程案例5】基于vivado核的ROM设计与实现
- 阿里面试——机器学习案例
- 86 网站点击流数据分析案例(统计分析-访客分析)
- 53dwr - 购物车案例(实现目录)
- 【案例】正浩创新:多云多资产,实现敏捷云上运维
- 图解css3:核心技术与案例实战. 1.2 浏览器对CSS3的支持状况
- Python使用face_recognition库实现人脸识别案例
- 【Selenium项目实战】完成测试项目用例(用户登录案例):实现登录成功和失败测试
- WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
- 《Android 应用案例开发大全(第二版)》——2.6节绘制相关类
- 《Android 应用案例开发大全(第二版)》——6.6节Android源代码与过滤器
- SwiftUI 数字显示格式应用大全实现数字格式化为货币值、百分比值、序数值(Swift NumberFormatter 应用案例)
- 泛金融账务流水 存储与快照回溯查询 案例分享
- 大数据与机器学习:实践方法与行业案例.2.6 本章小结
- 【Unity3D应用案例系列】Unity3D中实现抽奖功能
- 【Unity3D日常开发】解析Txt文档,赋值给Text案例
- EFM32 模拟I2C通讯案例(一)
- ChatGPT入门案例|张量流商务智能客服
- Three 之 three.js (webgl)旋转属性函数的简单整理,以及基于此实现绕轴旋转的简单案例
- 深入解析golang几种非常主流的依赖注入框架,附实现案例及原理解析