本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