var 變量名={ "k1":value,//Number類型 "k2":"str",//字符串類型 "k3":[],//數組類型 "k4":{},//json對象類型 "k5":[{},{}]//json數組};
例子:
var myJson={ "key1":1234,//Number類型 "key2":"Hello",//字符串類型 "key3":[1,"he llo",2.3],//數組類型 "key4":{"age":12,"name":"jack"},//json對象類型 "key5":[ //json數組 {"k1":10,"k2":"milan"}, {"k3":30,"k4":"smith"} ]};
k-v形式,然后v中又可以嵌套k-v,并且每對k-v之間用逗號隔開
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>json快速入門案例</title> <script type="text/javascript"> window.onload=function () { /** * myJson 就是一個json對象 */ var myJson={ "key1": 1234,//Number類型 "key2": "Hello",//字符串類型 "key3": [1, "hello", 2.3],//數組類型 "key4": {"age": 12, "name": "jack"},//json對象 "key5": [ //json數組 {"k1": 10, "k2": "milan"}, {"k3": 30, "k4": "smith"} ] }; // 演示如何獲取到json對象的各個屬性/key // 1.取出key1 console.log("key1=", myJson.key1); // 2.取出key3 //這里使用逗號來避免myJson.key3變成字符串 console.log("key3=", myJson.key3); // 可以對key3取出的值(array)遍歷 for (var i=0; i < myJson.key3.length; i++) { //使用下標取出數組的值 console.log("第%i個元素的值=", i, myJson.key3[i]); } //3.取出key4 console.log("key4=", myJson.key4) console.log("key4.name=", myJson.key4.name) //4.取出key5 console.log("key5=", myJson.key5) console.log("取出key5的第二個數組的key4值=", myJson.key5[1].k4) } </script></head><body><h1>json快速入門案例</h1></body></html>
打開瀏覽器控制臺,輸出如下:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>JSON對象和字符串對象轉換</title> <script type="text/javascript"> window.onload=function () { //解讀JSON //1.JSON是一個js的內置對象(build-in),可以直接使用,不需要創建 console.log(JSON); //演示如何將一個JSON對象轉成-->String var jsonPerson={ "name": "jack", "age": 23 } console.log("jsonPerson=", jsonPerson, " jsonPerson類型=", typeof jsonPerson); var strPerson=JSON.stringify(jsonPerson); console.log("strPerson=", strPerson, " strPerson類型=", typeof strPerson); //演示如何將一個String對象轉成-->JSON //注意轉成json對象的字符串格式必須滿足json格式 var strDog="{\"name\":\"小黃狗\",\"age\":2}"; var jsonDog=JSON.parse(strDog); console.log("jsonDog=", jsonDog) } </script></head><body><h1>JSON對象和字符串對象轉換</h1></body></html>
打開瀏覽器控制臺,輸出如下:
例子
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>JSON和字符串轉換的注意事項和細節</title> <script type="text/javascript"> window.onload=function () { var jsonPerson={ "name": "jack", "age": 22 } //1.JSON.stringify(json對象)會返回對應的string,并不會影響原來json對象 var strPerson=JSON.stringify(jsonPerson); console.log("jsonPerson=", jsonPerson); //2.JSON.parse(jsonString)方法會返回對應的json對象,并不會影響原來的string var strDog="{\"name\":\"小黃狗\",\"age\":2}"; var jsonDog=JSON.parse(strDog); console.log("strDog=", strDog, "類型=", typeof strDog) //3.在定義Json對象時,可以使用單引號或者雙引號表示字符串 // 甚至前面的key可以不用任何引號 var jsonCat={ name: '貓貓', age: 2 } console.log("jsonCat=", jsonCat); //4.但是在把原生字符串轉成json對象時,必須使用雙引號"",否則會報錯 //例如: var str_dog2="{name:'小黃狗',age:2}"; // JSON.parse(str_dog2);--報錯 //JSON.springfiy(json對象)返回的字符串都是雙引號`""`表示的字符串, // 所以在語法格式正確的情況下,是可以重新轉成json對象的 var strCat=JSON.stringify(jsonCat); var parse=JSON.parse(strCat); console.log("parse=", parse) } </script></head><body><h1>JSON和字符串轉換的注意事項和細節</h1></body></html>
打開瀏覽器控制臺,輸出如下:
前面講述的是前端頁面中json對象和字符串之間的轉化。在實際開發中,前端將json格式的字符串發送給后端,后端拿到后,可以將其轉成java對象,進行其他操作,并可以在業務操作后,重新向前端發送json格式的字符串。
這意味著在Java后端中,同樣有對象和字符串對象轉換的需求。
在項目中的lib目錄下將gson.jar文件復制過來,點擊add as library作為庫
Javabean:Book類
package com.li.json; //這是一個Javabeanpublic class Book { private Integer id; private String name; public Book(Integer id, String name) { this.id=id; this.name=name; } public Integer getId() { return id; } public void setId(Integer id) { this.id=id; } public String getName() { return name; } public void setName(String name) { this.name=name; } @Override public String toString() { return "Book{" + "id=" + id + ", name='" + name + '\'' + '}'; }}
JavaJson:
package com.li.json; import com.google.gson.Gson; public class JavaJson { public static void main(String[] args) { //創建一個gson對象,作為一個工具對象使用 Gson gson=new Gson(); //演示Javabean和json格式字符串的轉換 Book book=new Book(10001, "三國演義"); //1.演示把一個Javabean轉成json格式的字符串 String strBook=gson.toJson(book); System.out.println("strBook=" + strBook); //2.json字符串-->JavaBean //(1)strBook 就是json字符串 //(2)Book.class 指定將json字符串轉成Book類型的對象 //(3)底層使用反射機制來完成 Book book2=gson.fromJson(strBook, Book.class); System.out.println("book2=" + book2); }}
Book類見4.3
JavaJson:
package com.li.json; import com.google.gson.Gson;import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type;import java.util.ArrayList;import java.util.List; public class JavaJson { public static void main(String[] args) { //創建一個gson對象,做為一個工具對象使用 Gson gson=new Gson(); //3.演示把List對象-->json字符串 ArrayList<Book> bookList=new ArrayList<>(); bookList.add(new Book(100, "天龍八部")); bookList.add(new Book(200, "紅樓夢")); //因為把一個對象或者集合轉成字符串,相對比較簡單 //底層只需要遍歷,按照json格式拼接返回即可 String strBookList=gson.toJson(bookList); System.out.println("strBookList=" + strBookList); //4.把json字符串轉成-->list對象 //(1)如果要把json字符串,轉成 集合 這種比較復雜的類型,需要使用Gson提供的一個類:TypeToken //(2)這個TypeToken類在com.google.gson.reflect下面,在反射對象的時候使用 //(3)TypeToken 是一個自定義泛型類,通過TypeToken來指定我們需要轉換成的類型 /* * public class TypeToken<T> { * final Class<? super T> rawType; * final Type type; * final int hashCode; * * protected TypeToken() { * this.type=getSuperclassTypeParameter(this.getClass()); * this.rawType=Types.getRawType(this.type); * this.hashCode=this.type.hashCode(); * } * ... * ... * } */ /* TypeToken (1)下面的語句new TypeToken<List<Book>>(){}.getType(), 返回類型的完整的路徑 java.util.List<com.li.json.Book> (2)gson的設計者需要得到類型的完整路徑,然后進行底層的反射 (3)所以gson設計者提供了一個TypeToken類來搞定 */ Type type=new TypeToken<List<Book>>(){}.getType(); System.out.println(type.getClass());//class com.google.gson.internal.$Gson$Types$ParameterizedTypeImp // System.out.println("type=" + type);//java.util.List<com.li.json.Book> List<Book> bookList2=gson.fromJson(strBookList, type); System.out.println("bookList2="+bookList2); }}
TypeToken類的作用是:得到類型的完整路徑,然后進行底層的反射
Type type=new TypeToken<List<Book>>(){}.getType();
一個問題,TypeToken為什么要加{}?
我們在Type type=new TypeToken<List<Book>>() {}.getType();處打上斷點,并在TypeToken類中的無參構造器旁也打上斷點。點擊debug,點擊Resume Program按鈕
可以看到光標跳轉到TypeToken類中的無參構造器:
再點擊step over,可以看到,type屬性拿到了類型的完整路徑,這樣才能去進行底層的反射
我們用兩個類來模擬一下上述4.4.1的過程
在src目錄下創建兩個包:t1和t2,在t1中創建一個A類,在t2中創建一個Test類
A類:
package com.li.t1; public class A<T> { protected A() { System.out.println("A 的protected A() 被調用..."); }}
這時如果在Test類中new一個A類對象,那么將會報錯,原因就是被 protected 修飾的成員對于本包和其子類可見。而A和Test類既不在同一個包,也不是繼承關系。這和4.4.1報錯的原因完全一致。
實際上,protected的可見性在于兩點:1.基類的 protected 成員是包內可見的,并且對子類可見;2.若子類與基類不在同一包中,那么在子類中,子類實例可以訪問其從基類繼承而來的protected方法,而不能訪問基類實例的protected方法。
Java protected 關鍵字詳解 | 菜鳥教程 (runoob.com)
package com.li.t2; import com.li.t1.A; public class Test { public static void main(String[] args) { A a=new A<String>() {}; //1.因為A類和Test類不在同一個包,也不是繼承關系,不能訪問A的protected成員,包括構造器 //2. A(){}就是一個匿名內部類,可以理解成A的子類 //3. A(){} 有一個隱式的無參構造器,會調用super() //4. 當你執行 new A(){} 時,會調用A類的 protected無參構造器 // 泛型+匿名內部類 System.out.println(a.getClass());//class com.li.t2.Test }}
Book類見4.3
JavaJson:
package com.li.json; import com.google.gson.Gson;import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; public class JavaJson { public static void main(String[] args) { //創建一個gson對象,做為一個工具對象使用 Gson gson=new Gson(); //5.把map對象轉成-->json字符串 HashMap<String, Book> bookMap=new HashMap<>(); bookMap.put("k1", new Book(400, "射雕英雄傳")); bookMap.put("k2", new Book(500, "楚留香傳奇")); String strBookMap=gson.toJson(bookMap); System.out.println("strBookMap=" + strBookMap); //6.json字符串轉成-->map對象 //new TypeToken<Map<String,Book>>(){}.getType() //===> java.util.Map<java.lang.String, com.li.json.Book> Map<String,Book> bookMap2=gson.fromJson(strBookMap, new TypeToken<Map<String,Book>>(){}.getType()); System.out.println(bookMap2); }}
傳統web應用數據通信方式
缺點:
Ajax數據通信方式:
優點:
AJAX - XMLHttpRequest 對象 (w3school.com.cn)
當請求被發送到服務器時,我們需要執行一些基于響應的任務。
每當 readyState 改變時,就會觸發 onreadystatechange 事件。
readyState 屬性存有 XMLHttpRequest 的狀態信息。
下面是 XMLHttpRequest 對象的三個重要的屬性:
在 onreadystatechange 事件中,我們規定當服務器響應已做好被處理的準備時所執行的任務。
演示JavaScript發送原生Ajax請求的案例
思路
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>用戶注冊</title> <script type="text/javascript"> window.onload=function () {//頁面加載完畢后執行function var checkButton=document.getElementById("checkButton"); checkButton.onclick=function () { //1.創建XMLHttpRequest對象[ajax引擎對象] var xhr=new XMLHttpRequest(); //2.準備發送指定數據 // 2.1獲取用戶填寫的用戶名 var username=document.getElementById("uname").value; // 2.2XMLHttpRequest 對象的 open() 和 send() 方法 // (1)"GET" 請求方式,也可以是post // (2)"/ajax/checkUserServlet?username="+username 就是url // (3) true表示異步發送 xhr.open("GET", "/ajax/checkUserServlet?username=" + username, true); //2.3在send方法調用前,給XMLHttpRequest對象綁定一個事件==>onreadystatechange //每當XMLHttpRequest對象的 readyState 改變時,就會觸發 onreadystatechange 事件 xhr.onreadystatechange=function () { //如果請求已完成,并且響應已經就緒,并且狀態碼是200 if (xhr.readyState==4 && xhr.status==200) { //把返回的json數據顯示在div上 document.getElementById("div1").innerText=xhr.responseText; // console.log("xhr=", xhr); //處理XMLHttpRequest對象中拿到的數據 var responseText=xhr.responseText; // console.log("返回的信息="+responseText); if (responseText !="") { //根據在servlet設置的邏輯,如果返回的數據不是空串,說明該用戶名不可用 document.getElementById("myres").value="用戶名不可用"; } else { document.getElementById("myres").value="用戶名可用"; } } } //2.4真正發送ajax請求[底層還是http請求] //如果前面open的第一個參數指定的是post請求,那么post的參數在send中指定 //如果open的第一個參數指定的是get請求,那么send中不需要寫任何數據,因為前面已經在url中指定了 xhr.send(); } } </script></head><body><h1>用戶注冊</h1><form action="/ajax/checkUserServlet" method="post"> 用戶名字:<input type="text" name="username" id="uname"> <input type="button" id="checkButton" value="驗證用戶名"> <input style="border-width: 0;color: red" type="text" id="myres"><br/><br/> 用戶密碼:<input type="password" name="password"><br/><br/> 電子郵件:<input type="text" name="email"><br/><br/> <input type="submit" value="用戶注冊"></form><h1>返回的 json 數據</h1><div id="div1"></div></body></html>
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>CheckUserServlet</servlet-name> <servlet-class>com.li.ajax.servlet.CheckUserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CheckUserServlet</servlet-name> <url-pattern>/checkUserServlet</url-pattern> </servlet-mapping></web-app>
package com.li.ajax.servlet; import com.google.gson.Gson;import com.li.ajax.entity.User; import javax.servlet.*;import javax.servlet.http.*;import java.io.IOException;import java.io.PrintWriter; public class CheckUserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //System.out.println("CheckUserServlet 被調用..."); //接收ajax提交的數據 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String username=request.getParameter("username");//參數名取決于url中的參數名 System.out.println("uname=" + username); //如果用戶名為king,就認為是不可用的 if ("king".equals(username)) {//假定king已經有人使用了 //后面這個信息是從數據庫db來獲取的 User king=new User(100, "king", "6666", "king@qq.com"); //把king 對象轉成 json 格式的字符串 String strKing=new Gson().toJson(king); //返回信息 response.getWriter().print(strKing); } else { //如果用戶名可用,返回空串即可 response.getWriter().print(""); } }}
package com.li.ajax.entity; /** * User類就是一個Javabean/pojo/entity/domain */public class User { private Integer id; private String name; private String pwd; private String email; public User(Integer id, String name, String pwd, String email) { this.id=id; this.name=name; this.pwd=pwd; this.email=email; } public Integer getId() { return id; } public void setId(Integer id) { this.id=id; } public String getName() { return name; } public void setName(String name) { this.name=name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd=pwd; } public String getEmail() { return email; } public void setEmail(String email) { this.email=email; }}
需求分析:到數據庫中驗證用戶名是否可用
只需在前面的應用實例中進行升級改進,接入DB
項目的整體架構:
# 創建數據庫CREATE DATABASE ajaxdb;# 創建users表CREATE TABLE `user` ( id INT(11) PRIMARY KEY, `username` VARCHAR(32) UNIQUE NOT NULL DEFAULT '', pwd CHAR(32) NOT NULL DEFAULT '', email VARCHAR(32) NOT NULL DEFAULT '')CHARSET utf8 COLLATE utf8_bin ENGINE INNODB; #插入測試數據INSERT INTO `user` VALUES(100,"king",MD5('123'),"king@qq.com");INSERT INTO `user` VALUES(200,"queen",MD5('666'),"queen@qq.com");INSERT INTO `user` VALUES(300,"princess",MD5('999'),"princess@163.com"); SELECT * FROM `user`;DESC `user`;#drop table `user`; #完成的工作SELECT COUNT(*) FROM `user` WHERE `username`="king"
在項目的lib庫下添加德魯伊,Apache-DBUtils,mysql-connect數據庫連接驅動
數據庫連接池詳見:javase基礎-jdbc和數據庫連接池
在項目src目錄下添加德魯伊配置文件
#key=valuedriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/ajaxdb?rewriteBatchedStatements=trueusername=rootpassword=123456#initial connection SizeinitialSize=10#min idle connecton sizeminIdle=5#max active connection sizemaxActive=20#max wait time (5000 mil seconds)maxWait=5000
創建德魯伊工具類JDBCUtilsByDruid
package com.li.ajax.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource;import java.sql.*;import java.util.Properties; /** * 基于Druid數據庫連接池的工具類 */public class JDBCUtilsByDruid { private static DataSource ds; //在靜態代碼塊完成ds的初始化 //靜態代碼塊在加載類的時候只會執行一次,因此數據源也只會初始化一次 static { Properties properties=new Properties(); try { /** * 注意,目前我們是javaweb方式啟動 * 在web項目下要得到資源文件,需要使用類加載器, * 得到它真正執行的目錄下的out/artifacts/項目名/WEB-INF/classes目錄中的資源 */ properties.load(JDBCUtilsByDruid.class.getClassLoader() .getResourceAsStream("druid.properties")); //方式二:也可以使用絕對路徑 //properties.load(new FileInputStream("D:\IDEA-workspace\ajax\src\druid.properties")); ds=DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } //編寫getConnection方法 public static Connection getConnection() throws SQLException { return ds.getConnection(); } //關閉連接(注意:在數據庫連接池技術中,close不是真的關閉連接,而是將Connection對象放回連接池中) public static void close(ResultSet resultSet, Statement statemenat, Connection connection) { try { if (resultSet !=null) { resultSet.close(); } if (statemenat !=null) { statemenat.close(); } if (connection !=null) { connection.close(); } } catch (SQLException e) { throw new RuntimeException(e); } }}
package com.li.ajax.dao; import com.li.ajax.utils.JDBCUtilsByDruid;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler; import java.sql.*; /** * 開發BasicDAO,是其他DAO的父類 */public class BaseDAO<T> {//泛型指定具體的類型 private QueryRunner queryRunner=new QueryRunner(); //查詢單行結果 的通用方法(單行多列) public T querySingle(String sql, Class<T> clazz, Object... parameters) { Connection connection=null; try { connection=JDBCUtilsByDruid.getConnection(); return queryRunner.query(connection, sql, new BeanHandler<T>(clazz), parameters); } catch (SQLException e) { throw new RuntimeException(e);//將一個編譯異常轉變為運行異常 } finally { JDBCUtilsByDruid.close(null, null, connection); } } //根據業務需求還可以有多行多列查詢,單行多列插敘,單行單列查詢等 //這里不再列舉,詳見javase基礎-滿漢樓BasicDAO}
修改3.2中的Javabean--User類
package com.li.ajax.entity; /** * User類就是一個Javabean/pojo/entity/domain */public class User { private Integer id; private String username; private String pwd; private String email; public User() {//注意,一定要有一個空的構造器,方便底層進行反射??! } public User(Integer id, String username, String pwd, String email) { this.id=id; this.username=username; this.pwd=pwd; this.email=email; } public Integer getId() { return id; } public void setId(Integer id) { this.id=id; } public String getUsername() { return username; } public void setUsername(String username) { this.username=username; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd=pwd; } public String getEmail() { return email; } public void setEmail(String email) { this.email=email; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", pwd='" + pwd + '\'' + ", email='" + email + '\'' + '}'; }}
package com.li.ajax.dao; import com.li.ajax.entity.User; /** * 對user表的增刪查改 */public class UserDAO extends BaseDAO<User> { //我們的UserDAO繼承了BasicDAO,并指定了User //這時我們就可以使用BasicDAO中的方法}
package com.li.ajax.service; import com.li.ajax.dao.UserDAO;import com.li.ajax.entity.User;import org.testng.annotations.Test; import java.sql.SQLException; /** * UserService 提供業務方法 */public class UserService { //添加屬性UserDAO,方便操作 private UserDAO userDAO=new UserDAO(); //根據用戶名返回對應的user對象,如果沒有則返回null @Test public User getUserByName(String username) throws SQLException { //使用 User.class 的目的是底層反射創建對象,而反射是調用的無參構造器去創建類, // 因此在對應的實體類中一定要有無參構造器?。。? User user= userDAO.querySingle("SELECT * FROM `user` WHERE `username`=?", User.class, username); return user; }}
package com.li.ajax.servlet; import com.google.gson.Gson;import com.li.ajax.entity.User;import com.li.ajax.service.UserService; import javax.servlet.*;import javax.servlet.http.*;import java.io.IOException;import java.sql.SQLException; public class CheckUserServlet extends HttpServlet { //定義一個UserService屬性 private UserService userService=new UserService(); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //System.out.println("CheckUserServlet 被調用..."); //接收ajax提交的數據 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String username=request.getParameter("username");//參數名取決于url中的參數名 System.out.println("uname=" + username); //從數據庫中查找有無相同的用戶名 try { User userByName=userService.getUserByName(username); if (userByName !=null) {//說明用戶名存在 // 返回該User對象的json格式的字符串 String strUser=new Gson().toJson(userByName); //給瀏覽器返回信息 response.getWriter().print(strUser); } else { //如果返回了null,說明沒有重名的用戶 //用戶名可用,返回空串即可 response.getWriter().print(""); } } catch (SQLException e) { e.printStackTrace(); } }}
詳見3.2應用實例
重啟Tomcat,在瀏覽器中訪問http://localhost:8080/ajax/login.html
原生Ajax請求問題分析:
在線文檔:jQuery 參考手冊 - Ajax (w3school.com.cn)
完整的參數查看手冊:jQuery ajax - ajax() 方法
$.ajax 常用參數:
jQuery AJAX get() 和 post() 方法
$.get()請求和$.post()請求常用參數:
說明:$.get()和 $.post()底層還是使用$.ajax()方法來實現異步請求
get() 方法通過遠程 HTTP GET 請求載入信息
這是一個簡單的 GET 請求功能以取代復雜 $.ajax,請求成功時可調用回調函數。如果需要在出錯時執行函數,請使用 $.ajax().
語法:
$(selector).get(url,data,success(response,status,xhr),dataType)
post() 方法通過 HTTP POST 請求從服務器載入數據。
語法:
jQuery.post(url,data,success(data, textStatus, jqXHR),dataType)
jQuery ajax - getJSON() 方法
$.getJSON()常用參數
說明:$.getJSON()底層使用$.ajax()方法來實現異步請求
$.getJSON()方法通過 HTTP GET 請求載入 JSON 數據,語法:
jQuery.getJSON(url,data,success(data,status,xhr))
演示jquery發送ajax的案例
思路分析:直接參考3.2的思路圖即可
引入jquery庫:
注意:如果有的資源是拷貝進來的,有時候運行目錄out沒有及時更新,這時可以點擊Rebuild Project,如果不行就redeploy Tomcat
配置servlet:
<servlet>
<servlet-name>CheckUserServlet2</servlet-name>
<servlet-class>com.li.ajax.servlet.CheckUserServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CheckUserServlet2</servlet-name>
<url-pattern>/checkUserServlet2</url-pattern>
</servlet-mapping>
創建CheckUserServlet2:
package com.li.ajax.servlet;
import com.google.gson.Gson;
import com.li.ajax.entity.User;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class CheckUserServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收jquery發送的ajax數據
String username=request.getParameter("username");//參數名取決于前端的參數名
response.setContentType("text/json;charset=utf-8");//指定MIME類型為json
Gson gson=new Gson();
if ("king".equals(username)) {
//后面可以接入數據庫database
User user=new User(100, "king", "123", "king@163.com");
response.getWriter().print(gson.toJson(user));
} else {
//返回一個不存在的User-->測試
User user=new User(-1, "", "", "");
response.getWriter().print(gson.toJson(user));
}
}
}
login2.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用戶注冊</title>
<!-- 引入jquery-->
<script type="text/javascript" src="./script/jquery-3.6.1.min.js"></script>
<script type="text/javascript">
$(function () {
//綁定事件
$("#btn1").click(function () {
//發出ajax請求
/**
* 1.指定參數時,需要在{}里面
* 2.指定參數時,需要指定參數名
* 3.dataType:"json" 代表要求服務器返回的數據是json,
* 如果服務器返回的不是json,就會解析出錯
*/
$.ajax({
url: "/ajax/checkUserServlet2",
type: "post",
data: {//這里我們直接給一個json
username: $("#uname").val(),
date : new Date()//防止瀏覽器緩存
},
error:function () {//失敗后的回調函數
console.log("失敗")
},
success:function (data,status,xhr) {
console.log("成功");
console.log("data=",data);
console.log("status=",status);
console.log("xhr=",xhr);
//data是一個json對象,需要轉成json字符串
$("#div1").html(JSON.stringify(data));
//對返回的結果進行處理
if (""==data.username){//說明用戶名可用
$("#myres").val("該用戶名可用");
}else {
$("#myres").val("該用戶名不可用");
}
},
dataType:"json"
})
})
})
</script>
</head>
<body>
<h1>用戶注冊-Jquery+Ajax</h1>
<form action="/ajax/checkUserServlet2" method="post">
用戶名字:<input type="text" name="username" id="uname">
<input type="button" id="btn1" value="驗證用戶名">
<input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>
用戶密碼:<input type="password" name="password"><br/><br/>
電子郵件:<input type="text" name="email"><br/><br/>
<input type="submit" value="用戶注冊">
</form>
<h1>返回的 json 數據</h1>
<div id="div1"></div>
</body>
</html>
使用4.5的應用實例,將上面的html頁面改寫,其他不變。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用戶注冊</title>
<!-- 引入jquery-->
<script type="text/javascript" src="./script/jquery-3.6.1.min.js"></script>
<script type="text/javascript">
$(function () {
//綁定事件
$("#btn1").click(function () {
//演示$.get()使用
// $.get()默認是get請求,不需要指定請求方式
//不需要寫參數名,但是參數的位置要正確對應,
// 順序是:url,data,success回調函數,返回的數據格式
$.get(
"/ajax/checkUserServlet2",
{//這里我們直接給一個json
username: $("#uname").val(),
date: new Date()//防止瀏覽器緩存
},
function (data, status, xhr) {
console.log("$.get成功")
console.log("data=", data);
console.log("status=", status);
console.log("xhr=", xhr);
//data是一個json對象,需要轉成json字符串
$("#div1").html(JSON.stringify(data));
//對返回的結果進行處理
if (""==data.username) {//說明用戶名可用
$("#myres").val("該用戶名可用");
} else {
$("#myres").val("該用戶名不可用");
}
},
"json"
)
})
})
</script>
</head>
<body>
<h1>用戶注冊-Jquery+Ajax</h1>
<form action="/ajax/checkUserServlet2" method="post">
用戶名字:<input type="text" name="username" id="uname">
<input type="button" id="btn1" value="驗證用戶名">
<input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>
用戶密碼:<input type="password" name="password"><br/><br/>
電子郵件:<input type="text" name="email"><br/><br/>
<input type="submit" value="用戶注冊">
</form>
<h1>返回的 json 數據</h1>
<div id="div1"></div>
</body>
</html>
使用4.5的應用實例,將上面的html頁面改寫,其他不變。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用戶注冊</title>
<!-- 引入jquery-->
<script type="text/javascript" src="./script/jquery-3.6.1.min.js"></script>
<script type="text/javascript">
$(function () {
//綁定事件
$("#btn1").click(function () {
//$.post 和 $.get的調用方式基本一樣,只是這時是以post方式發送ajax請求
$.post(
"/ajax/checkUserServlet2",
{//這里我們直接給一個json
username: $("#uname").val(),
date: new Date()//防止瀏覽器緩存
},
function (data, status, xhr) {
console.log("$.post成功")
console.log("data=", data);
console.log("status=", status);
console.log("xhr=", xhr);
//data是一個json對象,需要轉成json字符串
$("#div1").html(JSON.stringify(data));
//對返回的結果進行處理
if (""==data.username) {//說明用戶名可用
$("#myres").val("該用戶名可用");
} else {
$("#myres").val("該用戶名不可用");
}
},
"json"
)
})
})
</script>
</head>
<body>
<h1>用戶注冊-Jquery+Ajax</h1>
<form action="/ajax/checkUserServlet2" method="post">
用戶名字:<input type="text" name="username" id="uname">
<input type="button" id="btn1" value="驗證用戶名">
<input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>
用戶密碼:<input type="password" name="password"><br/><br/>
電子郵件:<input type="text" name="email"><br/><br/>
<input type="submit" value="用戶注冊">
</form>
<h1>返回的 json 數據</h1>
<div id="div1"></div>
</body>
</html>
使用4.5的應用實例,將上面的html頁面改寫,其他不變。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用戶注冊</title>
<!-- 引入jquery-->
<script type="text/javascript" src="./script/jquery-3.6.1.min.js"></script>
<script type="text/javascript">
$(function () {
//綁定事件
$("#btn1").click(function () {
//如果你通過jquery發出的ajax請求是get請求,并且返回的數據格式是json,
// 可以直接使用getJSON()函數,很方便
$.getJSON(
"/ajax/checkUserServlet2",
{//這里我們直接給一個json
username: $("#uname").val(),
date: new Date()//防止瀏覽器緩存
},
function (data, status, xhr) {//成功后的回調函數
console.log("$.getJSON成功")
console.log("data=", data);
console.log("status=", status);
console.log("xhr=", xhr);
//data是一個json對象,需要轉成json字符串
$("#div1").html(JSON.stringify(data));
//對返回的結果進行處理
if (""==data.username) {//說明用戶名可用
$("#myres").val("該用戶名可用");
} else {
$("#myres").val("該用戶名不可用");
}
}
)
})
})
</script>
</head>
<body>
<h1>用戶注冊-Jquery+Ajax</h1>
<form action="/ajax/checkUserServlet2" method="post">
用戶名字:<input type="text" name="username" id="uname">
<input type="button" id="btn1" value="驗證用戶名">
<input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>
用戶密碼:<input type="password" name="password"><br/><br/>
電子郵件:<input type="text" name="email"><br/><br/>
<input type="submit" value="用戶注冊">
</form>
<h1>返回的 json 數據</h1>
<div id="div1"></div>
</body>
</html>
● 需求分析: 到數據庫去驗證用戶名是否可用
提示: 根據day34-JSON&Ajax02-3.3練習 的 ajax 請求+jdbc+mysql 到數據庫驗證案例完成
根據之前的day34-JSON&Ajax02-3.3練習,我們已經寫了JDBCUtilsByDruid,BaseDAO,UserDAO,UserService,User等類,只需要在CheckUserServlet2中修改一下代碼即可完成:
package com.li.ajax.servlet;
import com.google.gson.Gson;
import com.li.ajax.entity.User;
import com.li.ajax.service.UserService;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.sql.SQLException;
public class CheckUserServlet2 extends HttpServlet {
private UserService userService=new UserService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/json;charset=utf-8");//指定MIME類型為json
Gson gson=new Gson();
//接收jquery發送的ajax數據
String username=request.getParameter("username");//參數名取決于前端的參數名
//到數據庫中查找有無重名用戶
try {
User userByName=userService.getUserByName(username);
//如果有返回的就是一個User對象,如果沒有,返回的就是null
response.getWriter().print(gson.toJson(userByName));
} catch (SQLException e) {
e.printStackTrace();
}
}
}
前端html頁面使用4.5.4的$.getJSON()方法發送ajax請求,在4.5.4代碼的基礎上修改返回數據的判斷條件即可
《大數據和人工智能交流》頭條號向廣大初學者新增C 、Java 、Python 、Scala、javascript 等目前流行的計算機、大數據編程語言,希望大家以后關注本頭條號更多的內容。
使用Jquery的Ajax實現用戶注冊時候的重名檢測,如果注冊的用戶名為“lily”的時候則提示“該用戶名已存在”,否則提示“該用戶名可用”
1、前端頁面
頁面users.jsp代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<script src="js/jquery-1.6.js"></script>
<form method="get">
用戶名:<input type="text" id="usersId" name="usersname"/>
<input type="button" value="重名檢測" onclick="checkData()"/>
<span id="s001" style="color:red"></span>
</form>
2、在前端頁面增加Ajax控制
<script>
function checkData(){
var usersIdObj=$("#usersId");
var usersName=usersIdObj.val();
s001Obj=$("#s001");
$.get("/ajaxServer/AjaxServlet", { get_usersName: usersName },
function(data){
if(data==1){
s001Obj.text("該用戶名已存在");
}else{
s001Obj.text("該用戶名可用");;
}
}
);
}
</script>
3、Java的Servlet服務端及其配置
【1】web服務端的Servlet的代碼如下:
package com.test;
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 {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
String usersname=request.getParameter("get_usersName");
System.out.println(usersname);
if (!"lily".equals(usersname)){
out.println(0);
}else{
out.println(1);
}
}
}
【2】、web.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>AjaxServlet</servlet-name>
<servlet-class>com.test.AjaxServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AjaxServlet</servlet-name>
<url-pattern>/AjaxServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
《大數據和人工智能交流》的宗旨
1、將大數據和人工智能的專業數學:概率數理統計、線性代數、決策論、優化論、博弈論等數學模型變得通俗易懂。
2、將大數據和人工智能的專業涉及到的數據結構和算法:分類、聚類 、回歸算法、概率等算法變得通俗易懂。
3、最新的高科技動態:數據采集方面的智能傳感器技術;醫療大數據智能決策分析;物聯網智慧城市等等。
根據初學者需要會有C語言、Java語言、Python語言、Scala函數式等目前主流計算機語言。
根據讀者的需要有和人工智能相關的計算機科學與技術、電子技術、芯片技術等基礎學科通俗易懂的文章。
錄
@RequestMapping("/loadOrderList") @ResponseBody public List<Order> loadOrderList(String uid){ //模擬訂單數據 Order o1=new Order(); o1.setId("111"); o1.setTotal(333.33); o1.setDate("2019-4-29"); Order o2=new Order(); o2.setId("222"); o2.setTotal(444.44); o2.setDate("2019-5-29"); Order o3=new Order(); o3.setId("333"); o3.setTotal(555.55); o3.setDate("2019-6-29"); List<Order> list=new ArrayList<>(); list.add(o1); list.add(o2); list.add(o3); return list; }
//index.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script> <script type="text/javascript"> function sendAjax() { $.post("http://localhost:7070/order/loadOrderList", "uid=1234", function (data) { alert(data); }); } </script> </head> <body> <a href="javascript:sendAjax()">sendAjax</a> </body> </html>
Accept: */* Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Connection: keep-alive Content-Length: 8 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Host: localhost:7070 Origin: http://localhost:9090 協議+域名+端口
一. 在服務端添加響應頭Access-Control-Allow-Origin
<dependency> <groupId>com.thetransactioncompany</groupId> <artifactId>cors-filter</artifactId> <version>2.5</version> <scope>runtime</scope> </dependency>
<filter> <filter-name>CORS</filter-name> <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> <init-param> <param-name>cors.allowOrigin</param-name><!--這個標簽是關鍵, *代表所有源都能訪問--> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.supportedMethods</param-name> <param-value>GET, POST, HEAD, PUT, DELETE</param-value> </init-param> <init-param> <param-name>cors.supportedHeaders</param-name> <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value> </init-param> <init-param> <param-name>cors.exposedHeaders</param-name> <param-value>Set-Cookie</param-value> </init-param> <init-param> <param-name>cors.supportsCredentials</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CORS</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
二. 使用JSONP解決
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script> <script> function doCallBack(data){ var str=JSON.stringify(data); alert(str); } </script> </head> <body> <script src="http://localhost:7070/order/loadOrderList3?uid=111&callBack=doCallBack"></script> </body> </html>
@RequestMapping("/loadOrderList3") @ResponseBody public String loadOrderList3(String uid, String callBack){ //模擬訂單數據 Order o1=new Order(); o1.setId("111"); o1.setTotal(333.33); o1.setDate("2019-4-29"); Order o2=new Order(); o2.setId("222"); o2.setTotal(444.44); o2.setDate("2019-5-29"); Order o3=new Order(); o3.setId("333"); o3.setTotal(555.55); o3.setDate("2019-6-29"); List<Order> list=new ArrayList<>(); list.add(o1); list.add(o2); list.add(o3); //拼接js代碼 String result=callBack + "(" + JSON.toJSONString(list) + ")"; return result; }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script> <script> function sendAjax(){ $.getJSON("http://localhost:7070/order/loadOrderList3?callBack=?","uid=111", function (data) { var str=JSON.stringify(data); alert(str); }); } </script> </head> <body> <a href="javascript:sendAjax()">sendAjax</a> </body> </html>
小結
*請認真填寫需求信息,我們會在24小時內與您取得聯系。