本Demo相關知識點:
1、后台使用SSM框架完成前台響應
2、前台展現使用BootStrap,主要使用其table和和模態框Model
3、使用Ajax完成增刪改查功能
4.JS動態構建表格
Demo 完成后界面如下:

下面開始正式構建Demo
一、用戶登錄
前端JSP頁面主要代碼
<div class="container">
<div class="row">
<div class="col-sm-3">
<form action="login" method="post">
<div class="form-group">
<label>用戶名</label>
<input type="text" class="form-control" name="username" placeholder="username">
</div>
<div class="form-group">
<label>密碼</label>
<input type="password" class="form-control" name="password" placeholder="Password">
</div>
<div class="checkbox">
<label>
<input type="checkbox"> 記住密碼
</label>
</div>
<button type="submit" class="btn btn-default">登錄</button>
<div>${msg}</div>
</form>
</div>
</div>
</div>
后台Controller
@Resource private UserService userService; //用戶登錄驗證 @RequestMapping(value = "/login", method = RequestMethod.POST) public String login(HttpServletRequest request, Model model){ String username = request.getParameter("username"); String password = request.getParameter("password"); Boolean result = checkUserLogin(username,password); if(result){ return "userList"; }else{ model.addAttribute("msg", "用戶名或密碼不正確,請重新登錄"); return "forward:/login.jsp"; } } public boolean checkUserLogin(String username,String password){ User user = userService.getUserByName(username); if (user == null || "".equals(user)){ return false; } if (user.getUserPwd().equals(password)){ return true; }else { return false; } }
當登錄成功時,則跳轉到view下的userList.jsp主頁面,登錄失敗時則提示

登錄時,只是進行了簡單的賬號密碼驗證,沒有進行復雜的驗證,還有記住密碼功能尚未完成
二、在登錄成功后開始構建主界面
在前期完成主界面時,主要是使用Bootstrap表格,主要是html,此處由於篇幅原因,不細說,Demo最后會給出listuser.jsp完整代碼
三、完成界面上查詢按鈕的功能

此處根據ID查詢用戶,並展示在下面的表體里,此處首先需要完成三件事,一、編寫查詢的JS方法。二、編寫查詢的Controller方法。三、根據返回的對象動態構建表體以展示出來
3.1 編寫根據用戶ID查詢的JS方法
// 查詢單個用戶 $("#userQueryBtn").click(function () { var id = $("#userID").val(); doQuery(id); }) // 查詢單個用戶調用的方法 function doQuery(id) { $.ajax({ type:"POST", url:"queryUser/"+id, dataType:"json", success:function (data) { if (data.user == null){ //當查詢的用戶不存在時,清空表格上面上次查詢的結果 $("#user_table_tbody").empty(); alert(data.queryinfo); } else { //清空表格 $("#user_table_tbody").empty();
//動態構建表體 show_user_table(data.user); console.log(data.user); } } }); }
3.2 編寫查詢的Controller方法
因為需要根據其返回結果構建表體,所以Controller方法需要返回集合或對象
//用戶查詢,(之前沒有添加@ResponseBody,導致其老是返回queryUser.jsp,從而找不到頁面而報錯) //根據用戶ID查找 @ResponseBody @RequestMapping(value = "/queryUser/{id}") public Map queryUser(@PathVariable String id){ System.out.println("進入query方法"); System.out.println(id); Map<String, Object> map = new HashMap<>(); if (id == null || "".equals(id)){ map.put("queryinfo","請輸入用戶ID"); }else{ User user = userService.getUserById(Integer.valueOf(id)); if (user != null){ map.put("user",user); }else { map.put("queryinfo","該用戶不存在"); } } return map; }
3.3 根據返回的對象動態構建表體
此處editBtn.attr("user-edit-id",result.id); 和 delBtn.attr("user-del-id",result.id); 為編輯和刪除按鈕添加自定義屬性,以便后面對其單個編輯和刪除操作
//在table里呈現單條查詢的結果 function show_user_table(result) { var useridTD = $("<td></td>").append(result.id); var usernameTD = $("<td></td>").append(result.userName); var userphoneTD = $("<td></td>").append(result.userPhone); var userpwdTD = $("<td></td>").append(result.userPwd); var editBtn = $("<button></button>").addClass("btn btn-primary btn-sm user-edit-btn").append("編輯"); editBtn.attr("user-edit-id",result.id); var delBtn = $("<button></button>").addClass("btn btn-danger btn-sm user-del-btn").append("刪除"); delBtn.attr("user-del-id",result.id); var operate = $("<td></td>").append(editBtn).append(" ").append(delBtn); $("<tr></tr>").append(useridTD) .append(usernameTD) .append(userphoneTD) .append(userpwdTD) .append(operate) .appendTo("#user_table_tbody"); }
四、完成顯示所有用戶按鈕功能
顯示所有用戶和單個用戶思路大概相同
4.1 編寫查詢所有用戶Controller方法
//查詢所有用戶 @ResponseBody @RequestMapping(value = "/queryAll",method = RequestMethod.POST) public List<User> queryAllUser(){ System.out.println("進入queryAll方法"); List<User> userList = userService.getAllUser(); return userList; }
4.2 編寫查詢所有用戶的JS方法
//查詢並顯示所有用戶 $("#allUserQueryBtn").click(function () { //首先清空表格殘留數據 $("#user_table_tbody").empty(); queryAllUsers(); }) //查詢所有用戶 function queryAllUsers() { $.ajax({ type:"POST", url:"queryAll", dataType:"json", success:function (data) { console.log(data); //遍歷data循環構建表體 $.each(data,function (index,item) { show_user_table(item); }) } }) }
此處重點是使用
$.each(data,function (index,item) { show_user_table(item); })
遍歷循環動態構建表體
五、完成新增用戶功能
5.1 此處使用Bootstrap模態框功能
<%--新增用戶的模態框--%>
<div class="modal" id="userAddModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document" style="width: 35%">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h5 class="modal-title" id="myModalLabel">新增</h5>
</div>
<div class="modal-body">
<form class="form-horizontal" id="userAddModalForm" method="post">
<div class="form-group">
<label class="col-sm-2 control-label">userName</label>
<div class="col-sm-8">
<input type="text" class="form-control" name="userName" placeholder="userName"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">userPhone</label>
<div class="col-sm-8">
<input type="text" class="form-control" name="userPhone" placeholder="userPhone"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">userPwd</label>
<div class="col-sm-8">
<input type="password" class="form-control" name="userPwd" placeholder="userPwd"/>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary btn-sm" id="userAddModalSaveBtn">保存</button>
</div>
</div>
</div>
</div>
5.2 新增用戶JS代碼:
//點擊新增彈出模態框 $("#userAddBtn").click(function () { $("#userAddModal").modal('show'); }) //為保存按鈕綁定click $("#userAddModalSaveBtn").click(function () { var formData = $("#userAddModalForm").serialize(); doAdd(formData); }) function doAdd(formData) { $.ajax({ type:"POST", url:"insertUser", data: formData, success:function (result) { //關閉模態框 $("#userAddModal").modal("hide"); alert(result.addinfo); } }); }
通過$("#userAddModalForm").serialize()將表單序列化后傳到后台,其形式為查詢字符串形式
5.3 新增用戶后台Controller
//新增用戶 @ResponseBody @RequestMapping(value = "/insertUser") public Map checkJosn(User user){ System.out.println(user); Boolean result = userService.insertUser(user); Map<String, Object> map = new HashMap<>(); if (result){ map.put("addinfo","添加成功"); return map; }else { map.put("addinfo","添加失敗"); return map; } }
5.4 新增用戶界面

六、完成對單個用戶的刪除功能
6.1 根據id刪除單個用戶前台JS
//刪除單個用戶 function doDelete(id) { $.ajax({ type:"DELETE", url:"delUser/"+id, success:function (data) { console.log(data); } }) } //為刪除按鈕綁定事件 $(document).on("click",".user-del-btn",function () { if (confirm("確定刪除該用戶")) { var id = $(this).attr("user-del-id"); console.log(id); doDelete(id); //下面兩行是刪除用戶后刷新表體數據 $("#user_table_tbody").empty(); queryAllUsers(); } })
由於JS在綁定click事件時,刪除按鈕還沒有創建,所有不能用 $(".user-del-btn").click(function () {})方法,只能用on()方法,對應動態創建的按鈕需要綁定事件的,一般用on()方法。
var id = $(this).attr("user-del-id"); 是取出當前用戶的自定義屬性user-del-id作為其ID,因為前面在展現用戶時,使用了delBtn.attr("user-del-id",result.id); 為該刪除按鈕綁定里自定義屬性
6.2 后台單個用戶刪除的Controller方法
//根據ID刪除用戶 @ResponseBody @RequestMapping(value = "/delUser/{id}",method = RequestMethod.DELETE) public boolean delUserById(@PathVariable String id){ return userService.delUserByID(id); }
后台使用Restful風格接受用戶id與DELETE方法
七、完成主界面上“編輯”按鈕修改用戶功能
在點擊編輯時,使用了Bootstrap的模態框,首先需要將當前用戶查詢出來賦值給模態框,然后再執行修改
7.1 前台JS
//為編輯用戶按鈕綁定事件 $(document).on("click",".user-edit-btn",function () { var id = $(this).attr("user-edit-id"); console.log(id); doQueryByID(id); //顯示修改模態框 $("#userModifyModal").modal('show'); }) //為修改的確定按鈕綁定事件,由於作用與此處的修改按鈕是動態創建的,所以不能使用這方法 /* $("#userModifyModalSaveBtn").click(function () { var formData = $("#userModifyModalForm").serialize(); doUpdate(formData); })*/ $(document).on("click","#userModifyModalSaveBtn",function () { var formData = $("#userModifyModalForm").serialize(); doUpdate(formData); }) //根據ID查詢到user並賦值給模態框 function doQueryByID(id) { $.ajax({ type:"POST", url:"queryUser/"+id, dataType:"json", success:function (data) { if (data.user != null){ //賦值 $("#userModifyModal_id").val(data.user.id); $("#userModifyModal_userName").val(data.user.userName); $("#userModifyModal_userPhone").val(data.user.userPhone); $("#userModifyModal_userPwd").val(data.user.userPwd); } } }); } //修改用戶 function doUpdate(formData) { $.ajax({ type:"POST", url:"updateUser", data: formData, success:function (result) { //關閉模態框 $("#userModifyModal").modal("hide"); if (result){ //下面兩行是刪除用戶后刷新表體數據 $("#user_table_tbody").empty(); queryAllUsers(); }else { alert("修改失敗"); } } }); }
7.2 后台更新用戶方法
//更新用戶 @ResponseBody @RequestMapping(value = "/updateUser") public boolean updateUser(User user){ System.out.println(user); Boolean result = userService.updateUser(user); return result; }
此處如果將doUpdate()方法里的ajax請求方法改為PUT,后台同樣添加了method = RequestMethod.PUT,此處雖然配置了hiddenHttpMethodFilter,但是調試的時候發現前台發送的值正常,后台user一直是null,只有將ajax請求方法改為POST,后台不加method才正常。此處如果想使用Restful風格的PUT時使用,需要注意以下幾個方面:
/**發送PUT和DELECT請求時需要執行
* 1、在Web.xml里配置HiddenHttpMethodFilter
* 2、需要發送POST請求
* 3、需要在發送POST請求時攜帶一個name="_method"的隱藏域,值為DELECT或PUT
* **/
表單格式比如:
<form action="checkRestfulPut/3333" method="post">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit" name="test" value="PUT方法">測試Restful的PUT即更新操作</input>
</form>
7.3 更新用戶界面

將ID設置為readyonly,防止用戶修改而報錯
<input type="text" class="form-control" id="userModifyModal_id" name="id" readonly/>
至此,該Demo的用戶登錄和增刪改查的基本功能都實現了,在描述時,可能只顧着堆代碼了,文字描述很欠缺,見諒。另外頁面上根據用戶名查詢和批量刪除按鈕功能尚未實現。最后附上主界面listuser.jsp完整代碼
listuser.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3個meta標簽*必須*放在最前面,任何其他內容都*必須*跟隨其后! -->
<title>userList</title>
<!-- Bootstrap -->
<link href="${pageContext.request.contextPath}/statics/css/bootstrap.css" rel="stylesheet">
<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依賴 jQuery,所以必須放在前邊) -->
<script type="text/javascript" src="${pageContext.servletContext.contextPath}/statics/js/jquery-3.3.1.js"></script>
<!-- 加載 Bootstrap 的所有 JavaScript 插件。你也可以根據需要只加載單個插件。 -->
<script src="${pageContext.servletContext.contextPath}/statics/js/bootstrap.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function () {
bindEvent();
//跳轉到該頁面時就發送ajax請求顯示所有用戶
queryAllUsers();
// bindBtnDel();
});
function bindEvent() {
//點擊新增彈出模態框
$("#userAddBtn").click(function () {
$("#userAddModal").modal('show');
})
//為保存按鈕綁定click
$("#userAddModalSaveBtn").click(function () {
var formData = $("#userAddModalForm").serialize();
doAdd(formData);
})
// 查詢單個用戶
$("#userQueryBtn").click(function () {
var id = $("#userID").val();
doQuery(id);
})
//查詢並顯示所有用戶
$("#allUserQueryBtn").click(function () {
//首先清空表格殘留數據
$("#user_table_tbody").empty();
queryAllUsers();
})
}
function doAdd(formData) {
$.ajax({
type:"POST",
url:"insertUser",
data: formData,
success:function (result) {
//關閉模態框
$("#userAddModal").modal("hide");
alert(result.addinfo);
}
});
}
// 查詢單個用戶調用的方法
function doQuery(id) {
$.ajax({
type:"POST",
url:"queryUser/"+id,
dataType:"json",
success:function (data) {
if (data.user == null){
//當查詢的用戶不存在時,清空表格上面上次查詢的結果
$("#user_table_tbody").empty();
alert(data.queryinfo);
}
else {
//清空表格
$("#user_table_tbody").empty();
show_user_table(data.user);
console.log(data.user);
}
}
});
}
//查詢所有用戶
function queryAllUsers() {
$.ajax({
type:"POST",
url:"queryAll",
dataType:"json",
success:function (data) {
console.log(data);
//遍歷data循環構建表體
$.each(data,function (index,item) {
show_user_table(item);
})
}
})
}
//在table里呈現單條查詢的結果
function show_user_table(result) {
var useridTD = $("<td></td>").append(result.id);
var usernameTD = $("<td></td>").append(result.userName);
var userphoneTD = $("<td></td>").append(result.userPhone);
var userpwdTD = $("<td></td>").append(result.userPwd);
var editBtn = $("<button></button>").addClass("btn btn-primary btn-sm user-edit-btn").append("編輯");
editBtn.attr("user-edit-id",result.id);
var delBtn = $("<button></button>").addClass("btn btn-danger btn-sm user-del-btn").append("刪除");
delBtn.attr("user-del-id",result.id);
var operate = $("<td></td>").append(editBtn).append(" ").append(delBtn);
$("<tr></tr>").append(useridTD)
.append(usernameTD)
.append(userphoneTD)
.append(userpwdTD)
.append(operate)
.appendTo("#user_table_tbody");
}
//刪除單個用戶
function doDelete(id) {
$.ajax({
type:"DELETE",
url:"delUser/"+id,
success:function (data) {
console.log(data);
}
})
}
//為刪除按鈕綁定事件
$(document).on("click",".user-del-btn",function () {
if (confirm("確定刪除該用戶")) {
var id = $(this).attr("user-del-id");
console.log(id);
doDelete(id);
//下面兩行是刪除用戶后刷新表體數據
$("#user_table_tbody").empty();
queryAllUsers();
}
})
//為編輯用戶按鈕綁定事件
$(document).on("click",".user-edit-btn",function () {
var id = $(this).attr("user-edit-id");
console.log(id);
doQueryByID(id);
//顯示修改模態框
$("#userModifyModal").modal('show');
})
//為修改的確定按鈕綁定事件,由於作用與此處的修改按鈕是動態創建的,所以不能使用這方法
/* $("#userModifyModalSaveBtn").click(function () {
var formData = $("#userModifyModalForm").serialize();
doUpdate(formData);
})*/
$(document).on("click","#userModifyModalSaveBtn",function () {
var formData = $("#userModifyModalForm").serialize();
doUpdate(formData);
})
//根據ID查詢到user並賦值給模態框
function doQueryByID(id) {
$.ajax({
type:"POST",
url:"queryUser/"+id,
dataType:"json",
success:function (data) {
if (data.user != null){
//賦值
$("#userModifyModal_id").val(data.user.id);
$("#userModifyModal_userName").val(data.user.userName);
$("#userModifyModal_userPhone").val(data.user.userPhone);
$("#userModifyModal_userPwd").val(data.user.userPwd);
}
}
});
}
//修改用戶
function doUpdate(formData) {
$.ajax({
type:"POST",
url:"updateUser",
data: formData,
success:function (result) {
//關閉模態框
$("#userModifyModal").modal("hide");
if (result){
//下面兩行是刪除用戶后刷新表體數據
$("#user_table_tbody").empty();
queryAllUsers();
}else {
alert("修改失敗");
}
}
});
}
</script>
<body>
<div class="container">
<div class="row">
<div class="col-sm-12">
<h2>UserManager</h2>
</div>
</div>
<div class="row">
<%--添加用戶查詢表單--%>
<div class="col-sm-offset-4">
<form id="userQuery" method="post">
<input type="text" id="userID" name="userID" placeholder="用戶ID"/>
<input name="userName" id="userName" placeholder="用戶名"/>
<BUTTON type="button" class="btn btn-primary btn-sm" id="userQueryBtn">查詢</BUTTON>
<BUTTON type="button" class="btn btn-primary btn-sm" id="allUserQueryBtn">顯示所有用戶</BUTTON>
</form>
</div>
<%--添加“增加”和“批量刪除”按鈕--%>
<div class="col-sm-4 col-sm-offset-11">
<BUTTON type="button" class="btn btn-primary btn-sm" data-toggle="modal" id="userAddBtn">增加</BUTTON>
<BUTTON type="button" class="btn btn-primary btn-sm" id="userDelBtn">批量刪除</BUTTON>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<table class="table table-hover" id="user_table">
<thead>
<tr>
<th width="20%">用戶ID</th>
<th width="20%">userName</th>
<th width="20%">userPhone</th>
<th width="20%">userPwd</th>
<th width="20%">操作</th>
</tr>
</thead>
<tbody id="user_table_tbody">
</tbody>
</table>
</div>
</div>
</div>
<%--新增用戶的模態框--%>
<div class="modal" id="userAddModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document" style="width: 35%">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h5 class="modal-title" id="myModalLabel">新增</h5>
</div>
<div class="modal-body">
<form class="form-horizontal" id="userAddModalForm" method="post">
<div class="form-group">
<label class="col-sm-2 control-label">userName</label>
<div class="col-sm-8">
<input type="text" class="form-control" name="userName" placeholder="userName"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">userPhone</label>
<div class="col-sm-8">
<input type="text" class="form-control" name="userPhone" placeholder="userPhone"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">userPwd</label>
<div class="col-sm-8">
<input type="password" class="form-control" name="userPwd" placeholder="userPwd"/>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary btn-sm" id="userAddModalSaveBtn">保存</button>
</div>
</div>
</div>
</div>
<%--修改用戶的模態框--%>
<div class="modal" id="userModifyModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document" style="width: 35%">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h5 class="modal-title">修改</h5>
</div>
<div class="modal-body">
<form class="form-horizontal" id="userModifyModalForm" method="post">
<div class="form-group">
<label class="col-sm-2 control-label">用戶ID</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="userModifyModal_id" name="id" readonly/>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">userName</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="userModifyModal_userName" name="userName"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">userPhone</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="userModifyModal_userPhone" name="userPhone"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">userPwd</label>
<div class="col-sm-8">
<input type="password" class="form-control" id="userModifyModal_userPwd" name="userPwd"/>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary btn-sm" id="userModifyModalSaveBtn">保存</button>
</div>
</div>
</div>
</div>
</body>
</html>
參考文獻 https://www.cnblogs.com/gode/p/8194260.html
