1. jQuery
jQuery是一個JavaScript函數庫,極大的簡化了JavaScript編程,很容易學習。jQuery是目前最流行的開源js框架,並且提供了大量的擴展。
2. Ajax
Ajax(Asynchronous JavaScript and XML,異步JavaScript和XML)時一種創建交互式網頁應用的網頁開發技術,它並不是一項新的技術,其產生的目的是用於實現頁面的局部刷新。通過Ajax技術可以使之前的應用程序在每次提交時不用進行頁面的整體刷新,從而提升操作的性能。
3. GET和POST
兩種最常用的 HTTP 方法是:GET 和 POST。
定義:GET是從指定的資源請求數據,POST是從指定的資源提交要被處理的數據。
數據內容:GET請求的數據附加在url之后,只允許ASCII字符(采用ASCII編碼),請求的數據會暴露在地址欄中。POST請求會把請求的數據放在HTTP請求包的包體中,也允許二進制數據,不會把數據暴露在地址欄。
數據長度:GET有限制,在使用GET請求時,數據大小會受到url長度的限制(URL 的最大長度是 2048 個字符)。POST無限制。
安全性:GET 的安全性較差(與POST相比),因為所發送的數據是 URL 的一部分。在發送密碼或其他敏感信息時絕不要使用 GET !POST 比 GET 更安全,因為參數不會被保存在瀏覽器歷史或 web 服務器日志中。
4. Jackson
Jackson是當前用的比較廣泛的,用來序列化和反序列化json的Java開源框架。Jackson社區相對比較活躍,更新速度也比較快, 從Github中的統計來看,Jackson是最流行的json解析器之一,Spring MVC的默認json解析器便是Jackson。
5. Servlet處理(jQuery)Ajax請求(不發送數據/發送key/value數據/發送json數據)
開發環境:eclipse+jsp+jQuery+servlet+tomcat+ajax
5.1 Servlet處理(jQuery)Ajax請求(不發送數據,返回普通文本)
(1) 搭建環境:
在eclipse中新建Java web項目(會自動導入JRE System Library包),比如我把項目名字寫為AjaxDemo1,並將項目部署到tomcat服務器上,下面是eclipse中項目的目錄結構:
我們先不用管lib中的jar包。注意這里有一個jquery-3.2.1.min.js,這是jQuery的開發包,我們可以在網上下載,把這個js文件復制粘貼到WebContent目錄下即可。下面我會一步一步分析。下面進行開發。
(2) 編寫index.jsp文件
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 3 <%-- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> --%> 4 <% 5 String path = request.getContextPath(); 6 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() 7 + path + "/"; 8 %> 9 <!DOCTYPE html> 10 <html> 11 <head> 12 <base href="<%=basePath%>"> 13 <title>I LOVE YOU</title> 14 <link rel="stylesheet" type="text/css" href=""> 15 <script type="text/javascript" src="index.js"></script> 16 <script type="text/javascript" src="jquery-3.2.1.min.js"></script> 17 18 19 </head> 20 <body> 21 22 23 <button id="mybutton" value="異步請求服務器" onclick="fun1()" >(jquery)(jQuery)ajax請求(不發送數據)</button> 24 <spand id="show" /> 25 26 <br/> 27 <hr/> 28 29 30 <button id="mybutton1" value="異步請求服務器" onclick="fun2()" >發送數據格式為key/value的(jquery)ajax請求</button> 31 <spand id="show1" /> 32 33 <br/> 34 <hr/> 35 <button id="mybutton2" value="異步請求服務器" onclick="fun3()" >發送數據格式為json的(jquery)ajax請求</button> 36 <spand id="show2" /><br/> 37 38 </body>
這里我們實現了三個按鈕,並且調用了對應的函數。我們先來看第一個按鈕(id="mybutton")。這個文件引入了2個js文件。一個是我們自己編寫的index.js文件,另一個是我們使用jQuery框架開發時所用的js文件。我把index.jsp,index.js,jquery-3.2.1.min.js都放在了WebContent目錄下(方便操作)。
(3) 編寫index.js文件
1 /** 2 * 3 */ 4 //使用jquery提交ajax請求(不攜帶數據) 5 function fun1(){ 6 7 $.ajax({ 8 9 type:"POST", //發送方式 10 url:"AjaxServlet", //請求地址 11 data:"", //數據為空 12 success:function(data){ //成功后的回調函數 13 14 $("#show").html(data); //頁面展示內容 15 16 } 17 }); 18 } 19 20 21 //使用jquery提交key/value數據(ajax請求) 22 23 function fun2(){ 24 25 $.ajax({ 26 27 type:"POST", 28 url:"AjaxServlet1", 29 data:"username=wly&password=1314520", //key/value數據 30 success:function(data){ 31 32 $("#show1").html(data); 33 34 } 35 }); 36 37 } 38 39 40 //使用jquery提交json數據(ajax請求) 41 42 function fun3(){ 43 44 var user={ //符合json數據格式規范的javascript對象 45 "username":"wly", 46 "password":"1314520" 47 }; 48 $.ajax({ 49 50 type:"POST", 51 url:"AjaxServlet2", 52 contentType:"application/json;charset=UTF-8", //發送數據到服務器時所使用的內容類型 53 data:JSON.stringify(user), //將javascript對象轉化為json字符串 54 55 //預期的服務器響應的數據類型。服務器返回json字符串。jquery會自動把json轉化為js對象 56 dataType:"json", //相當於調用JSON.parse(data)方法。此時我們省去即可。 57 success:function(data){ 58 59 $("#show2").html(data.username+" "+data.password); 60 61 } 62 }); 63 }
觀察fun1()函數,data為空,很簡單,代碼都有注釋,這里不做過多解釋。體現出jQuery的風格,簡單易用。
(4) 編寫Srvlet文件
package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AjaxServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("我想你了哈哈!"); out.close(); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
代碼很簡單,就返回一句話(普通文本)。沒啥好說的。
(5) web.xml文件配置Servlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>AjaxDemo</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>AjaxServlet</servlet-name> <servlet-class>com.servlet.AjaxServlet</servlet-class> </servlet> <servlet> <servlet-name>AjaxServlet1</servlet-name> <servlet-class>com.servlet.AjaxServlet1</servlet-class> </servlet> <servlet> <servlet-name>AjaxServlet2</servlet-name> <servlet-class>com.servlet.AjaxServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>AjaxServlet</servlet-name> <url-pattern>/AjaxServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AjaxServlet1</servlet-name> <url-pattern>/AjaxServlet1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AjaxServlet2</servlet-name> <url-pattern>/AjaxServlet2</url-pattern> </servlet-mapping> </web-app>
配置很簡單。這里不用多說。這篇相當於是ajax的進階版。不懂的話可以看我第一篇博客:Servlet處理原生Ajax請求
(6) 運行程序
啟動tomcat,在瀏覽器上輸入地址,點擊按鈕,運行效果如下:
5.2 Servlet處理(jQuery)Ajax請求(發送key/value數據,返回普通文本)
(1)編寫jsp文件
上面的index.jsp文件已經寫好了,看第二個按鈕就行了。
(2)編寫js文件
上面index.js已經寫好了,注意看fun2()函數,發送的是key/value類型數據。
(3)編寫Servlet文件
1 package com.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class AjaxServlet1 extends HttpServlet { 12 13 protected void doGet(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 16 response.setContentType("text/html;charset=UTF-8"); 17 PrintWriter out = response.getWriter(); 18 String username = request.getParameter("username"); 19 String password = request.getParameter("password"); 20 System.out.println(username + " " + password); 21 out.print("helloworld " + "username:" + username + " password:" + password); 22 out.close(); 23 24 } 25 26 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 27 this.doGet(req, resp); 28 } 29 }
使用request.getParameter(String stringParam)接受客戶端傳來的數據。返回一個連接字符串。
(4)web.xml文件配置Servlet
上面已經配置好了,這里不多說。
(5)運行程序
5.3 Servlet處理(jQuery)Ajax請求(發送json數據,返回json數據)
(1)導入Jackson的jar包
Jackson是用來解析json數據的第三方類庫,通過上面項目目錄我們發現,在lib下由三個Jaskson相關開發包。Jackson核心模塊由這三部分組成:
1. jackson-core 核心包,提供基於”流模式”解析的相關 API,它包括 JsonPaser 和 JsonGenerator。Jackson 內部實現正是通過高性能的流模式 API 的 JsonGenerator 和 JsonParser 來生成和解析 json。
2. jackson-annotations 注解包,提供標准注解功能;
3. jackson-databind 數據綁定包,提供基於”對象綁定” 解析的相關 API( ObjectMapper )和”樹模型” 解析的相關 API(JsonNode);基於”對象綁定” 解析的 API 和”樹模型”解析的 API 依賴基於”流模式”解析的 API。
有興趣的話可以研究一下源碼,這里就不多說了。這里我們發現使用Jackson導入的jar包比較少(相比於json-lib)。
(2)新建實體User類
1 package com.entity; 2 3 public class User { 4 5 private String username; 6 7 private String password; 8 9 public String getUsername() { 10 return username; 11 } 12 13 public void setUsername(String username) { 14 this.username = username; 15 } 16 17 public String getPassword() { 18 return password; 19 } 20 21 public void setPassword(String password) { 22 this.password = password; 23 } 24 25 @Override 26 public String toString() { 27 return "User [username=" + username + ", password=" + password + "]"; 28 } 29 30 }
簡單易懂,不多說。
(3)編寫jsp文件
上面已經寫好,看第三個按鈕就行了。
(4)編寫js文件
看fun3()函數就可以了,代碼有注釋。注意這塊由個contentType屬性,發送數據到服務器所使用的內容類型,這里我們設置的是contentType:"application/json;charset=UTF-8"。指定發送數據格式為json格式,字符編碼為UTF-8。還有一個dataType屬性,我們設置為“json”,當服務器響應成功時,我們調用回調函數,相當於預期知道服務器響應的數據類型,就可以自動的把json字符串轉化為javascript對象。相當於JSON.parse(data)方法。這里我們省略掉了這個方法,因為jQuery已經幫我們格式化好了。
(5)編寫Servlet文件
第一步,先編寫Jackson的工具類。
1 package com.util; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.UnsupportedEncodingException; 7 8 import javax.servlet.http.HttpServletRequest; 9 10 import com.entity.User; 11 import com.fasterxml.jackson.databind.ObjectMapper; 12 13 public class JsonReader { 14 15 public static User receivePost(HttpServletRequest request) throws UnsupportedEncodingException, IOException { 16 17 // 讀取請求內容 18 BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8")); 19 20 String line = null; 21 StringBuilder sb = new StringBuilder(); 22 23 while ((line = br.readLine()) != null) { 24 sb.append(line); 25 } 26 27 // 將json字符串轉化為java對象 28 ObjectMapper json = new ObjectMapper(); 29 User user = json.readValue(sb.toString(), User.class); 30 return user; 31 } 32 33 }
第二步,編寫servlet
1 package com.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 import com.entity.User; 11 import com.fasterxml.jackson.databind.ObjectMapper; 12 import com.util.JsonReader; 13 14 public class AjaxServlet2 extends HttpServlet { 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) 17 throws ServletException, IOException { 18 19 // response.setContentType("text/html;charset=UTF-8"); 20 21 response.setContentType("application/json;charset=UTF-8"); 22 23 User user = JsonReader.receivePost(request); 24 25 System.out.println(user); 26 27 ObjectMapper mapper = new ObjectMapper(); 28 29 // 將java對象轉化為json字符串 30 String json = mapper.writeValueAsString(user); 31 32 System.out.println(json); 33 response.getWriter().print(json); 34 35 } 36 37 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 38 this.doGet(req, resp); 39 } 40 }
我們注意到有個ObjectMapper類,ObjectMapper是JSON操作的核心,Jackson的所有JSON操作都是在ObjectMapper中實現。它位於jackson-databind-2.0.0-jar里面。這里我們介紹ObjectMapper類下常用到的方法。 public <T> T readValue(JsonParser jp, Class<T> valueType)這個方法可以將json字符串轉化為java對象。public String writeValueAsString(Object value)這個方法可以將java對象轉化為json字符串。先介紹用到的這2個方法。其他的自己看看源碼。
(6)web.xml文件配置Servlet
同理,上面已經配置好了。這里不多說。
(7)跑一下程序
5.4 Servlet處理(jQuery)Ajax請求(發送key/value數據,返回json數據)(補充)
(1)編寫jsp文件
<button id="mybutton3" value="異步請求服務器" onclick="fun4()" >發送數據格式為key/value的(jquery)ajax請求(返回json)</button> <spand id="show3" />
(2)編寫js文件
//使用jquery提交key/value數據(ajax請求)(返回json數據) function fun4(){ $.ajax({ type:"POST", url:"AjaxServlet3", data:"username=wly&password=1314520", //key/value數據 success:function(data){ $("#show3").html("嘿嘿 "+data.username+" "+data.password); } }); }
(3)新建User實體類
上面已經寫好,不多說,User類,屬性username和password,並提供setter和gettter方法。
(4)編寫Servlet類
package com.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.entity.User; import com.fasterxml.jackson.databind.ObjectMapper; public class AjaxServlet3 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json;charset=utf-8");
User user = new User(); String username = request.getParameter("username"); String password = request.getParameter("password"); user.setUsername(username); user.setPassword(password); System.out.println(user); ObjectMapper mapper = new ObjectMapper(); // 將java對象轉化為json字符串 String json = mapper.writeValueAsString(user); System.out.println(json); response.getWriter().print(json); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
很簡單,就是新建一個User對象,通過request.getparameter(String s)獲取屬性值,再將值設置到user對象當中,最后利用jackson把user對象轉化為json字符串返回。
(5)web.xml配置Servlet
<servlet> <servlet-name>AjaxServlet3</servlet-name> <servlet-class>com.servlet.AjaxServlet3</servlet-class> </servlet> <servlet-mapping> <servlet-name>AjaxServlet3</servlet-name> <url-pattern>/AjaxServlet3</url-pattern> </servlet-mapping>
(6)運行程序
6. 總結
(1)使用jQuery使代碼更加簡潔,易懂易用(jQuery輕量級)。
(2)JQuery將所有的Ajax操作封裝到一個函數$.ajax()里,使得開發者處理Ajax的時候能夠專心處理業務邏輯而無需關心復雜的瀏覽器兼容性和XMLHttpRequest對象的創建和使用的問題。Jquery的ajax操作比較完善。
(3)Jackson性能分析:
1. Jackson 所依賴的jar包較少,簡單易用。
2.與其他 Java 的 json 的框架 Gson 等相比,Jackson 解析大的 json 文件速度比較快。
3. Jackson 運行時占用內存比較低,性能比較好
4. Jackson 有靈活的 API,可以很容易進行擴展和定制。
本篇博客源碼鏈接:https://pan.baidu.com/s/1e8XqC01RVg9p8yKL7vtwfA 提取碼:mbnt