IT兄弟連 JavaWeb教程 AJAX以及JSON字元串經典案例
- 2019 年 10 月 5 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/ITXDL123/article/details/91039800
案例需求:客戶端發送AJAX請求伺服器端獲取用戶資訊的數據。
案例實現:
在伺服器端要將Java對象轉換成JSON字元串,如果使用拼接JSON字元串的方式非常繁瑣,並且非常容易出錯,所以一般會藉助第三方Jar包來輔助我們把Java對象編程JSON字元串。
在伺服器端將單個Java對象轉換成JSON字元串使用JSONObject類的靜態方法:formObject (Object object),該方法返回一個JSONObject對象,調用該對象的toString()方法即可完成轉換。
在客戶端將JSON字元串轉換為JavaScript對象,常用的方法有如下幾種:
● 使用eval函數:
var jsonStr = 『{「id」:1,「name」:「張三」}』;
var obj = eval( " ( " + str + " ) " );
● 使用JSON.parse函數
var jsonStr = 『{「id」:1,「name」:「張三」}』;
var obj = JSON.parse(str);
可以發現使用JSON.parse函數可以更方便的將JSON字元串轉換為JavaScript對象,這也是推薦的方式。
下面的案例將演示如何使用Ajax從伺服器端查詢一個用戶資訊並使用json-lib.jar工具包將用戶對象轉換為JSON字元串然後返回到客戶端。
首先新建一個動態的Web工程,工程名為xdl_ajax_demo,項目構建成功後在lib目錄下添加json-lib.jar以及它的依賴包:
● commons-beanutils.jar
● commons-collections.jar
● common-logging.jar
● common-lang.jar
● ezmorph.jar
● json-lib.jar
然後再新建com.xdl.bean包並在包下定義一個User類,用來封裝用戶數據,包括以下屬性:
name:姓名
age:年齡
gender:性別
salary:薪水
User類的詳細程式碼如下:
package com.xdl.bean;
public class User {
private String name; //姓名 private int age; //年齡 private String gender; //性別 private double salary; //薪水 /** * 構造器 * @param name * @param age * @param gender * @param salary */ public User(String name, int age, String gender, double salary) { this.name = name; this.age = age; this.gender = gender; this.salary = salary; } /** * 無參構造器 */ public User(){ } //Get and Set方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; }
}
接下來新建com.xdl.servlet包並在包下定義一個GetUserInfoServlet類,可以返回User對象的JSON字元串數據。詳細程式碼如下:
package com.xdl.servlet;
import com.xdl.bean.User;
import net.sf.json.JSONObject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/getUserInfo")
public class GetUserInfoServlet extends HttpServlet {
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { User user = new User("三十畫生",26,"男",5000.0); String jsonStr = JSONObject.fromObject(user).toString(); response.setContentType("text/html;charset=UTF-8"); response.getWriter().write(jsonStr); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }
}
編寫HTML頁面user.html,使用Ajax發送請求,把返回的用戶資訊JSON字元串經過解析後顯示到頁面上。詳細程式碼如下:
<meta charset="UTF-8"> <title>Title</title> <script type="text/javascript"> function getUserInfo(){ var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp"); xhr.open('get','getUserInfo',true); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ var userInfo = xhr.responseText; userInfo = JSON.parse(userInfo); document.getElementById("name").innerHTML = 'name:' + userInfo.name; document.getElementById("age").innerHTML = 'age:' + userInfo.age; document.getElementById("gender").innerHTML = 'gender:' + userInfo.gender; document.getElementById("salary").innerHTML = 'salary:' + userInfo.salary; } }; xhr.send(null); } </script>
<button type="button" onclick="getUserInfo()">獲取用戶資訊</button> <h2 id="name"></h2> <h2 id="age"></h2> <h2 id="gender"></h2> <h2 id="salary"></h2>
最後啟動Tomcat伺服器,然後打開瀏覽器並輸入http://localhost:8080/xdl_ajax_ demo/user.html,瀏覽器將顯示如圖4所示的頁面。
此時點擊獲取用戶資訊按鈕,網頁將發送Ajax請求獲取用戶資訊,最後瀏覽器將顯示如圖5所示的頁面,表示瀏覽器已經獲取到伺服器端返回的JSON格式的用戶數據,並且已經成功解析。
圖4 user.html
圖5 頁面成功接收並解析服務端返回的用戶資訊
案例需求:在上一個案例中,是客戶端發送AJAX請求,服務端返回所有用戶資訊。
案例實現:
在伺服器端將Java集合轉換為JSON字元串需要使用JSONArray類的靜態方法:formObject(Object object),該方法返回一個JSONArray對象,調用該對象的toString()方法即可完成轉換。
下面將在之前xdl_ajax_demo項目的基礎上進行,演示了如何使用Ajax從伺服器端查詢一個用戶資訊列表並使用json-lib.jar工具包將用戶列表對象轉換為JSON字元串然後返回到客戶端。
首先在com.xdl.servlet包下定義GetUserInfoListServlet類,可以返回User對象集合的JSON字元串數據。詳細程式碼如下:
package com.xdl.servlet;
import com.xdl.bean.User;
import net.sf.json.JSONArray;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/getUserInfoList")
public class GetUserInfoListServlet extends HttpServlet {
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { User user1 = new User("三十畫生",26,"男",5000.0); User user2 = new User("二十畫生",24,"女",15000.0); List<User> userList = new ArrayList<>(); userList.add(user1); userList.add(user2); String jsonStr = JSONArray.fromObject(userList).toString(); response.setContentType("text/html;charset=UTF-8"); response.getWriter().write(jsonStr); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }
}
編寫HTML頁面userlist.html,使用Ajax發送請求,把返回的用戶資訊列表的JSON字元串經過解析後顯示到頁面上。詳細程式碼如下:
<meta charset="UTF-8"> <title>Title</title> <script type="text/javascript"> function getUserInfoList(){ var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp"); xhr.open('get','getUserInfoList',true); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ var userInfoList = xhr.responseText; userInfoList = JSON.parse(userInfoList); var userInfoListTable = document.getElementById("userInfo List"); userInfoListTable.innerText = ''; var rowHead = userInfoListTable.insertRow(); rowHead.insertCell().innerHTML = 'NAME'; rowHead.insertCell().innerHTML = 'AGE'; rowHead.insertCell().innerHTML = 'GENDER'; rowHead.insertCell().innerHTML = 'SALARY'; for(var i = 0;i<userInfoList.length;i++){ var userInfo = userInfoList[i]; var row = userInfoListTable.insertRow(); row.insertCell().innerHTML = userInfo.name; row.insertCell().innerHTML = userInfo.age; row.insertCell().innerHTML = userInfo.gender; row.insertCell().innerHTML = userInfo.salary; } } } xhr.send(null); } </script>
<button type="button" onclick="getUserInfoList()">獲取用戶資訊列表</button> <table id="userInfoList"></table>
最後啟動Tomcat伺服器,然後打開瀏覽器並輸入http://localhost:8080/xdl_ajax_ demo/userlist.html,瀏覽器將顯示如圖6所示的頁面。
此時點擊獲取用戶資訊列表按鈕,網頁將發送Ajax請求獲取用戶資訊列表,最後瀏覽器將顯示如下圖7所示的頁面,表示瀏覽器已經獲取到伺服器端返回的JSON格式的用戶列表數據,並且已經成功解析。
圖6 userlist.html
圖7 頁面成功接收並解析服務端返回的用戶資訊列表