javascript
Spring MVC,Ajax和JSON第2部分–服务器端代码
在上一個博客中,我說過我將談?wù)揝pring,Ajax和JSON,但是沒有。 原因是我想使用(很少)可信的購物網(wǎng)站場景來設(shè)置場景。 在這種情況下,當(dāng)用戶單擊“電子商務(wù)”頁面鏈接時,服務(wù)器應(yīng)用程序?qū)⒓虞d目錄中的某些項目并將其顯示在頁面上。 然后,用戶檢查多個項目并按“確認(rèn)購買”。 現(xiàn)在,這就是Ajax和JSON的來源,在按“確認(rèn)購買”時,瀏覽器向向其發(fā)送項目ID的服務(wù)器發(fā)出Ajax請求。 然后,服務(wù)器從數(shù)據(jù)庫中檢索項目,并將它們作為JSON返回到瀏覽器。 然后,瀏覽器處理JSON,并在屏幕上顯示項目。
我的最后一個博客涉及創(chuàng)建并顯示一個顯示項目列表的表單
從虛構(gòu)目錄到用戶。 該博客介紹了該項目的下一步:創(chuàng)建一些JSON。
在過去的幾年中,Spring的家伙們一直在忙于Ajax和JSON的開發(fā),并且,正如您所期望的,他們在后臺為您做了很多工作。 這意味著您要做的就是定義一個簡單的bean類,Spring可以將其轉(zhuǎn)換為JSON并編寫一些控制器代碼。 在這種情況下,Spring將轉(zhuǎn)換為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。
創(chuàng)建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批注(使用confirm和RequestMethod.POST值)映射我的表單屬性
以前的博客對此方法進(jìn)行了介紹。
modelAttribute批注告訴Spring從表單發(fā)布的數(shù)據(jù)創(chuàng)建并映射userSelections對象,并將其注入confirmPurchases(...)方法的userSelections參數(shù)。 UserSelections類是一個便捷類,它包裝String的列表。 盡管是Lazy Class反模式的示例,但該類用于輕松地與Spring的<form:checkbox>標(biāo)記集成,并且在實際應(yīng)用中將包含更多屬性。
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輸入對象轉(zhuǎn)換為OrderForm輸出對象,該對象將作為JSON傳遞回瀏覽器。 通過遍歷OrderForm對象中包含的Item ID列表并使用偽catalogue服務(wù)查找相應(yīng)的Item來創(chuàng)建UserSelection對象。 一旦有了Item的列表,它便使用Java的UUID類創(chuàng)建唯一的購買ID。 然后,它將Item的列表和購買ID傳遞給OrderForm的構(gòu)造函數(shù),然后將訂單表單傳遞回Spring。 不要忘記@ResposeBody批注,它告訴Spring使用合適的HttpMessageConverter將OrderForm綁定到HTTP響應(yīng)主體。 這就是神奇的地方。您可能會猜到,HTTP響應(yīng)正文需要包含具有正確媒體類型的數(shù)據(jù)才能通過Internet發(fā)送,而OrderForm絕對不適合該賬單。 為了解決該問題,Spring似乎在項目配置中查看了轉(zhuǎn)換OrderForm對象的合適方法,在該方法中,它找到了在上一個博客中添加到項目中的jackson-core和jackson-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對象轉(zhuǎn)換為JSON。 所有這些都意味著您和我實際上不必做任何真正的編碼即可生成我們的JSON輸出。 相當(dāng)聰明吧!
顯然,在后臺進(jìn)行的所有這些神奇的拼圖游戲都隱藏了實際的JSON輸出,因此,我發(fā)現(xiàn)創(chuàng)建一個類似于以下所示的簡單單元測試很有用:
@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); }您可能會認(rèn)為這不是真正的測試,因為它沒有聲明任何內(nèi)容。 該測試的價值在于直觀地顯示JSON輸出,并確保杰克遜解析器可以將您附加到HTTP響應(yīng)主體的對象轉(zhuǎn)換為JSON。 如果不能,那么在運行此測試時,您將獲得一個異常。
因此,這就是服務(wù)器端代碼。 在這個簡短的系列文章中,下一個(也可能是最后一個)博客將介紹客戶端代碼。 有關(guān)此博客的完整源代碼,請參見GitHub – https://github.com/roghughe/captaindebug/tree/master/ajax-json
參考: Spring MVC,Ajax和JSON第2部分–來自Captain Debug博客博客的JCG合作伙伴 Roger Hughes提供的服務(wù)器端代碼 。翻譯自: https://www.javacodegeeks.com/2013/05/spring-mvc-ajax-and-json-part-2-the-server-side-code.html
總結(jié)
以上是生活随笔為你收集整理的Spring MVC,Ajax和JSON第2部分–服务器端代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信工资理财收益如何计算?
- 下一篇: Spring MVC,Ajax和JSON