純html的Ajax:
使用了SpringMVC框架的純html的Ajax:
增刪改查
使用Ajax的目的就是不想使用jsp的任何東西。至於是不是增刪改查四個全用Ajax,實際上並不重要。純html使用Ajax最重要的地方就在於全查,得到所有資料後會在Ajax的回撥函式中使用JQuery中的each來遍歷,這樣就可以替代在jsp頁面中可以使用標籤遍歷的優勢了。
這是一個html頁面。不是jsp頁面。
在這裡插入程式碼片 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="/My_SpringMVC-181122/js/jquery-3.2.1.min.js"></script> <title>SpringMVC框架中的純html的Ajax增刪改查</title> </head> <body> <section> <form action="/My_SpringMVC-181122/createAllUser" method="post" id="form1"> <input type="text" name="username"/>姓名 <input type="text" name="userage"/> 年齡 <input type="radio" name="usergender" value="男" checked="checked"/>男 <input type="radio" name="usergender" value="女"/>女 <button type="button" id="btn2">新增</button> <button form="form2" type="submit" id="btn3">批量刪除</button> </form> </section> <section> <form id="form2" method="post" action="/My_SpringMVC-181122/deleteUsers"> <input type="hidden" id="hid01" name="user_id"/> <table border="1"> <thead> <tr> <th><input type="checkbox" /></th><th>姓名</th><th>年齡</th><th>性別</th><th>操作</th> </tr> </thead> <tbody id="tbodyId"> </tbody> </table> </form> </section> </body> <script> function update01(oA , user_id){ //直接在當前頁面上 進行修改 $("#hid01").val(user_id); var oTd2 = $(oA).parent().parent().children().eq(1); var oTd3 = $(oA).parent().parent().children().eq(2); var oTd4 = $(oA).parent().parent().children().eq(3); var oTd5 = $(oA).parent().parent().children().eq(4); oTd2.html("<input type='text' name='username' class='ipt1' value='"+oTd2.text()+"'/>"); oTd3.html("<input type='text' name='userage' class='ipt1' value='"+oTd3.text()+"'/>"); if(oTd4.text() == "男") oTd4.html("<input type='radio' name='usergender' value='男' checked='checked'/>男 <input type='radio' name='usergender' value='女'/>女"); else oTd4.html("<input type='radio' name='usergender' value='男'/>男 <input type='radio' name='usergender' value='女' checked='checked'/>女"); oTd5.html("<a href='javascript:;' onclick='update02();'>確定</a>"); } function update02(){ //配合上面的修改方法一起用的 var oForm = $("#form2"); oForm.attr("action","/My_SpringMVC-181122/updateUser"); oForm.submit(); } </script> <script> $(function(){//JQuery形式 的頁面載入函式 $.ajax({//當這個頁面一載入就會執行這個全查的Ajax url:"/My_SpringMVC-181122/retrieveAllUser", type:"post", success:function(returnValue){//我使用了springMVC框架所支援的json的方式,非常方便 console.log(returnValue);//在瀏覽器的控制檯上輸出。可按下F12檢視 $.each(returnValue,function(i,v){ var oTbody=$("#tbodyId"); var oTd0=$("<td><input type='checkbox' name='ids' id='selected-all' value='"+v.user_id+"'></td>"); var oTd1=$("<td>"+v.username+"</td>"); var oTd2=$("<td>"+v.userage+"</td>"); var oTd3=$("<td>"+v.usergender+"</td>"); var oTd4=$('<td><a href="javascript:;" onclick="update01(this,'+(v.user_id)+')" >編輯</a></td>'); var oTr2=$("<tr></tr>"); oTd0.appendTo(oTr2); //把各列新增到一行中 oTd1.appendTo(oTr2); oTd2.appendTo(oTr2); oTd3.appendTo(oTr2); oTd4.appendTo(oTr2); oTr2.appendTo(oTbody); }); } }); $("#btn2").click(function(){ //為新增按鈕掛上事件 $("#form1").submit(); }); }); </script> </html>
下面的是實體類 package com.oracle.pojo; import java.io.Serializable; @SuppressWarnings("serial") public class UserPojo implements Serializable { private Integer user_id; private String username; private Integer userage; private String usergender; public Integer getUser_id() { return user_id; } public void setUser_id(Integer user_id) { this.user_id = user_id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getUserage() { return userage; } public void setUserage(Integer userage) { this.userage = userage; } public String getUsergender() { return usergender; } public void setUsergender(String usergender) { this.usergender = usergender; } public UserPojo() { super(); // TODO Auto-generated constructor stub } public UserPojo(Integer user_id, String username, Integer userage, String usergender) { super(); this.user_id = user_id; this.username = username; this.userage = userage; this.usergender = usergender; } @Override public String toString() { return "UserPojo [user_id=" + user_id + ", username=" + username + ", userage=" + userage + ", usergender=" + usergender + "]"; } }
使用SpringMVC的框架所需要配置的配置檔案:(放在資原始檔夾下)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 包掃描:讓com.oracle.controller和其子包中的所有被--> <!-- @Controller、@Service、@Repository和@Component註解標註的類都被spring管理起來--> <!-- 即我們只需要在類上做標記,而不需要為這些類再配置<bean>了--> <context:component-scan base-package="com.oracle.controller" /> <context:component-scan base-package="com.oracle.service.impl" /> <context:component-scan base-package="com.oracle.dao.impl" /> <!-- 設定註解驅動 --> <mvc:annotation-driven /> <!-- 檢視解析器負責把handler方法返回值解析為實際的物理檢視--> <!-- 檢視解析器使用SpringMVC框架預設的InternalResourceViewResolver--> <!-- 這個檢視解析器支援JSP檢視解析 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置 邏輯檢視路徑 的字首和字尾,當然也可以不配置 --> <!--<property name="prefix" value="/WEB-INF/jsp/" />--> <!--<property name="suffix" value=".jsp" />--> </bean> </beans>
dao層程式碼如下:
package com.oracle.dao.impl;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.joe.jdbc.JDBC;
import com.joe.jdbc.JDBCFactory;
import com.oracle.dao.CRUDDao;
@Repository
public class CRUDDaoImpl implements CRUDDao {
private JDBC jdbc=JDBCFactory.getJDBC();//這個JDBC類是我自己封裝的jar包中的
@Override
public List<Map<String, Object>> retrieveAllUser() {
String sql = "select user_id,username,userage,usergender "
+ "from t_user";
return jdbc.retrieveAll(sql);
}
@Override
public void createAllUser(String username, Integer userage, String usergender) {
String sql = "insert into t_user (username,userage,usergender) values (?,?,?)";
jdbc.doDML(sql,username,userage,usergender);
}
@Override
public void deleteUsers(String[] ids) {
String sql = "delete from t_user where user_id=?";
jdbc.doDelete(sql,ids);
}
@Override
public void updateUser(String username, Integer userage, String usergender,
Integer user_id) {
String sql ="update t_user set username=? , userage=?,usergender=? where user_id=?";
jdbc.doDML(sql, username,userage,usergender,user_id);
}
}
Service層程式碼如下:
package com.oracle.service.impl;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.oracle.dao.CRUDDao;
import com.oracle.dao.impl.CRUDDaoImpl;
import com.oracle.pojo.UserPojo;
import com.oracle.service.CRUDService;
@Service
public class CRUDServiceImpl implements CRUDService {
@Autowired
private CRUDDao dao;//=new CRUDDaoImpl();
@Override
public List<Map<String, Object>> retrieveAllUser() {
return dao.retrieveAllUser();
}
@Override
public void createAllUser(UserPojo user) {
String username = user.getUsername();
String usergender = user.getUsergender();
Integer userage = user.getUserage();System.out.println("-------"+userage);
dao.createAllUser(username, userage, usergender);
}
@Override
public void deleteUsers(String[] ids) {
dao.deleteUsers(ids);
}
@Override
public void updateUser(UserPojo user) {
Integer user_id = user.getUser_id();
String username = user.getUsername();
Integer userage = user.getUserage();
String usergender = user.getUsergender();
dao.updateUser(username,userage,usergender,user_id);
}
}
控制層程式碼如下:(實際上也就是Servlet層。不過因為使用了SpringMVC框架,所以就叫控制層)
package com.oracle.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.oracle.pojo.FenyePojo;
import com.oracle.pojo.UserPojo;
import com.oracle.service.CRUDService;
@Controller
public class CRUDController {
@Autowired
private CRUDService cRUDService;
private FenyePojo fenye;
@ResponseBody
@RequestMapping(value="/retrieveAllUser")
public List<Map<String,Object>> retrieve(Integer [] q) {
if(fenye==null){
fenye=new FenyePojo();
}
List<Map<String,Object>> userList=cRUDService.retrieveAllUser();
return userList;
}
@RequestMapping(value="/createAllUser")
public String create(UserPojo user) {
cRUDService.createAllUser(user);
return "/html/Ajax.html";
}
@RequestMapping(value="/updateUser")
public String updateUser(UserPojo user) {
cRUDService.updateUser(user);
return "/html/Ajax.html";
}
@RequestMapping(value="/deleteUsers")
public String delete(String [] ids) {
cRUDService.deleteUsers(ids);
return "/html/Ajax.html";
}
}
到此為止,就只差一個我自己封裝的JDBC的jar包了。但是這裡不能夠導進來,所以我就直接把該jar包中的四個類以及一個配置檔案寫在這裡:
這是DataSource.java源程式檔案:如下
package com.oracle.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
//這個DataSource類只負責獲取連線和關閉連線。
public class DataSource {
//連線池:在類載入的時候就提前建立好10個連線,如果需要就從池中拿一個,關閉的時候,再還回來。(相當於從來一個單進一次貨 變為 進一堆貨)
private static List<Connection > pool=new ArrayList<>();
private static String driver=null;
private static String url=null;
private static String username=null;
private static String password=null;
private static int size=0;
// 靜態塊:只執行一次: static{}:靜態塊中只能訪問靜態屬性和靜態方法
static{
// 需要在Java程式碼中繫結資原始檔.properties檔案。(注意:下面的括號裡不需要加.properties檔案字尾名,因為一旦呼叫這個繫結方法,就必定是.properties檔案)
ResourceBundle bundle=PropertyResourceBundle.getBundle("DataSource"); //而且這個路徑中也不需要寫res這個路徑.(因為res和src一樣都是資原始檔夾)
// 從資原始檔中獲取,取key
driver=bundle.getString("driver");
url=bundle.getString("url");
username=bundle.getString("username");
password=bundle.getString("password");
size=Integer.parseInt(bundle.getString("size"));
try{
Class.forName(driver);
for(int i=0;i<size;i++){
Connection con =DriverManager.getConnection(url,username,password);
pool.add(con);
}
}
catch(ClassNotFoundException e){ e.printStackTrace(); }
catch (SQLException e) {e.printStackTrace();}
}
public synchronized Connection getConnection(){
Connection con=null;
try{//從池中拿一個返回去
if(pool.isEmpty()){
con =DriverManager.getConnection(url,username,password);
}else{
//從池中移出一個,並返回給你
//get從池中拿出給你看一眼
con=pool.remove(0);
}
}
catch(SQLException e){e.printStackTrace(); }
return con;
}
public void closed(ResultSet resultset, Statement pstm,
Connection con) {
try{
if(resultset!=null) resultset.close();
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(pstm!=null) pstm.close();
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(con!=null){
if(pool.size()<size){ //判斷池有沒有滿
pool.add(con);
}else{
con.close();
}
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
public void closed(Statement stmt, Connection con) { //讓使用者體驗更好
closed(null,stmt,con);
}
}
這是DataSourceFactory.java源程式檔案:如下
package com.oracle.jdbc;
public class DataSourceFactory {
public static DataSource getDataSource(){
return new DataSource();
}
}
這是JDBC.java源程式檔案:如下
package com.oracle.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//JDBC這個類負責增刪改查
public class JDBC {
/**全查詢*/
public List<Map<String, Object>> retrieveAll(String sql, Object... params) {
//得到DataSource
//得到connection
//使用connection造船
//得到船Statement(PreparedStatement是其子介面)
//將sql與船繫結
//發船到資料庫,船回來了 帶了一個ResultSet回來
DataSource source=DataSourceFactory.getDataSource();
Connection con=source.getConnection();
List<Map<String,Object>> list=null;
PreparedStatement pstm=null;
ResultSet resultset=null;
try {
pstm=con.prepareStatement(sql);
for(int i=0;i<params.length;i++){
// setObject(p1,p2);
// p1:往哪個位置上放(個數)
// p2:放的是什麼
pstm.setObject(i+1, params[i]);
}
resultset=pstm.executeQuery();
// 一行一行的迴圈
// 元資料(列名,列數,約束.相當於標題):從ResultSet中直接取不出來
// ResultSetMetaData 是結果集中的元資料
ResultSetMetaData metadata=resultset.getMetaData();
list=new ArrayList<Map<String,Object>>();
while(resultset.next()){
Map<String ,Object > map=new HashMap<>();
//遍歷每一列
for(int i=1,j=metadata.getColumnCount();i<=j;i++){ //資料庫中的都是從1開始的
String key=metadata.getColumnName(i);
String value=resultset.getString(i);
map.put(key,value);
}
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
//關閉資源
//後開的先關 resultSet --> statement --> connection
source.closed(resultset,pstm,con);
}
return list;
}
/**單查詢*/
public Map<String,Object> retrieveOne(String sql,Object ...params){
List<Map<String,Object>> list=retrieveAll(sql,params);
Map<String,Object> map=null;
if(list.size()!=0){
map=list.get(0);
}
return map;
}
/**
* DQL 資料查詢語言 select
* DML 資料操作語言 增刪改 update set/ delete from/ insert into
* DCL 資料控制語言 grant revoke
* DDL 資料定義語言 alter
* */
public int doDML(String sql,Object... params){ //增刪改
DataSource source=DataSourceFactory.getDataSource();
Connection con=source.getConnection();
List<Map<String,Object>> list=null;
PreparedStatement pstm=null;
int result=-1;
try {
pstm=con.prepareStatement(sql);
for(int i=0;i<params.length;i++){
pstm.setObject(i+1, params[i]);
}
result=pstm.executeUpdate(); //若操作成功,返回受影響行數
}catch(SQLException e){
e.printStackTrace();
}finally{
source.closed(pstm, con);
}
return result;
}
/**
* 事務保護
* 對於查詢來說不需要保護,對於批量DML操作來說需要進行事物保護
* 要麼都成功,要麼都失敗- 保證資料庫操作的原子性
* 我們的操作是:暫時關閉它的自動提交功能。(如果是隻有一條sql語句的話,一寫完他就會自動提交的)
* update t_user userage = 0 where username = '謝大腳'
* update t_user userage = 18 where username = '趙四'
* commit();// 手動提交它
* 在catch中 rollback();// 手動回滾它
* finally中,把人家的自動提交功能再恢復
* 事物操作:提交、回滾
* */
/**
* 此方法用於不同型別的sql語句進行批量操作
* */
public int[] doBatch(List<String> sqls){
DataSource source=new DataSource();
Connection con=source.getConnection();
// PreparedStatement 處理問號的專用船
// Statement 不能處理問號
Statement stmt=null;
int [] result=null;
try {
con.setAutoCommit(false); //暫時先關閉自動提交功能
stmt = con.createStatement();
//將船與各條sql語句繫結
for(String sql: sqls){
stmt.addBatch(sql);
}
//發動船駛向資料庫
result=stmt.executeBatch(); //因為有多條語句,所以每一條都有一個返回值。就構成陣列
con.commit(); //手動提交
} catch (SQLException e) {
e.printStackTrace();
try {//如果出現異常可以進行回滾
con.rollback();
} catch (SQLException e1) {//回滾也可能出現異常,比如斷電
e1.printStackTrace();
}
}finally{
//關閉資源
try {
con.setAutoCommit(true); //把人家的自動提交功能再恢復
} catch (SQLException e) {
e.printStackTrace();
}
source.closed(stmt, con);
}
return result;
}
/**
* 此方法用於相同型別的sql語句進行批量操作.(比如都是delete的sql語句)
* paramList:用來存所有的 引數。每條sql語句的要用到的引數都是分別用一個Object陣列儲存的。把每個陣列都存在集合中
* */
public int[] doBatch(String sql,List<Object[]> paramList){
DataSource source=DataSourceFactory.getDataSource();
Connection con=source.getConnection();
int []result=null;
PreparedStatement pstm=null;
try {
con.setAutoCommit(false);
//造船
pstm=con.prepareStatement(sql);
//將船與各條sql語句繫結
for(Object[] params:paramList){
for(int i=0,j=params.length;i<j;i++){ //為每一條sql語句都配置上其應用的引數
pstm.setObject(i+1, params[i]);
}
pstm.addBatch(); //讓船與每一條sql語句都繫結
}
result=pstm.executeBatch();
con.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
con.rollback();
} catch (SQLException e1) { e1.printStackTrace(); }
} finally{
//關閉資源
source.closed(pstm, con);
try {
con.setAutoCommit(true); //把人家的自動提交功能再恢復
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
/**相同型別的sql語句 進行批量刪除操作。並設定了事務保護*/
public int[] deleteBatch(String sql,String[] params){ //此方法只適用於一條sql語句中只有一個引數的操作
List<Object[]> list=new ArrayList<>();
for(String param:params){
Object [] object={param};
list.add(object);
}
return doBatch(sql,list);
}
}
這是JDBCFactory.java源程式檔案:如下
package com.oracle.jdbc;
public class JDBCFactory {
public static JDBC getJDBC(){
return new JDBC();
}
}
這個jdbc的jar包中除了這四個類之外,還有一個DataSource.properties配置檔案,用來配置四大引數:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/你的資料庫名稱?characterEncoding=utf8
username=你的mysql登入賬號
password=你的密碼
size=10
有了這五樣東西后,你可以將它們封裝成jdbc的jar包,再將jar包匯入上面的我寫的那個使用了SpringMVC的專案中。注意:當你將它們封裝成jar包後,那個DataSource.properties配置檔案實際上就不能夠使用了。因為每個封裝成jar包的檔案都變成了只讀的。所以你需要在你匯入這個jar包的專案中重新寫一個一模一樣的DataSource.properties配置檔案。檔案內容可到jar包中的DataSource.properties配置檔案中複製出來。並將其中的資料庫名稱還有mysql登入的賬號及密碼改成你自己的。
因為我建立的是一個Maven專案。(建立該專案的好處在於,你想要什麼jar包,不需要自己去下,只需在該專案的某個地方進行搜尋就行。當然了,前提是你要配置好Maven的各種環境,比如說搭好本地倉庫啊等等)。我匯入的包有這些: