在上一个博客中,我说过我将谈论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

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

  1. ajax modelmap,spring mvc+ajax处理JSON返回前台的方法

    在 Spring mvc3中,响应.接受 JSON都十分方便. 使用注解@ResponseBody可以将结果(一个包含字符串和JavaBean的Map),转换成JSON. 使用 @RequestBod ...

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

    如果您一直关注有关Spring,Ajax和JSON的简短博客系列,那么您会回想起我到目前为止已经创建了一个Spring MVC Web应用程序,该应用程序显示一个表单,该表单允许用户选择一堆项目并向服 ...

  3. java去除json 转移,Spring MVC返回的json去除根节点名称的方法

    这篇文章主要介绍了Spring MVC返回的json去除根节点名称的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 spring xml中配置视图如果是如下 那么返回结果会是: {" ...

  4. Spring MVC Ajax返回中文乱码

    因为Spring MVC中返回json要使用@ResponseBody注解,而在Spring源码中这个注解的默认编码是"iso-8859-1",所以传中文的话会乱码.解决办法是,直 ...

  5. Spring MVC 学习笔记 json格式的输入和输出

    Spring mvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用 <!-- json --><depe ...

  6. mvc ajax post json数据,springmvc解决ajax post json格式数据的跨域问题

    前言:今天解决js跨域,搞了一下午,呜呜,以下是我整理的一些解决方法. Paste_Image.png JsonTest click me var jsonData = JSON.stringify( ...

  7. Spring MVC中返回JSON数据的几种方式

    我们都知道Spring MVC 的Controller方法中默认可以返回ModeAndView 和String 类型,返回的这两种类型数据是被DispatcherServlet拿来给到视图解析器进行继 ...

  8. java注解式开发_JAVA语言之Spring MVC注解式开发使用详解[Java代码]

    本文主要向大家介绍了JAVA语言的Spring MVC注解式开发使用详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处 ...

  9. spring MVC之返回JSON数据(Spring3.0 MVC+Jackson+AJAX)

    参考: http://angelbill3.iteye.com/blog/1985075 问题:在进行springmvc返回json数据的时候报如下错误:用上面的controller,访问:http: ...

最新文章

  1. 在Win7 + VMware7下安装Xcode 4
  2. [think]需求从来就没变过,变的是我们对需求的理解
  3. 2015年4月1号 的日志
  4. Karoly Nyisztor
  5. thinking in java(第七章)
  6. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第1节 网络通信概述_5_端口号...
  7. C语言画爱心代码分析
  8. [jzoj NOIP2018模拟11.02]
  9. 如何识别服务器网站有病毒,网站有病毒怎么解决?
  10. iOS HealthKit
  11. 牛客网项目——项目开发(六):点赞,关注和取关,优化登录
  12. cbrt c语音_如何在C语言中实现功能重载?
  13. SFTP传输文件工具FileZilla下载安装教程
  14. mysql数据库储存过程
  15. C++游戏天堂——经典型(2)
  16. 大数据就业前景怎么样?hadoop工程师、数据挖掘、数据分析师薪资多少?
  17. 学习笔记2 - 利用元数据管理数据质量
  18. 《创新思维设计》自学报告#2 | 设计思维的特征
  19. JavaWeb项目中出现No converter found for return value of type的解决方法
  20. [附源码]Python计算机毕业设计Django的高校资源共享平台

热门文章

  1. 对象包装器与自动(拆箱)装箱+参数数量可变的方法+枚举类
  2. 多线程的三种实现方法
  3. HttpClient 4 API –获取状态代码-getStatusLine()。getStatusCode()示例
  4. java动态代理_Java动态代理
  5. jsf表单验证_JSF:在正确的阶段进行验证(了解生命周期)
  6. ejb生命周期_EJB 3.x:生命周期和并发模型(第2部分)
  7. Java大数据处理的流行框架
  8. jboss架构_检查Red Hat JBoss BRMS部署架构的规则和事件(第一部分)
  9. 生成器作为(快速失败)状态机
  10. vue cli3 绑定域名_使用CLI设置WildFly绑定地址并关闭