Spring MVC,Ajax和JSON第2部分–服务器端代码

在上一个博客中,我说过我将谈论Spring,Ajax和JSON,但是没有。 原因是我想使用(很少)可信的购物网站场景来设置场景。 在这种情况下,当用户单击“电子商务”页面链接时,服务器应用程序将加载目录中的某些项目并将其显示在页面上。 然后,用户检查多个项目并按“确认购买”。 现在,这就是Ajax和JSON的来源,在按“确认购买”时,浏览器向向其发送项目ID的服务器发出Ajax请求。 然后,服务器从数据库中检索项目,并将它们作为JSON返回到浏览器。 然后,浏览器处理JSON,并在屏幕上显示项目。

我的最后一个博客涉及创建并显示一个显示项目列表的表单
从虚构目录到用户。 该博客介绍了该项目的下一步:创建一些JSON。

在过去的几年中,Spring的家伙们一直在忙于Ajax和JSON的开发,并且,正如您所期望的,他们在后台为您做了很多工作。 这意味着您要做的就是定义一个简单的bean类,Spring可以将其转换为JSON并编写一些控制器代码。 在这种情况下,Spring将转换为JSON的类是OrderForm类:

public class OrderForm { private final List<Item> items; private final String purchaseId; public OrderForm(List<Item> items, String purchaseId) { super(); this.items = items; this.purchaseId = purchaseId; } public List<Item> getItems() { return items; } public String getPurchaseId() { return purchaseId; } 
}

OrderForm类包含Item对象的列表和用于定义订单的唯一订单ID。

创建OrderForm ,下一步是整理Spring控制器代码:

public @ResponseBody OrderForm confirmPurchases(@ModelAttribute("userSelections") UserSelections userSelections) { logger.debug("Confirming purchases..."); OrderForm orderForm = createOrderForm(userSelections.getSelection()); return orderForm; } private OrderForm createOrderForm(List<String> selections) { List<Item> items = findItemsInCatalogue(selections); String purchaseId = getPurchaseId(); OrderForm orderForm = new OrderForm(items, purchaseId); return orderForm; } private List<Item> findItemsInCatalogue(List<String> selections) { List<Item> items = new ArrayList<Item>(); for (String selection : selections) { Item item = catalogue.findItem(Integer.valueOf(selection)); items.add(item); } return items; } private String getPurchaseId() { return UUID.randomUUID().toString(); }

上面的代码是向浏览器返回JSON所需要的全部,您可以看到它并没有那么多。 首先,该方法的@RequestMapping批注(使用confirmRequestMethod.POST值)映射我的表单属性
以前的博客对此方法进行了介绍。

<form:form modelAttribute="userSelections" action="confirm" method="post">

modelAttribute批注告诉Spring从表单发布的数据创建并映射userSelections对象,并将其注入confirmPurchases(...)方法的userSelections参数。 UserSelections类是一个便捷类,它包装String的列表。 尽管是Lazy Class反模式的示例,但该类用于轻松地与Spring的<form:checkbox>标记集成,并且在实际应用中将包含更多属性。

public class UserSelections { private List<String> selection = Collections.emptyList(); public List<String> getSelection() { return selection; } public void setSelection(List<String> selection) { this.selection = selection; } @Override public String toString() { StringBuilder sb = new StringBuilder("Selections are: "); for (String str : selection) { sb.append(str); sb.append(",  "); } return sb.toString(); } 
}

confirmPurchases(...)方法将UserSelections输入对象转换为OrderForm输出对象,该对象将作为JSON传递回浏览器。 通过遍历OrderForm对象中包含的Item ID列表并使用伪catalogue服务查找相应的Item来创建UserSelection对象。 一旦有了Item的列表,它便使用Java的UUID类创建唯一的购买ID。 然后,它将Item的列表和购买ID传递给OrderForm的构造函数,然后将订单表单传递回Spring。 不要忘记@ResposeBody批注,它告诉Spring使用合适的HttpMessageConverterOrderForm绑定到HTTP响应主体。 这就是神奇的地方。您可能会猜到,HTTP响应正文需要包含具有正确媒体类型的数据才能通过Internet发送,而OrderForm绝对不适合该账单。 为了解决该问题,Spring似乎在项目配置中查看了转换OrderForm对象的合适方法,在该方法中,它找到了在上一个博客中添加到项目中的jackson-corejackson-databind库。

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.0.4</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.0.4</version></dependency>

在没有其他合适的候选人的情况下,请使用这些库将OrderForm对象转换为JSON。 所有这些都意味着您和我实际上不必做任何真正的编码即可生成我们的JSON输出。 相当聪明吧!

显然,在后台进行的所有这些神奇的拼图游戏都隐藏了实际的JSON输出,因此,我发现创建一个类似于以下所示的简单单元测试很有用:

@Test public void testDemonstrateJSON() throws JsonGenerationException, JsonMappingException, IOException { UserSelections userSelection = new UserSelections(); String[] selections = { "1", "2" }; userSelection.setSelection(Arrays.asList(selections)); Item item1 = Item.getInstance(1, "name", "description", new BigDecimal("1.00")); when(catalogue.findItem(1)).thenReturn(item1); Item item2 = Item.getInstance(2, "name2", "description2", new BigDecimal("2.00")); when(catalogue.findItem(2)).thenReturn(item2); OrderForm orderForm = instance.confirmPurchases(userSelection); ObjectMapper mapper = new ObjectMapper(); String result = mapper.writeValueAsString(orderForm); System.out.println(result); }

您可能会认为这不是真正的测试,因为它没有声明任何内容。 该测试的价值在于直观地显示JSON输出,并确保杰克逊解析器可以将您附加到HTTP响应主体的对象转换为JSON。 如果不能,那么在运行此测试时,您将获得一个异常。

因此,这就是服务器端代码。 在这个简短的系列文章中,下一个(也可能是最后一个)博客将介绍客户端代码。 有关此博客的完整源代码,请参见GitHub – https://github.com/roghughe/captaindebug/tree/master/ajax-json

参考: Spring MVC,Ajax和JSON第2部分–来自Captain Debug博客博客的JCG合作伙伴 Roger Hughes提供的服务器端代码 。

翻译自: https://www.javacodegeeks.com/2013/05/spring-mvc-ajax-and-json-part-2-the-server-side-code.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python模块学习之解决selenium的“can't access dead object”错误

问题描述 在python执行过程中&#xff0c;提示selenium.common.exceptions.WebDriverException: Message: TypeError: cant access dead object 原因 原因是代码中用到了frame,获取元素前需要切换到frame才能定位到元素&#xff0c;否则无法定位到元素 解决方法 在查找元素前加…

初中生学计算机网络应用怎么样,初中生读计算机网络技术专业怎么样?小编解答...

初中生读计算机网络技术专业怎么样?可以这样说&#xff0c;计算机网络技术专业在众多专业当中来说&#xff0c;也是一个发展得比较不错的专业&#xff0c;而且现在也有很多高职学校都开设有计算机网络技术专业&#xff0c;那么初中生读计算机网络技术专业怎么样?计算机网络技…

类的无参方法和Doc注释

一:Java Doc注释: 语法: /** *AccpSchool 类 *author JadeBird *version 1.0 2018/5/26 */ Java Doc是前Sun公司提供的一种技术,它能够从程序代码中抽取类,方法,成员等的注释,形成一个和源代码配套的API帮助文档(简答地说,就是介绍该类,类的方法和成员变量的文档). 因此只要在编…

html/css学习笔记(一)

盒子模型1.background 1.1background-colorbackground-image: url("");background-repeatbackground-size: &#xff08;x轴的比例 y轴的比例&#xff09;background-positionbackground-attachment:fixed;(背景图固定不滚动)1.2 复合写法background: color iamge po…

Spring MVC,Ajax和JSON第3部分–客户端代码

如果您一直关注有关Spring&#xff0c;Ajax和JSON的简短博客系列&#xff0c;那么您会回想起我到目前为止已经创建了一个Spring MVC Web应用程序&#xff0c;该应用程序显示一个表单&#xff0c;该表单允许用户选择一堆项目并向服务器提交购买请求。 然后&#xff0c;服务器用一…

[poj] 3090 Visible Lattice Points

原题 欧拉函数 我们发现&#xff0c;对于每一个斜率来说&#xff0c;这条直线上的点&#xff0c;只有gcd(x,y)1时可行&#xff0c;所以求欧拉函数的前缀和。2*f[n]1即为答案。 #include<cstdio> #define N 1010 using namespace std; int x,y,n,f[N],m;int read() {int a…

10个必知的网页设计术语计算机与网络,计算机网络专业毕业论文-网页设计与制作(23页)-原创力文档...

安徽工业经济职业技术学院毕业论文PAGEPAGE 4-安徽工业经济职业技术学院毕业论文(设计)论文题目&#xff1a; 网页设计与制作系 部&#xff1a; 计算机科学技术系专业名称&#xff1a; 计算机网络技术论文作者&#xff1a; 李婷婷指导教师&#xff1a; 宋多琳2014年4月12日摘 要…

笔记36 Spring Web Flow——配置

Spring Web Flow是一个Web框架&#xff0c;它适用于元素按规定流程运行的程序。Spring Web Flow是Spring MVC的扩展&#xff0c;它支持开发基于流程的应用程 序。它将流程的定义与实现流程行为的类和视图分离开来。在介绍Spring Web Flow的时候&#xff0c;我们将暂时放下Spitt…

一些关于Viewport与device-width的东西~(转)

内容转自 http://www.cnblogs.com/koukouyifan/p/4066567.html 非常感谢 口口一凡 为我们提供的这篇文章&#xff0c;受益匪浅&#xff0c;特地转到自己的博客收藏起来。 以下是原文内容。 进行移动web开发已经有一年多的时间了&#xff0c;期间遇到了一些令人很困惑的东西。…

创建委托登录模块(用于JBoss EAP 6.1)

[如果只想查看代码&#xff0c;请向下滚动] 动机 在RHQ中&#xff0c;我们需要一个安全域&#xff0c;该域可用于通过容器管理的安全性来保护REST-api及其Web应用程序。 过去&#xff0c;我只是使用经典的DatabaseServerLoginModule对DatabaseServerLoginModule进行身份验证。 …

【C++】开源:FLTK图形界面库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍FLTK图形界面库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0…

蜗牛学院:中国人,努力获得了荣誉却要压抑克制

上周&#xff0c;在取得双11三连冠的佳绩之后&#xff0c;百雀羚顺势推出了一支视频广告《你应该骄傲》。 广告内容感动了无数人&#xff0c;并在广告圈和自媒体引发了持续刷屏。&#xff08;视频见文末&#xff09; 从《一九三一》到《韩梅梅快跑》&#xff0c;百雀羚今年多次…

html 访问节点,HTML DOM 访问节点

getElementById() 和 getElementsByTagName()getElementById() 和 getElementsByTagName() 这两种方法&#xff0c;可查找整个 HTML 文档中的任何 HTML 元素。这两种方法会忽略文档的结构。假如您希望查找文档中所有的元素&#xff0c;getElementsByTagName() 会把它们全部找到…

CSS3圆圈动画放大缩小循环动画效果

代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>CSS3圆圈动画放大缩小循环动画效果</title> <style>.dot { margin:150px a…

【BZOJ3589】动态树

题解&#xff1a;转载于:https://www.cnblogs.com/yinwuxiao/p/9103046.html

Lambda表达式在Java 8中的简单应用

我一直试图在我编写的代码中放入lambda表达式&#xff0c;而这个简单的例子就是相同的结果。 对于那些完全不了解Java中的Lambda表达式的人&#xff0c;我建议他们在进入本文之前先阅读此内容 。 好的&#xff0c;现在您已经熟悉了Lambda表达式&#xff08;在阅读了介绍性文章…

Poj2758 Checking the Text

题目传送门 经典的数据结构维护字符串哈希 这里用了很慢很慢的splay各种T&#xff08;也可能是死循环&#xff09; 不过没办法因为会写splay的能力还是要有的 #pragma GCC opitmize("O3") #pragma G opitmize("O3") #include<stdio.h> #include<s…

学计算机专业独立显卡有必要吗,不玩游戏独立显卡有什么作用_如果不玩游戏需要选择独立显卡吗-系统城...

现在有些笔记本刚买来的时候会有自带的独立显卡和集成显卡&#xff0c;有些朋友在买了笔记本后并不想玩游戏&#xff0c;这时候他们就有了一个疑问不玩游戏独立显卡有什么作用呢&#xff1f;如果不玩游戏需要选择独立显卡吗&#xff1f;小编在这里就给大家带来电脑独立显卡的作…

编程书籍集

【1】OS &#xff08;1&#xff09;《深入理解计算机系统》 &#xff08;2&#xff09;《程序员的自我修养&#xff1a;链接、装载与库》 &#xff08;3&#xff09;《程序员修炼之道》 &#xff08;4&#xff09;《计算机程序的构造和解释》 【2】C &#xff08;1&#xff09;…

Spring JMS,消息自动转换,JMS模板

在我的一个项目中&#xff0c;我应该创建一个消息路由器&#xff0c;就像所有路由器都应该从一个主题中提取JMS消息并将其放入另一个主题中一样。 该消息本身是JMS文本消息&#xff0c;实际上包含XML消息。 收到消息后&#xff0c;我还应该添加一些其他数据来丰富消息。 我们不…