需要插件 Jquery、jar包:json-lib-2.2.3-jdk15.jar及其他jar包如下:
完成結果:【這種寫法只能用數據庫中id=1的第一條數據登錄,是什么原因呢?還在實驗中】
具體代碼:
1、前台js+html代碼
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登錄</title> <!--引入js--> <script src="./jquery-3.3.1.js"></script> <script type="text/javascript"> function login(){ var uname = $("#uname").val(); var pwd = $("#pwd").val(); alert(uname); $.ajax({ type : "post", async : false, //異步請求(同步請求將會鎖住瀏覽器,用戶其他操作必須等待請求完成才可以執行) url : "UserServlet", //請求發送到UserServlet處 data : {"uname":uname,"pwd":pwd}, dataType : "json", //返回數據形式為json success : function(result) { //請求成功時執行該函數內容,result即為服務器返回的json對象 for(var i=0;i<result.length;i++){ alert(result[i].id+result[i].uname+result[i].nickname+result[i].pwd); //后期將獲得的數據加入html addLabel(result[i].id,result[i].uname,result[i].nickname,result[i].pwd) } //隱藏加載動畫略 }, error : function(errorMsg) { //請求失敗時執行該函數 alert("請求數據失敗!"); myChart.hideLoading(); } }); } //實現添加元素的函數 function addLabel(id,uname,nickname,pwd){ $("thead").append("<tr>") $("thead").append("<td>"+id+"</td>"); $("thead").append("<td>"+uname+"</td>"); $("thead").append("<td>"+nickname+"</td>"); $("thead").append("<td>"+pwd+"</td></tr>"); } </script> <style type="text/css"> *{ margin:0 auto; padding:0; } #container{ width:600px; height:500px; border:1px solid red; border-radius:10%; } /**將行內元素設置為塊元素,並分行控制**/ #cover_uname{ margin-top:200px; width:300px; height:50px; display:block; } #cover_pwd{ width:300px; height:50px; display:block; } #cover_login{ width:60px; height:50px; display:block; } </style> </head> <body> <div id="container"> <span id="cover_uname">賬戶:<input type="text" id="uname"/></span> <span id="cover_pwd">密碼:<input type="text" id="pwd"/></span> <span id="cover_login"><button onclick="login()">登錄</button></span> </div> <div id="content"> <table border="1" style="border-collapse:collapse;border:1px solid red;"> <thead><tr><td colspan="4" align="center">信息</td></tr></thead> </table> </div> </body> </html>
2、servlet代碼:
package gc.servlet; import gc.dao.UserDao; import gc.json.ToJson; 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; /** * @author macbook * @see 用戶登錄控制/增刪改查控制 */ public class UserServlet extends HttpServlet { private static final long serialVersionUID = 1L; public UserServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/json; charset=utf-8"); response.setHeader("cache-control", "no-cache"); PrintWriter out = response.getWriter(); ToJson json = new ToJson(); UserDao dao = new UserDao(); //根據狀態,進行判斷 String uname = request.getParameter("uname"); String pwd = request.getParameter("pwd"); System.out.println(uname+pwd); //login登錄 String loginStatus = dao.login(uname, uname); if(loginStatus.equals("fail")){ //調轉到登錄失敗頁面 response.sendError(404); }else { //說明獲取到昵稱,返回昵稱和用戶信息 out.print(json.getAUserJson(uname)); System.out.println(json.getAUserJson(uname)); } //reg注冊 //del刪除 //update修改 //select查詢 out.flush(); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3、其他隊數據庫操作的類和轉化為json數據的類:
數據庫信息的類:
package gc.util; public class MySqlDBInfor { public static String driverName = "com.mysql.jdbc.Driver"; public static String url = "jdbc:mysql://127.0.0.1:3306/gc?useUnicode=true&characterEncoding=UTF-8"; public static String user = "root"; public static String pwd = "123456"; }
連接數據庫的類:
package gc.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ConnectDB { static Connection connection = null;//1. //數據庫連接 public static Connection getConnectDB(){ try { Class.forName(MySqlDBInfor.driverName);//2. connection = DriverManager.getConnection(MySqlDBInfor.url,MySqlDBInfor.user,MySqlDBInfor.pwd);//3. return connection; } catch (Exception e) { System.out.println(e.getMessage()); } return connection; } //數據庫連接關閉 public static void closeDB(){ try { getConnectDB().close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @see 用於向數據庫插入數據 * @param sql * @return */ public static int updateData(String sql){ try { Statement statement = getConnectDB().createStatement(); int a = statement.executeUpdate(sql); if(a>0)return 1; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } /** * @see 查詢數據 * @param sql * @return */ public static ResultSet queryData(String sql){ Statement statement; try { statement = getConnectDB().createStatement(); ResultSet set = statement.executeQuery(sql); return set; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace();//出現異常就直接返回null return null; } } public static boolean insertData(String sql){ try { Statement statement = getConnectDB().createStatement(); if(statement.executeUpdate(sql)>0)return true; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } public static void main(String[] args) throws SQLException { String sql = "select *from user;"; ResultSet set = ConnectDB.queryData(sql); while (set.next()) { System.out.println(set.getString("uname")); } } }
操作類:
package gc.dao; import gc.table.User; import gc.util.ConnectDB; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; public class UserDao { Connection connection = ConnectDB.getConnectDB(); User user; //查詢賬戶 public List<User> selectUser(String sql){ PreparedStatement statement; List<User> list = new ArrayList<User>(); ResultSet set; try { statement = connection.prepareStatement(sql); set = statement.executeQuery(); while (set.next()) { user = new User(); user.setId(set.getString("id")); user.setUname(set.getString("uname")); user.setPwd(set.getString("pwd")); user.setNickname(set.getString("nickname")); list.add(user); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } //插入賬戶 //刪除賬戶 //修改賬戶 //以上是基本操作,下面是servlet調用時的一些特例操作 //登錄,密碼賬號爭取,賬號正確,密碼不正確【由於不設置驗證碼,故必須二者均要正確才行,避免撞庫】 public String login(String uname,String pwd){ String sql = "select *from user;"; List<User> users = selectUser(sql); for (int i = 0; i < users.size();) { User user = users.get(i); if (user.getUname().equals(uname)&&user.getPwd().equals(pwd)) { return user.getNickname(); }else { return "fail"; } } return "fail"; } //測試 public static void main(String[] args) { UserDao dao = new UserDao(); String sql = "select *from user;"; List<User> list = dao.selectUser(sql); for (int i = 0; i < list.size(); i++) { User user = list.get(i); System.out.println(user.getUname()); } //測試json化的數據,已在ToJson類內進行測試使用時調用即可 } }
將數據轉化為json的類:
package gc.json; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import gc.dao.UserDao; import gc.table.User; import gc.util.ConnectDB; //將所有表的查詢到的結果轉化為json數據的類 public class ToJson { //首先對表中某些字段的值進行統計,然后再交給本類 public void json(String countType,int countNum){ } public void json(){ } /** * 本類用於將json數據直接交給html的測試 */ public List<FakeForms> getJsonTest(){ //1、獲取數據庫數據,並進行統計 //2、對數據進行json轉化 //3、實現基帶板類型統計,然后將之數據化 //4、x表示板卡類型,y表示統計 String sql = "select count(if(basebandBoard='BPN2',basebandBoard,null)) BPN2,count(if(basebandBoard='CCE1',basebandBoard,null)) CCE1,count(if(basebandBoard='BPP1',basebandBoard,null)) BPP1,count(if(basebandBoard='FA4',basebandBoard,null)) FA4,count(if(basebandBoard='FA4A',basebandBoard,null)) FA4A,count(if(basebandBoard='FA6',basebandBoard,null)) FA6,count(if(basebandBoard='PM10',basebandBoard,null)) PM10,count(if(basebandBoard='PM10B',basebandBoard,null)) PM10B,count(if(basebandBoard='SA0',basebandBoard,null)) SA0 from four;"; Connection connection = ConnectDB.getConnectDB(); List<FakeForms> fours = new ArrayList<>(); try { PreparedStatement statement = connection.prepareStatement(sql); ResultSet set = statement.executeQuery(); while (set.next()) { FakeForms fakeForms = new FakeForms(); fakeForms.setBPN2(set.getString("BPN2")); fakeForms.setBPP1(set.getString("BPP1")); fakeForms.setCCE1(set.getString("CCE1")); fakeForms.setFA4(set.getString("FA4")); fakeForms.setFA4A(set.getString("FA4A")); fakeForms.setFA6(set.getString("FA6")); fakeForms.setPM10(set.getString("PM10")); fakeForms.setPM10B("PM10B"); fakeForms.setSA0(set.getString("SA0")); fours.add(fakeForms); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } return fours; } //獲取用戶json數據 public JSONArray getUserJson(){ UserDao dao2 = new UserDao(); String sql = "select *from user;"; List<User> list = dao2.selectUser(sql); JSONArray jsonArray = new JSONArray(); for (int i = 0; i < list.size(); i++) { User user = list.get(i); //數據json化 JSONObject jsonObject = JSONObject.fromObject(user); jsonArray.add(jsonObject); } //測試 //System.out.println(jsonArray); return jsonArray; } //獲取單個用戶json數據 public JSONArray getAUserJson(String uname){ UserDao dao2 = new UserDao(); String sql = "select *from user where uname='"+uname+"';"; List<User> list = dao2.selectUser(sql); JSONArray jsonArray = new JSONArray(); for (int i = 0; i < list.size(); i++) { User user = list.get(i); //數據json化 JSONObject jsonObject = JSONObject.fromObject(user); jsonArray.add(jsonObject); } //測試 //System.out.println(jsonArray); return jsonArray; } //測試 public static void main(String[] args) { ToJson dao = new ToJson(); JSONArray array = new JSONArray(); List<FakeForms> fours = dao.getJsonTest(); for (int i = 0; i < fours.size(); i++) { FakeForms four = fours.get(i); //json化 JSONObject jsonObject = JSONObject.fromObject(four); array.add(jsonObject); System.out.println(four.getBPN2()); System.out.println(array.toString()); } //下面是將查詢出的結果進行json格式化 //下面是對User的數據json化 System.out.println(dao.getUserJson()); System.out.println(dao.getAUserJson("cisco")); } }
映射表:
package gc.table; /** 登錄系統的賬戶表 **/ public class User { private String id; private String uname; private String pwd; private String nickname;//昵稱 /** * @return the id */ public String getId() { return id; } /** * @param id the id to set */ public void setId(String id) { this.id = id; } /** * @return the uname */ public String getUname() { return uname; } /** * @param uname the uname to set */ public void setUname(String uname) { this.uname = uname; } /** * @return the pwd */ public String getPwd() { return pwd; } /** * @param pwd the pwd to set */ public void setPwd(String pwd) { this.pwd = pwd; } /** * @return the nickname */ public String getNickname() { return nickname; } /** * @param nickname the nickname to set */ public void setNickname(String nickname) { this.nickname = nickname; } }
本篇文章主要用於記錄json數據轉化,注釋中提到的功能多沒實現,這里主要是記錄JSON數據轉化及前后交互,實現的過程。
基本思路:
前台發送json數據給servlet,同時請求servlet給予json數據。不考慮后台處理流程,就是這樣的交互,雙向交互的過程。那么具體細節呢?
首先html發送json數據請求,並請求json數據,此時servlet接收數據后,交由dao類/ToJson類進行處理,根據需要選擇。而ToJson則會調用Dao類,實現代碼重用,同時快速轉化數據為json。即普通的數據請求,如增刪改,使用dao即可,牽涉到json則交由Tojson處理。當數據到了dao這里,dao又去調用數據庫連接對象進行操作。
按數據流向,我給他按【個人理解的數據分層】:
html/js ajax請求層
servlet 數據接收層/發送
dao/ToJson/table映射類 數據處理/轉化層
ConnectionDB 數據持久層