中国自助主做网站有哪些,北京黑马计算机培训机构,浪琴官网,做网站编辑好还是推广好在上一个博客中#xff0c;我说过我将谈论Spring#xff0c;Ajax和JSON#xff0c;但是没有。 原因是我想使用#xff08;很少#xff09;可信的购物网站场景来设置场景。 在这种情况下#xff0c;当用户单击“电子商务”页面链接时#xff0c;服务器应用程序将加载目录… 在上一个博客中我说过我将谈论SpringAjax和JSON但是没有。 原因是我想使用很少可信的购物网站场景来设置场景。 在这种情况下当用户单击“电子商务”页面链接时服务器应用程序将加载目录中的某些项目并将其显示在页面上。 然后用户检查多个项目并按“确认购买”。 现在这就是Ajax和JSON的来源在按“确认购买”时浏览器向向其发送项目ID的服务器发出Ajax请求。 然后服务器从数据库中检索项目并将它们作为JSON返回到浏览器。 然后浏览器处理JSON并在屏幕上显示项目。 我的最后一个博客涉及创建并显示一个显示项目列表的表单 从虚构目录到用户。 该博客介绍了该项目的下一步创建一些JSON。 在过去的几年中Spring的家伙们一直在忙于Ajax和JSON的开发并且正如您所期望的他们在后台为您做了很多工作。 这意味着您要做的就是定义一个简单的bean类Spring可以将其转换为JSON并编写一些控制器代码。 在这种情况下Spring将转换为JSON的类是OrderForm类 public class OrderForm { private final ListItem items; private final String purchaseId; public OrderForm(ListItem items, String purchaseId) { super(); this.items items; this.purchaseId purchaseId; } public ListItem 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(ListString selections) { ListItem items findItemsInCatalogue(selections); String purchaseId getPurchaseId(); OrderForm orderForm new OrderForm(items, purchaseId); return orderForm; } private ListItem findItemsInCatalogue(ListString selections) { ListItem items new ArrayListItem(); 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批注使用confirm和RequestMethod.POST值映射我的表单属性 以前的博客对此方法进行了介绍。 form:form modelAttributeuserSelections actionconfirm methodpost modelAttribute批注告诉Spring从表单发布的数据创建并映射userSelections对象并将其注入confirmPurchases(...)方法的userSelections参数。 UserSelections类是一个便捷类它包装String的列表。 尽管是Lazy Class反模式的示例但该类用于轻松地与Spring的form:checkbox标记集成并且在实际应用中将包含更多属性。 public class UserSelections { private ListString selection Collections.emptyList(); public ListString getSelection() { return selection; } public void setSelection(ListString 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使用合适的HttpMessageConverter将OrderForm绑定到HTTP响应主体。 这就是神奇的地方。您可能会猜到HTTP响应正文需要包含具有正确媒体类型的数据才能通过Internet发送而OrderForm绝对不适合该账单。 为了解决该问题Spring似乎在项目配置中查看了转换OrderForm对象的合适方法在该方法中它找到了在上一个博客中添加到项目中的jackson-core和jackson-databind库。 dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-core/artifactIdversion2.0.4/version/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.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 MVCAjax和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