將JSON功能添加到您的GWT應用程序中

JSON簡介
在Web應用程序上工作時,總是會出現客戶端-服務器數據交換的問題。 在此問題上有多種方法,其中許多使用XML進行交換。 執行此任務的一種不太知名的格式是JSON。 JSON(JavaScript對象表示法)是一種輕量級的數據交換格式。 這對人類來說很容易讀寫,對機器來說也很容易解析和生成。 盡管JSON在傳輸的數據上可能有所不同,但與XML相比,JSON被認為不那么冗長,過時。 在線上有多種資源可幫助您開始使用JSON 。

JSON庫
JSON是一種完全獨立于語言的文本格式,并且提供了可用于大量編程語言的庫。 對于Java中的JSON ,實現的源代碼可用。 請注意,該站點未在存檔文件中提供二進制文件,但是我們已經編譯了這些類并將它們捆綁在一個JAR文件中,您可以在此處直接下載。

GWT和JSON集成
在本教程中,我將向您展示如何在GWT中操作JSON,以便您可以與啟用JSON的Web應用程序進行通信。 請注意,在GWT應用程序中,實現客戶端與服務器通信的最常見方法是通過RPC調用 。 因此,使用JSON通常適用于通過普通的舊HTTP調用訪問外部服務器的情況。

創建應用程序
讓我們開始創建一個新的Eclipse項目(“ File?New?Web Application Project”)并將其命名為“ JsonGwtProject”。 選擇僅支持Google的Web工具包,而不支持App Engine。 服務器的角色將由GWT SDK提供的嵌入式Jetty容器扮演。

創建項目框架后,編輯模塊聲明文件(在本例中為“ JsonGwtProject.gwt.xml”)。 在讀取“其他模塊繼承”的行之后添加以下行,以使您的GWT應用程序啟用JSON。

<inherits name="com.google.gwt.json.JSON" />

領域模型對象
現在,讓我們創建將用于保存數據的模型對象。 我們的模型是具有各個領域的“產品”類:

  • 名稱
  • 公司
  • 序列號
  • 價格

為了說明如何使用嵌套的JSON表達式,將使用多種價格。

相應的Java類(普通的Java舊對象)如下:

package com.javacodegeeks.json.gwt.server.model;import java.util.LinkedList;
import java.util.List;public class Product {private String name;private String company;private String serialNumber;private List<Double> prices = new LinkedList<Double>();public Product(String name, String company, String serialNumber, List<Double> prices) {super();this.name = name;this.company = company;this.serialNumber = serialNumber;this.prices = prices;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}public String getSerialNumber() {return serialNumber;}public void setSerialNumber(String serialNumber) {this.serialNumber = serialNumber;}public List<Double> getPrices() {return prices;}public void setPrices(List<Double> prices) {this.prices = prices;}}

應用程序的服務器端
現在,讓我們創建應用程序的服務器端代碼。 我們將創建一個servlet,該servlet將用于模擬從中檢索數據的外部服務器。 Servlet使用產品的靜態列表創建對客戶端的JSON響應(在實際應用程序中,將從DAO或更好地從其他服務中獲取產品)。 確保將下載的json.jar包含在項目的類路徑中,并且還將其復制到“ war \ WEB-INF \ lib”文件夾中。 servlet代碼如下:

package com.javacodegeeks.json.gwt.server;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.json.JSONObject;import com.javacodegeeks.json.gwt.server.model.Product;public class ProductsServlet extends HttpServlet {private static final long serialVersionUID = 8032611514671727168L;private static List<Product> products = new LinkedList<Product>();static {Product product1 = new Product("Prod1", "Company1", "12345", Arrays.asList(123.2, 123.6));Product product2 = new Product("Prod2", "Company2", "67890", Arrays.asList(234.2, 234.6));products.add(product1);products.add(product2);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {JSONObject responseObj = new JSONObject();List<JSONObject> productObjects = new LinkedList<JSONObject>();for (Product product : products) {JSONObject productObj = new JSONObject();productObj.put("name", product.getName());productObj.put("company", product.getCompany());productObj.put("serialNumber", product.getSerialNumber());List<JSONObject> pricesObjects = new LinkedList<JSONObject>();for (Double price : product.getPrices()) {JSONObject priceObj = new JSONObject();priceObj.put("price", price);pricesObjects.add(priceObj);}productObj.put("prices", pricesObjects);productObjects.add(productObj);}responseObj.put("products", productObjects);PrintWriter writer = resp.getWriter();writer.write(responseObj.toString());writer.flush();} catch (Exception e) {   e.printStackTrace();throw new ServletException(e);}}}

Java JSON響應生成
讓我解釋一下如何生成JSON響應。 確保您是從org.json包而不是com.google.gwt.json導入JSON類。 第一步是創建一個JSONObject,它將保存響應。 由于我們很可能擁有許多產品,因此我們還創建了一個JSONObjects列表。 我們遍歷現有產品,并為每個產品創建一個單獨的對象。 在該對象中,我們添加鍵值對,就像使用Map一樣。 對于價格,我們還創建了一個JSONObjects列表,然后將整個列表添加到產品的JSONObject中。 最后,我們將產品對象列表添加到響應的JSONObject中。 JSONObject的toString()方法用于創建字符串表示形式。 對于該示例,結果為:

{“產品”:
[
{“公司”:“公司1”,“名稱”:“產品1”,“價格”:[{“價格”:123.2},{“價格”:123.6}],“序列號”:“ 12345”} {“公司”:“公司2”,“名稱”:“產品2”,“價格”:[{“價格”:234.2},{“價格”:234.6}],“序列號”:“ 67890”} ]}

web.xml中的Servlet配置
現在讓我們配置應用程序,以便Servlet響應特定的URL。 編輯web.xml文件(位于“ war / WEB-INF”中)并粘貼以下內容(所有帶有greetingService聲明的原始內容都將被刪除):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><!-- Servlets --><servlet><servlet-name>ProductsServlet</servlet-name><servlet-class>com.javacodegeeks.json.gwt.server.ProductsServlet</servlet-class></servlet><servlet-mapping><servlet-name>ProductsServlet</servlet-name><url-pattern>/jsongwtproject/products.json</url-pattern></servlet-mapping><!-- Default page to serve --><welcome-file-list><welcome-file>JsonGwtProject.html</welcome-file></welcome-file-list></web-app>

GWT的客戶端
最后,讓我們創建GWT應用程序的入口點“ JsonGwtProject”(原始內容已完全刪除)。 客戶端將調用對服務器的HTTP GET調用,將接收JSON格式的響應,然后解析響應。 代碼是:

package com.javacodegeeks.json.gwt.client;import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.RootPanel;public class JsonGwtProject implements EntryPoint {public void onModuleLoad() {final Button fetchDataButton = new Button("Fetch data");fetchDataButton.addStyleName("sendButton");RootPanel.get("fetchDataButtonContainer").add(fetchDataButton);fetchDataButton.addClickHandler(new ClickHandler() {public void onClick(ClickEvent event) {fetchDataFromServer();}});}private void fetchDataFromServer() {try {RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, "/jsongwtproject/products.json");rb.setCallback(new RequestCallback() {@Overridepublic void onResponseReceived(Request request, Response response) {parseJsonData(response.getText());}@Overridepublic void onError(Request request, Throwable exception) {Window.alert("Error occurred" + exception.getMessage());}});rb.send();} catch (RequestException e) {Window.alert("Error occurred" + e.getMessage());}}private void parseJsonData(String json) {JSONValue value = JSONParser.parse(json);JSONObject productsObj = value.isObject();JSONArray productsArray = productsObj.get("products").isArray();if (productsArray != null) {for (int i=0; i<=productsArray.size()-1; i++) {JSONObject productObj = productsArray.get(i).isObject();String name = productObj.get("name").isString().stringValue();String company = productObj.get("company").isString().stringValue();String serialNumber = productObj.get("serialNumber").isString().stringValue();StringBuffer priceSb = new StringBuffer();JSONArray pricesArray = productObj.get("prices").isArray();if (pricesArray != null) {for (int j=0; j<=pricesArray.size()-1; j++) {JSONObject priceObj = pricesArray.get(j).isObject();double price = priceObj.get("price").isNumber().doubleValue();if (j!=pricesArray.size()-1) {priceSb.append("-");}}}String message = "Product -- " +"\nName: " + name + "\nCompany: " + company +"\nSerial: " + serialNumber + "\nPrices: " +  priceSb.toString();Window.alert(message);}}}}

對于HTTP調用,使用RequestBuilder類。 定義了HTTP方法(GET)以及端點URL(已將servlet配置為響應)。 然后,使用RequestCallback類提供異步回調方法。 最后,請求被發送。 當響應從服務器到達時(如果未發生錯誤),將調用我們的parseJsonData方法。 使用GWT解析JSON數據現在,讓我們看看如何使用GWT內置方法解析接收到的數據。 確保您是從com.google.gwt.json包而不是org.json導入JSON類。 首先,我們使用JSONParser從字符串響應中創建一個JSONValue對象。 然后,我們使用isObject()方法檢索一個JSONObject實例。 因為我們知道響應實際上是產品列表,所以我們通過調用JSONValue的isArray()方法來創建JSONArray類。 然后使用一個循環,并使用發生的JSONString對象的stringValue()方法提取模型的字段。 請注意,為了提取多個價格值,我們使用相同的過程遍歷JSONArray對象。 準備HTML文件還必須更改“ JsonGwtProject.html”,以便為界面的按鈕提供占位符。 編輯它,并在“ noscript”聲明之后添加以下幾行:

...<h1>Web Application Starter Project</h1><table align="center"><tr><td id="fetchDataButtonContainer"></td></tr><tr><td colspan="2" style="color:red;" id="errorLabelContainer"></td></tr></table>
...

運行示例如果我們運行項目,則會出現該界面,實際上只有一個按鈕。 點擊按鈕。 檢索JSON數據,執行解析并將結果打印在屏幕上: 僅此而已。 與往常一樣,您可以從此處下載Eclipse項目。

請享用!

相關文章 :
  • GWT EJB3 Maven JBoss 5.1集成教程
  • 使用Spring Security保護GWT應用程序
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示
  • 建立自己的GWT Spring Maven原型
  • 將CAPTCHA添加到您的GWT應用程序

翻譯自: https://www.javacodegeeks.com/2010/07/add-json-gwt-application.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374558.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

win10資源管理器怎么打開_讓你效率倍增的電腦神器,最強資源管理器增強工具「QTTabBar」...

前言Windows 自帶的資源管理器的功能比較簡單&#xff0c;夠用是夠用了&#xff0c;但有時也確實無法滿足我們對更便捷高效的操作方式的追求。「QTTabBar」正是一個非常強大的 Windows 資源管理器增強工具&#xff01;不僅支持多標簽頁管理&#xff0c;還有許多便捷的擴展功能&…

android橫向滑動選擇的view

做文字編輯&#xff0c;從網上找來的。 HorizontalScrollSelectView&#xff1a; public boolean mAlwaysOverrideTouch true;protected ListAdapter mAdapter;private int mLeftViewIndex -1;private int mRightViewIndex 0;protected int mCurrentX;protected int mNextX;…

適用于Mac OS X的官方Java 7 –狀態

希望到現在&#xff0c;每個人都知道蘋果公司去年加入了OpenJDK項目。 這意味著什么&#xff1f; 蘋果將??把用于私有Mac Java構建的代碼作為GPL代碼貢獻給OpenJDK 甲骨文將接管Java的Mac端口 隨著時間的流逝&#xff0c;Mac平臺將成為Java世界中完全一流的公民 對于想要在…

excel使用教程_數據分析Excel必備技能:數據透視表使用教程

江米小棗tonylua | 作者掘金 | 來源處理數量較大的數據時&#xff0c;一般分為數據獲取、數據篩選&#xff0c;以及結果展示幾個步驟。在 Excel 中&#xff0c;我們可以利用數據透視表(Pivot Table)方便快捷的實現這些工作。本文首先手把手的教你如何在 Excel 中手動構建一個基…

.典型用戶 - 場景

典型用戶&#xff1a; 名字黃德勝性別、年齡男&#xff0c;35歲職業自由投資人收入20萬元/年知識層次和能力專科&#xff0c;有一定的投資經驗&#xff0c;對經濟有自己的看法生活/工作情況已婚&#xff0c;生活負擔在加重動機&#xff0c;目的&#xff0c;困難想要增加收入&am…

java調用webservice_篤學私教:Java開發網站架構演變過程-從單體應用到微服務架構詳解...

原標題&#xff1a;篤學私教&#xff1a;Java開發網站架構演變過程-從單體應用到微服務架構詳解Java開發網站架構演變過程&#xff0c;到目前為止&#xff0c;大致分為5個階段&#xff0c;分別為單體架構、集群架構、分布式架構、SOA架構和微服務架構。下面玄武老師來給大家詳細…

再把你的錢加倍

總覽 很久以前&#xff0c;我寫了一篇關于用雙倍賺錢的文章。 但是&#xff0c;當解決方案相當簡單時&#xff0c;仍然是許多開發人員普遍擔心的問題。 用雙倍賺錢的問題 double有兩種類型的錯誤。 它存在表示錯誤。 即&#xff0c;它不能完全代表所有可能的十進制值。 即使0…

單元測試中Assert類的用法

Assert類所在的命名空間為Microsoft.VisualStudio.TestTools.UnitTesting 在工程文件中只要引用Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll就可以使用了&#xff0c; 在這里我會舉例說明Assert里面的一些主要的靜態成員。 1、 AreEqual&#xff1a;方法被重載…

CocoaPods安裝使用

$ gem sources --remove https://rubygems.org/ //等有反應之后再敲入以下命令 $ gem sources -a http://ruby.taobao.org/*** CURRENT SOURCES ***http://ruby.taobao.org/ //出現這個說明安裝正確$ sudo gem install cocoapods 安裝cocoaPods到項目的路徑下 $ touch Pod…

303. 區域和檢索 - 數組不可變(數組前綴和知識應用)

給定一個整數數組 nums&#xff0c;處理以下類型的多個查詢: 計算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之間的 nums 元素的 和 &#xff0c;其中 left < right 實現 NumArray 類&#xff1a; NumArray(int[] nums) 使用數組 nums 初始化對象 in…

pat1049. Counting Ones (30)

1049. Counting Ones (30) 時間限制10 ms內存限制65536 kB代碼長度限制16000 B判題程序Standard作者CHEN, YueThe task is simple: given any positive integer N, you are supposed to count the total number of 1s in the decimal form of the integers from 1 to N. For ex…

加油站會員管理系統源碼php_加油站使用會員管理系統,如何解決行業瓶頸?

隨著人們生活條件的不斷改善&#xff0c;基本上家家戶戶都有了私家車輛&#xff0c;這對于加油站而言&#xff0c;覆蓋的客戶量也逐漸增多。現在很多加油站還是處于比較傳統的收銀模式和會員營銷管理模式&#xff0c;收銀效率低&#xff0c;客戶得不到全方面的管理。尤其是在高…

專2-第二課 Eclipse開發環境搭建

2.1下載Eclipse 2.2 安裝C/C版本的Eclipse 2.3 安裝JDT插件開發Java程序 2.4 使用Eclipse開發驅動程序 既然安裝了eclipse來進行驅動學習&#xff0c;那么我們就先來試試看eclipse開發驅動的大致流程。這里以Linux設備驅動作為示列給讀者展示整個流程&#xff0c;Android底層的…

使用JAXB從XSD生成XML

這是最初由JCG合作伙伴 Experiences Unlimited的Mohamed Sanaulla發表的帖子。 Mohamed解釋了如何使用JAXB從給定的XSD生成XML 。 &#xff08;注意&#xff1a;對原始帖子進行了少量編輯以提高可讀性&#xff09; 我們可以使用JAXB使用給定的Schema將Java對象編組為XML&#…

tkinter 菜單添加事件_Tasker的最新測試劫持了Android 11的電源菜單

流行的Android自動化應用Tasker 最近收到了重大更新&#xff0c;為該應用引入了許多新功能。該更新包括解鎖應用程序讀取手機上任何傳感器以觸發任務的功能&#xff0c;使您可以通過任何第三方應用程序自動發送短信或撥打電話的功能&#xff0c;完全請勿打擾自定義功能。通過鏈…

CLR via C#(18)——Enum

1. Enum定義 枚舉類型是經常用的一種“名稱/值”的形式&#xff0c;例如&#xff1a; public enum FeedbackStatus { New, Processing, Verify, Closed } 定義枚舉類型之后我們在使用時方便了許多&#xff0c;不用再記著0代表什么狀態…

PHP中 magic_quotes_gpc 和 magic_quotes_runtime 區別及其反斜線轉義問題

php中關于反斜線轉義&#xff1a;php中數據的魔法引用函數 magic_quotes_gpc 或 magic_quotes_runtime 設置為on時&#xff0c;當數據遇到 單引號 和 雙引號" 以及 反斜線\ NULL時自動加上反斜線&#xff0c;進行自動轉義。注釋&#xff1a;默認情況下&#xff0c;PH…

JDK中的設計模式

Zen的JCG合作伙伴Brian Du Preez 是IT藝術領域的合作伙伴&#xff0c;他在收集JDK中最常見的設計模式方面做得非常出色。 模式列表確實令人印象深刻且很長&#xff0c;所以讓我們不再ba不休&#xff0c;向您展示它。 前幾天&#xff0c;我在企業Dev中看到了Rob Williams Brain …

414. 第三大的數

給你一個非空數組&#xff0c;返回此數組中 第三大的數 。如果不存在&#xff0c;則返回數組中最大的數 方法一 首先將數組排序&#xff0c;然后通過集合去除重復的元素&#xff0c;最后進行一次判斷&#xff0c;選擇第三大元素還是最大元素 class Solution {public int thir…

bufferevent 與 socket

http://blog.sina.com.cn/s/blog_56dee71a0100qx4s.html 很多時候&#xff0c;除了響應事件之外&#xff0c;應用還希望做一定的數據緩沖。比如說&#xff0c;寫入數據的時候&#xff0c;通常的運行模式是&#xff1a; l 決定要向連接寫入一些數據&#xff0c;把數據放入到緩沖…