SMBMS项目
15.1 项目架构
15.2 数据库设计
- 共5张表
15.3 项目搭建
考虑:
是否使用Maven?依赖还是jar包
搭建一个maven web项目步骤如下:
-
使用maven模板创建一个maven项目;
-
补全项目结构,java, resources;
-
更新web.xml配置版本;
-
清理pom.xml;
-
配置Tomcat;
-
启动Tomcat测试项目是否能够成功跑起来,如下:
-
导入项目中使用的jar包;
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>10.0.4</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jsp-api</artifactId> <version>10.0.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
-
创建项目包结构,如com.ano;
-
编写实体类;
ORM映射:表-类映射
User.java
package com.ano.pojo; public class User { private Integer id; private String userCode; private String userName; private String userPassword; private Integer gender; private Date birthday; private String phone; private String address; private Integer userRole; private Integer createBy; private Date creationDate; private Integer modifyBy; private Date modifyTime; private Integer age; private String userRoleName; public Integer getAge() { Date date = new Date(); Integer age = date.getYear() - birthday.getYear(); return age; } //getters and setters... }
Bill.java
package com.ano.pojo; public class Bill { private Integer id; private String billCode; private String productName; private String productDesc; private String productUnit; private BigDecimal productCount; private BigDecimal totalPrice; private Integer isPayment; private Integer createdBy; private Date creationDate; private Integer modifyBy; private Date modifyDate; private Integer providerId; private String providerName; //getters and setters... }
Provider.java
package com.ano.pojo; public class Provider { private Integer id; private String proCode; private String proName; private String proDesc; private String proContact; private String proPhone; private String proAddress; private String proFax; private Integer createdBy; private Date creationDate; private Integer modifyBy; private Date modifyDate; //getters and setters... }
Role.java
package com.ano.pojo; public class Role { private Integer id; private String roleName; private String roleCode; private Integer createdBy; private Date creationDate; private Integer modifyBy; private Date modifyTime; //getters and setters... }
-
编写基础公共类;
- 数据库配置文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/smbms?useSSL=true&useUnicode=true&characterEncoding=utf-8 username=root password=123456
- 编写数据库的公共类
/** * 操作数据库的公共类 */ public class BaseDao { private static String driver; private static String url; private static String username; private static String password; //静态代码块,类加载时就初始化了 static { Properties properties = new Properties(); //通过类加载器读取对应的资源 InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties"); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); } /** * 获取数据库的连接 * @return */ public static Connection getConnection() { Connection connection = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); } return connection; } /** * 编写查询公共方法 * @param connection * @param sql * @param params * @param preparedStatement * @param resultSet * @return * @throws SQLException */ public static ResultSet execute(Connection connection, String sql, Object[] params, PreparedStatement preparedStatement, ResultSet resultSet) throws SQLException { //预编译的sql,在后面直接执行就可以 preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { //setObject占位符从1开始,但是数组从0开始 preparedStatement.setObject(i+1, params[i]); } resultSet = preparedStatement.executeQuery(); return resultSet; } /** * 编写增删改公共方法 * @param connection * @param sql * @param params * @param preparedStatement * @return * @throws SQLException */ public static int executeUpdate(Connection connection, String sql, Object[] params, PreparedStatement preparedStatement) throws SQLException { preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preparedStatement.setObject(i+1, params[i]); } int updateRows = preparedStatement.executeUpdate(); return updateRows; } /** * 释放资源 * @param connection * @param preparedStatement * @param resultSet * @return */ public static boolean closeResource(Connection connection, PreparedStatement preparedStatement,ResultSet resultSet) { boolean flag = true; if(resultSet != null) { try { resultSet.close(); //GC回收 resultSet = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } if(preparedStatement != null) { try { preparedStatement.close(); preparedStatement = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } if(connection != null) { try { connection.close(); connection = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } return flag; } }
- 编写字符编码过滤器
CharacterEncodingFilter.java
/** * 字符编码过滤器 */ public class CharacterEncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); filterChain.doFilter(request,response); } public void destroy() { } }
web.xml
<!--字符编码过滤器--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.ano.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
导入静态资源
15.4 登录注销功能实现
-
导入前端页面素材
login.jsp
注意表单请求地址:
<form class="loginForm" action="${pageContext.request.contextPath}/login.do" name="actionForm" id="actionForm" method="post" >
-
设置前端页面
login.jsp
为欢迎页web.xml
<welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list>
-
编写dao层得到登录用户的接口
UserDao.java
public interface UserDao { /** * 得到要登录的用户 * @param connection * @param userCode * @return */ public User getLoginUser(Connection connection, String userCode) throws SQLException; }
-
编写dao层UserDao接口的实现类
UserDaoImpl.java
public class UserDaoImp implements UserDao{ public User getLoginUser(Connection connection, String userCode) throws SQLException { PreparedStatement preparedStatement = null; ResultSet resultSet = null; User user = null; if(connection != null) { String sql = "SELECT * FROM smbms_user WHERE userCode = ?"; Object[] params = {userCode}; resultSet = BaseDao.execute(connection, preparedStatement, resultSet, sql, params); if(resultSet.next()) { user = new User(); user.setId(resultSet.getInt("id")); user.setUserCode(resultSet.getString("userCode")); user.setUserName(resultSet.getString("userName")); user.setUserPassword(resultSet.getString("userPassword")); user.setGender(resultSet.getInt("gender")); user.setBirthday(resultSet.getDate("birthday")); user.setPhone(resultSet.getString("phone")); user.setAddress(resultSet.getString("address")); user.setUserRole(resultSet.getInt("userRole")); user.setCreateBy(resultSet.getInt("createdBy")); user.setCreationDate(resultSet.getDate("creationDate")); user.setModifyBy(resultSet.getInt("modifyBy")); user.setModifyDate(resultSet.getDate("modifyDate")); } BaseDao.closeResource(null,preparedStatement,resultSet); } return user; } }
-
业务层接口
UserService.java
package com.ano.service.user; import com.ano.pojo.User; public interface UserService { /** * 用户登录 * @param userCode * @param password * @return */ public User login(String userCode, String password); }
-
业务层实现类
UserServiceImpl.java
public class UserServiceImpl implements UserService { //业务层都会调用dao层,所以要引入Dao层 private UserDao userDao; public UserServiceImpl() { userDao = new UserDaoImp(); } public User login(String userCode, String password) { Connection connection = null; User user = null; connection = BaseDao.getConnection(); try { //通过业务层调用对应的具体的数据库操作 user = userDao.getLoginUser(connection, userCode); } catch (SQLException e) { e.printStackTrace(); } finally { BaseDao.closeResource(connection,null,null); } return user; } }
-
编写servlet
LoginServlet.java
/** * Servlet作为控制层,调用业务层代码 */ public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("enter LoginServlet..."); //获取用户名和密码 String userCode = req.getParameter("userCode"); String userPassword = req.getParameter("userPassword"); //和数据库中的密码进行对比,调用业务层 UserServiceImpl userService = new UserServiceImpl(); User user = userService.login(userCode, userPassword); if(user != null && userPassword.equals(user.getUserPassword())) { //查有此人可以登录 //将用户的信息放进Session中 req.getSession().setAttribute(Constants.USER_SESSION,user); //跳转到主页 resp.sendRedirect("jsp/frame.jsp"); }else { //查无此人,无法登录 //转发回登录页面,并提示用户名或者密码错误 req.setAttribute("error","用户名或者密码错误"); req.getRequestDispatcher("login.jsp").forward(req,resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
注册servlet
web.xml
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.ano.servlet.user.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping>
-
注销功能
LogoutServlet.java
public class LogoutServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //移除用户的Session req.getSession().removeAttribute(Constants.USER_SESSION); //返回登录页面 resp.sendRedirect(req.getContextPath()+"/login.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
web.xml
<servlet> <servlet-name>LogoutServlet</servlet-name> <servlet-class>com.ano.servlet.user.LogoutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LogoutServlet</servlet-name> <url-pattern>/jsp/logout.do</url-pattern> </servlet-mapping>
-
注销后或者未登录的权限拦截过滤
编写登录拦截过滤器SysFilter.java
public class SysFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
User user = (User)req.getSession().getAttribute(Constants.USER_SESSION);
if(user == null) {
//用户已经注销或者未登录
resp.sendRedirect("/smbms/error.jsp");
}else {
chain.doFilter(request,response);
}
}
public void destroy() {
}
}
web.xml
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.ano.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
15.5 修改密码功能实现
-
导入前端素材
jsp/pwdmodify.jsp
注意表单请求地址:
<form id="userForm" name="userForm" method="post" action="${pageContext.request.contextPath }/jsp/user.do">
-
编写dao层UserDao修改密码的接口
UserDao.java
public interface UserDao { //getLoginUser... /** * 修改用户密码 * @param connection * @param id * @param password * @return */ public int updatePwd(Connection connection,int id, String password) throws SQLException; }
-
编写dao层UserDao修改密码接口的实现类
UserDaoImpl.java
public class UserDaoImp implements UserDao{ //getLoginUser... /** * 修改当前用户密码 * @param connection * @param id * @param password * @return * @throws SQLException */ public int updatePwd(Connection connection, int id, String password) throws SQLException { PreparedStatement preparedStatement = null; int execute = 0; if(connection != null) { String sql = "UPDATE smbms_user SET userPassword=? WHERE id = ?"; Object[] params = {password, id}; execute = BaseDao.executeUpdate(connection,preparedStatement,sql,params); BaseDao.closeResource(null,preparedStatement,null); } return execute; } }
-
编写业务层userService修改密码接口
UserService.java
public interface UserService { //login... /** * 根据当前用户ID修改密码 * @param id * @param password * @return */ public boolean updatePwd(int id, String password); }
-
编写业务层实现类UserServiceImpl
UserServiceImp.java
public class UserServiceImpl implements UserService { //业务层都会调用dao层,所以要引入Dao层 private UserDao userDao; public UserServiceImpl() { userDao = new UserDaoImp(); } //login... /** * 修改密码是否成功 * @param id * @param password * @return */ public boolean updatePwd(int id, String password) { Connection connection = null; boolean flag = false; try { connection = BaseDao.getConnection(); //修改密码 if(userDao.updatePwd(connection,id,password) > 0) { flag = true; } } catch (SQLException e) { e.printStackTrace(); }finally { //关闭资源 BaseDao.closeResource(connection,null,null); } return flag; } }
-
编写Servlet修改密码
UserServlet.java
/** * 实现Servlet复用 */ public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getParameter("method"); if(method != null && method.equals("savepwd")) { updatePwd(req, resp); } } //提取方法,实现Servlet复用 /** * 修改密码 * @param req * @param resp */ private void updatePwd(HttpServletRequest req, HttpServletResponse resp){ //从Session里面拿当前用户 Object attribute = req.getSession().getAttribute(Constants.USER_SESSION); String newPassword = req.getParameter("newpassword"); boolean flag = false; if(attribute != null && !StringUtils.isNullOrEmpty(newPassword)){ //调用Service层修改密码 UserService userService = new UserServiceImpl(); flag = userService.updatePwd(((User)attribute).getId(), newPassword); if(flag) { req.setAttribute("message","密码修改成功,请退出,使用新密码登录"); //密码修改成功,移除当前Session,重新登录 req.getSession().removeAttribute(Constants.USER_SESSION); }else { req.setAttribute("message","密码修改失败"); } }else { req.setAttribute("message","新密码设置有问题"); } try { req.getRequestDispatcher("pwdmodify.jsp").forward(req, resp); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
web.xml中注册Servlet
web.xml
<servlet> <servlet-name>UserServlet</servlet-name> <servlet-class>com.ano.servlet.user.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserServlet</servlet-name> <url-pattern>/jsp/user.do</url-pattern> </servlet-mapping>
-
优化修改密码:验证旧密码使用Ajax
pwdmodify.js
中的Ajax方法
pom.xml
中导入fastjson依赖,处理JSON转化<!-- 阿里巴巴的fastjson, 处理json转化 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
UserServlet.java
编写验证旧密码,这里注意,实现Servlet的复用。public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getParameter("method"); if(method != null && method.equals("savepwd")) { this.updatePwd(req, resp); }else if(method != null && method.equals("pwdmodify")) { this.pwdModify(req,resp); } } /** * 验证旧密码 * @param req * @param resp */ private void pwdModify(HttpServletRequest req, HttpServletResponse resp) { //Session中有用户的密码 Object attribute = req.getSession().getAttribute(Constants.USER_SESSION); String oldpassword = req.getParameter("oldpassword"); //结果集 HashMap<String, String> resultMap = new HashMap<>(); if(attribute == null) { //Session过期或失效 resultMap.put("result","sessionerror"); }else if(StringUtils.isNullOrEmpty(oldpassword)) { //旧密码输入为空 resultMap.put("result", "error"); }else { //Session中用户的密码 String userPassword = ((User) attribute).getUserPassword(); if (!oldpassword.equals(userPassword)) { //旧密码输入错误 resultMap.put("result", "false"); }else { resultMap.put("result", "true"); } } try { resp.setContentType("application/json"); PrintWriter writer = resp.getWriter(); //JSONArray Alibaba的JSON工具类,转换格式 writer.write(JSONArray.toJSONString(resultMap)); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } //private void updatePwd(HttpServletRequest req, HttpServletResponse resp)... @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
测试OK!
15.5 用户管理页面实现(查询用户功能)
15.5.1 准备工作
-
思路
-
导入用户列表页面资源
userlist.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="/jsp/common/head.jsp"%> <div class="right"> <div class="location"> <strong>你现在所在的位置是:</strong> <span>用户管理页面</span> </div> <div class="search"> <form method="get" action="${pageContext.request.contextPath }/jsp/user.do"> <input name="method" value="query" class="input-text" type="hidden"> <span>用户名:</span> <input name="queryname" class="input-text" type="text" value="${queryUserName }"> <span>用户角色:</span> <select name="queryUserRole"> <c:if test="${roleList != null }"> <option value="0">--请选择--</option> <c:forEach var="role" items="${roleList}"> <option <c:if test="${role.id == queryUserRole }">selected="selected" </c:if> value="${role.id}">${role.roleName}</option> </c:forEach> </c:if> </select> <input type="hidden" name="pageIndex" value="1"/> <input value="查 询" type="submit" id="searchbutton"> <a href="${pageContext.request.contextPath}/jsp/useradd.jsp" >添加用户</a> </form> </div> <!--用户--> <table class="providerTable" cellpadding="0" cellspacing="0"> <tr class="firstTr"> <th width="10%">用户编码</th> <th width="20%">用户名称</th> <th width="10%">性别</th> <th width="10%">年龄</th> <th width="10%">电话</th> <th width="10%">用户角色</th> <th width="30%">操作</th> </tr> <c:forEach var="user" items="${userList }" varStatus="status"> <tr> <td> <span>${user.userCode }</span> </td> <td> <span>${user.userName }</span> </td> <td> <span> <c:if test="${user.gender==1}">男</c:if> <c:if test="${user.gender==2}">女</c:if> </span> </td> <td> <span>${user.age}</span> </td> <td> <span>${user.phone}</span> </td> <td> <span>${user.userRoleName}</span> </td> <td> <span><a class="viewUser" href="javascript:;" userid=${user.id } username=${user.userName }><img src="${pageContext.request.contextPath }/images/read.png" alt="查看" title="查看"/></a></span> <span><a class="modifyUser" href="javascript:;" userid=${user.id } username=${user.userName }><img src="${pageContext.request.contextPath }/images/xiugai.png" alt="修改" title="修改"/></a></span> <span><a class="deleteUser" href="javascript:;" userid=${user.id } username=${user.userName }><img src="${pageContext.request.contextPath }/images/schu.png" alt="删除" title="删除"/></a></span> </td> </tr> </c:forEach> </table> <input type="hidden" id="totalPageCount" value="${totalPageCount}"/> <c:import url="rollpage.jsp"> <c:param name="totalCount" value="${totalCount}"/> <c:param name="currentPageNo" value="${currentPageNo}"/> <c:param name="totalPageCount" value="${totalPageCount}"/> </c:import> </div> </section> <!--点击删除按钮后弹出的页面--> <div class="zhezhao"></div> <div class="remove" id="removeUse"> <div class="removerChid"> <h2>提示</h2> <div class="removeMain"> <p>你确定要删除该用户吗?</p> <a href="#" id="yes">确定</a> <a href="#" id="no">取消</a> </div> </div> </div> <%@include file="/jsp/common/foot.jsp" %> <script type="text/javascript" src="${pageContext.request.contextPath }/js/userlist.js"></script>
rollpage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript"> </script> </head> <body> <div class="page-bar"> <ul class="page-num-ul clearfix"> <li>共${param.totalCount }条记录 ${param.currentPageNo }/${param.totalPageCount }页</li> <c:if test="${param.currentPageNo > 1}"> <a href="javascript:page_nav(document.forms[0],1);">首页</a> <a href="javascript:page_nav(document.forms[0],${param.currentPageNo-1});">上一页</a> </c:if> <c:if test="${param.currentPageNo < param.totalPageCount }"> <a href="javascript:page_nav(document.forms[0],${param.currentPageNo+1 });">下一页</a> <a href="javascript:page_nav(document.forms[0],${param.totalPageCount });">最后一页</a> </c:if> </ul> <span class="page-go-form"><label>跳转至</label> <input type="text" name="inputPage" id="inputPage" class="page-key" />页 <button type="button" class="page-btn" onClick='jump_to(document.forms[0],document.getElementById("inputPage").value)'>GO</button> </span> </div> </body> <script type="text/javascript" src="${pageContext.request.contextPath }/js/rollpage.js"></script> </html>
15.4.2 获取用户数量
-
dao接口层UserDao
UserDao.java
public interface UserDao { //... /** * 根据用户名或者用户角色ID查询用户总数量 * @param connection * @param userName * @param userRole * @return * @throws SQLException */ public int getUserCount(Connection connection, String userName, int userRole) throws SQLException; }
-
dao接口层实现类UserDaoImpl
UserDaoImp.java
注意sql语句的拼接
public class UserDaoImp implements UserDao{ //... /** * 根据用户名或者角色ID查询用户总数 * @param connection * @param userName * @param userRole 用户角色id * @return */ @Override public int getUserCount(Connection connection, String userName, int userRole) throws SQLException { PreparedStatement preparedStatement = null; ResultSet resultSet = null; int count = 0; if (connection != null) { StringBuffer sql = new StringBuffer(); sql.append("select count(1) as count from smbms_user u, smbms_role r where u.userRole = r.id"); List<Object> params= new ArrayList<>(); if(!StringUtils.isNullOrEmpty(userName)) { //注意and前面要加空格 sql.append(" and u.userName like ?"); //模糊查询需要加% params.add("%" + userName + "%"); } if(userRole > 0) { sql.append(" and u.userRole = ?"); params.add(userRole); } ResultSet execute = BaseDao.execute(connection, preparedStatement, resultSet, sql.toString(), params.toArray()); if(execute.next()) { count = execute.getInt("count"); } BaseDao.closeResource(null,preparedStatement,resultSet); } return count; } }
-
编写业务层接口UserService
UserService.java
public interface UserService { //... /** * 根据用户名和用户角色查询记录数 * @param userName * @param userRole * @return */ public int getUserCount(String userName, int userRole); }
-
编写业务层接口实现类UserServiceImpl
UserServiceImpl.java
public class UserServiceImpl implements UserService { //业务层都会调用dao层,所以要引入Dao层 private UserDao userDao; public UserServiceImpl() { userDao = new UserDaoImp(); } //... /** * 查询记录数 * @param userName * @param userRole * @return */ @Override public int getUserCount(String userName, int userRole) { Connection connection = null; int userCount = 0; try { connection = BaseDao.getConnection(); userCount = userDao.getUserCount(connection, userName, userRole); } catch (SQLException e) { e.printStackTrace(); } finally { BaseDao.closeResource(connection,null,null); } return userCount; } }
15.5.3 获取用户列表
-
dao接口层UserDao
UserDao.java
public interface UserDao { //... /** * 根据条件查询用户列表 * @param connection * @param userName * @param userRole * @param currentPageNo * @param pageSize * @return * @throws SQLException */ public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize) throws SQLException; }
-
dao接口层实现类UserDaoImpl
UserDaoImp.java
注意sql语句的拼接
public class UserDaoImp implements UserDao{ //... /** * 查询用户列表 * @param connection * @param userName * @param userRole * @param currentPageNo * @param pageSize * @return * @throws SQLException */ @Override public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize) throws SQLException { PreparedStatement preparedStatement = null; ResultSet resultSet = null; List<User> userList = new ArrayList<>(); if (connection != null) { StringBuffer sql = new StringBuffer(); sql.append("select u.*, r.roleName as userRoleName from smbms_user u, smbms_role r where u.userRole = r.id"); List<Object> params = new ArrayList<>(); if (!StringUtils.isNullOrEmpty(userName)) { sql.append(" and u.userName like ?"); params.add("%" + userName + "%"); } if (userRole > 0) { sql.append(" and u.userRole = ?"); params.add(userRole); } //使用limit分页: limit startIndex, pageSize sql.append(" order by u.creationDate DESC limit ?,?"); currentPageNo = (currentPageNo - 1) * pageSize; params.add(currentPageNo); params.add(pageSize); resultSet = BaseDao.execute(connection, preparedStatement, resultSet, sql.toString(), params.toArray()); while (resultSet.next()) { User user = new User(); user.setId(resultSet.getInt("id")); user.setUserCode(resultSet.getString("userCode")); user.setUserName(resultSet.getString("userName")); user.setGender(resultSet.getInt("gender")); user.setBirthday(resultSet.getDate("birthday")); user.setPhone(resultSet.getString("phone")); user.setUserRole(resultSet.getInt("userRole")); user.setUserRoleName(resultSet.getString("userRoleName")); userList.add(user); } BaseDao.closeResource(null, preparedStatement, resultSet); } return userList; } }
-
编写业务层接口UserService
UserService.java
public interface UserService { //... /** * 根据用户名、用户角色查用户列表 * @param userName * @param userRole * @param currentPageNo * @param pageSize * @return */ public List<User> getUserList(String userName, int userRole, int currentPageNo, int pageSize); }
-
编写业务层接口实现类UserServiceImpl
UserServiceImpl.java
public class UserServiceImpl implements UserService { //业务层都会调用dao层,所以要引入Dao层 private UserDao userDao; public UserServiceImpl() { userDao = new UserDaoImp(); } //... /** * 根据条件获取用户列表 * @param userName * @param userRole * @param currentPageNo * @param pageSize * @return */ @Override public List<User> getUserList(String userName, int userRole, int currentPageNo, int pageSize) { List<User> userList = new ArrayList<>(); Connection connection = null; try { connection = BaseDao.getConnection(); userList = userDao.getUserList(connection, userName, userRole, currentPageNo, pageSize); } catch (SQLException e) { e.printStackTrace(); } finally { BaseDao.closeResource(connection, null,null); } return userList; } }
15.5.4 获取角色列表
-
RoleDao.java
package com.ano.dao.role; public interface RoleDao { /** * * @param connection * @return */ public List<Role> getRoleList(Connection connection) throws SQLException; }
-
RoleDaoImpl.java
package com.ano.dao.role; public class RoleDaoImp implements RoleDao{ @Override public List<Role> getRoleList(Connection connection) throws SQLException { PreparedStatement preparedStatement = null; ResultSet resultSet = null; List<Role> roleList = new ArrayList<>(); if(connection != null) { String sql = "SELECT * FROM smbms_role"; Object[] params = {}; resultSet = BaseDao.execute(connection,preparedStatement,resultSet,sql,params); while (resultSet.next()) { Role role = new Role(); role.setId(resultSet.getInt("id")); role.setRoleCode(resultSet.getString("roleCode")); role.setRoleName(resultSet.getString("roleName")); roleList.add(role); } BaseDao.closeResource(null,preparedStatement,resultSet); } return roleList; } }
-
RoleService.java
package com.ano.service.role; public interface RoleService { /** * 查询角色列表 * @return */ public List<Role> getRoleList(); }
-
RoleServiceImpl.java
package com.ano.service.role; public class RoleServiceImpl implements RoleService{ //业务层都会调用dao层,所以要引入Dao层 private RoleDao roleDao; public RoleServiceImpl() { roleDao = new RoleDaoImp(); } /** * 获取角色列表 * @return */ @Override public List<Role> getRoleList() { List<Role> roleList = new ArrayList<>(); Connection connection = null; try { connection = BaseDao.getConnection(); roleList = roleDao.getRoleList(connection); } catch (SQLException e) { e.printStackTrace(); }finally { BaseDao.closeResource(connection, null, null); } return roleList; } }
15.5.5 编写Servlet
-
分页的工具类
util/PageSupport.java
public class PageSupport { /** * 当前页码-来自于用户输入 */ private int currentPageNo = 1; /** * 总数量(表) */ private int totalCount = 0; /** * 页面容量 */ private int pageSize = 0; /** * 总页数-totalCount/pageSize(+1) */ private int totalPageCount = 1; public int getCurrentPageNo() { return currentPageNo; } public void setCurrentPageNo(int currentPageNo) { if(currentPageNo > 0){ this.currentPageNo = currentPageNo; } } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { if(totalCount > 0){ this.totalCount = totalCount; //设置总页数 this.setTotalPageCountByRs(); } } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { if(pageSize > 0){ this.pageSize = pageSize; } } public int getTotalPageCount() { return totalPageCount; } public void setTotalPageCount(int totalPageCount) { this.totalPageCount = totalPageCount; } /** * 设置总页数,如果总行数不能被页面大小整除,则多余的行数要在新的一页 * 所以总页数会加一 */ public void setTotalPageCountByRs(){ if(this.totalCount % this.pageSize == 0){ this.totalPageCount = this.totalCount / this.pageSize; }else if(this.totalCount % this.pageSize > 0){ this.totalPageCount = this.totalCount / this.pageSize + 1; }else{ this.totalPageCount = 0; } } }
-
根据userlist.jsp页面字段,编写UserServlet
主要步骤:
- 获取用户前端的数据;
- 根据参数的值判断请求是否需要执行;
- 为了实现分页,需要计算出当前页面、总页数、页面大小…;
- 用户列表显示;
- 返回前端。
UserServlet.java
public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getParameter("method"); if(method != null && method.equals("savepwd")) { this.updatePwd(req, resp); }else if(method != null && method.equals("pwdmodify")) { this.pwdModify(req,resp); }else if (method != null && method.equals("query")) { this.query(req,resp); } } //... /** * * @param req * @param resp */ private void query(HttpServletRequest req, HttpServletResponse resp) { //从前端获取数据 String queryUserName = req.getParameter("queryname"); String tempUserRole = req.getParameter("queryUserRole"); String pageIndex = req.getParameter("pageIndex"); //获取用户列表 UserServiceImpl userService = new UserServiceImpl(); List<User> userList = null; //第一次走这个请求,一定是首页,并且页面大小固定 int queryUserRole = 0; int pageSize = 5; int currentPageNo = 1; if(queryUserName == null) { queryUserName = ""; } if( tempUserRole!=null && !tempUserRole.equals("")) { queryUserRole = Integer.parseInt(tempUserRole); } if(pageIndex != null) { currentPageNo = Integer.parseInt(pageIndex); } //获取用户的总数(分页:上一页、下一页的情况) int totalCount = userService.getUserCount(queryUserName, queryUserRole); //总页数支持 PageSupport pageSupport = new PageSupport(); pageSupport.setCurrentPageNo(currentPageNo); pageSupport.setPageSize(pageSize); pageSupport.setTotalCount(totalCount); int totalPageCount = pageSupport.getTotalPageCount(); //控制首页和尾页:如果是首页,不能再往前了,如果是尾页,不能再往后了 if(currentPageNo < 1) { currentPageNo = 1; }else if (currentPageNo > totalPageCount) { currentPageNo = totalPageCount; } //获取用户列表 userList = userService.getUserList(queryUserName, queryUserRole, currentPageNo, pageSize); req.setAttribute("userList",userList); //获取角色列表 RoleServiceImpl roleService = new RoleServiceImpl(); List<Role> roleList = roleService.getRoleList(); req.setAttribute("roleList",roleList); req.setAttribute("totalCount",totalCount); req.setAttribute("currentPageNo",currentPageNo); req.setAttribute("totalPageCount",totalPageCount); req.setAttribute("queryUserName",queryUserName); req.setAttribute("queryUserRole",queryUserRole); //返回前端 try { req.getRequestDispatcher("userlist.jsp").forward(req,resp); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
测试OK!
15.6 添加用户功能实现
- 思考项目架构
-
导入添加用户页面资源
useradd.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="/jsp/common/head.jsp"%> <div class="right"> <div class="location"> <strong>你现在所在的位置是:</strong> <span>用户管理页面 >> 用户添加页面</span> </div> <div class="providerAdd"> <form id="userForm" name="userForm" method="post" action="${pageContext.request.contextPath }/jsp/user.do"> <input type="hidden" name="method" value="add"> <!--div的class 为error是验证错误,ok是验证成功--> <div> <label for="userCode">用户编码:</label> <input type="text" name="userCode" id="userCode" value=""> <!-- 放置提示信息 --> <font color="red"></font> </div> <div> <label for="userName">用户名称:</label> <input type="text" name="userName" id="userName" value=""> <font color="red"></font> </div> <div> <label for="userPassword">用户密码:</label> <input type="password" name="userPassword" id="userPassword" value=""> <font color="red"></font> </div> <div> <label for="ruserPassword">确认密码:</label> <input type="password" name="ruserPassword" id="ruserPassword" value=""> <font color="red"></font> </div> <div> <label >用户性别:</label> <select name="gender" id="gender"> <option value="1" selected="selected">男</option> <option value="2">女</option> </select> </div> <div> <label for="birthday">出生日期:</label> <input type="text" Class="Wdate" id="birthday" name="birthday" value="2020-2-20" οnclick="WdatePicker();"> <font color="red"></font> </div> <div> <label for="phone">用户电话:</label> <input type="text" name="phone" id="phone" value=""> <font color="red"></font> </div> <div> <label for="address">用户地址:</label> <input name="address" id="address" value=""> </div> <div> <label >用户角色:</label> <!-- 列出所有的角色分类 --> <select name="userRole" id="userRole"> <option value="1" selected="selected">系统管理员</option> <option value="2" selected="selected">经理</option> <option value="3" selected="selected">普通员工</option> </select> <font color="red"></font> </div> <div class="providerAddBtn"> <input type="button" name="add" id="add" value="保存" > <input type="button" id="back" name="back" value="返回" > </div> </form> </div> </div> </section> <%@include file="/jsp/common/foot.jsp" %> <script type="text/javascript" src="${pageContext.request.contextPath }/js/useradd.js"></script>
-
UserDao
UserDao.java
public interface UserDao { //... /** * 添加用户 * @param connection * @param user * @return */ public int addUser(Connection connection, User user) throws SQLException; }
-
UserDaoImpl
UserDaoImpl.java
public class UserDaoImp implements UserDao{ //... /** * 添加用户 * @param connection * @param user * @return * @throws SQLException */ @Override public int addUser(Connection connection, User user) throws SQLException { PreparedStatement preparedStatement = null; int updateRows = 0; if(connection != null) { String sql = "INSERT INTO smbms_user (userCode, userName, userPassword, gender, birthday, phone, address, userRole, createdBy, creationDate) VALUES (?,?,?,?,?,?,?,?,?,?)"; Object[] params = {user.getUserCode(), user.getUserName(), user.getUserPassword(), user.getGender(),user.getBirthday(), user.getPhone(), user.getAddress(), user.getUserRole(), user.getCreateBy(),user.getCreationDate()}; updateRows = BaseDao.executeUpdate(connection, preparedStatement, sql, params); BaseDao.closeResource(null,preparedStatement,null); } return updateRows; } }
-
UserService
UserService.java
public interface UserService { //... /** * 添加用户 * @param user * @return */ public boolean addUser(User user); }
-
UserServiceImp
UserServiceImp.java
public class UserServiceImpl implements UserService { //业务层都会调用dao层,所以要引入Dao层 private UserDao userDao; public UserServiceImpl() { userDao = new UserDaoImp(); } //... /** * 添加用户 * @param user * @return */ @Override public boolean addUser(User user) { int count = 0; boolean flag = false; Connection connection = null; try { connection = BaseDao.getConnection(); //关闭自动提交,开启事务 connection.setAutoCommit(false); count = userDao.addUser(connection, user); //执行完添加操作,一定要提交事务!! connection.commit(); if(count > 0) { flag = true; } } catch (SQLException e) { e.printStackTrace(); try { //执行操作异常,要回滚事务 connection.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } finally { BaseDao.closeResource(connection,null,null); } return flag; } }
-
UserServlet
UserServlet.java
/** * 注意这里实现Servlet复用 */ public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getParameter("method"); if(method != null && method.equals("savepwd")) { this.updatePwd(req, resp); }else if(method != null && method.equals("pwdmodify")) { this.pwdModify(req,resp); }else if (method != null && method.equals("query")) { this.query(req,resp); }else if (method != null && method.equals("add")) { this.add(req,resp); } } //... /** * 添加用户 * @param req * @param resp */ private void add(HttpServletRequest req, HttpServletResponse resp) { //从前端获取数据 String userCode = req.getParameter("userCode"); String userName = req.getParameter("userName"); String userPassword = req.getParameter("userPassword"); Integer gender = Integer.valueOf(req.getParameter("gender")); String birth = req.getParameter("birthday"); String phone = req.getParameter("phone"); String address = req.getParameter("address"); Integer userRole = Integer.valueOf(req.getParameter("userRole")); Date birthday = null; try { birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birth); } catch (ParseException e) { e.printStackTrace(); } //把这些参数封装进User对象传入后端 User user = new User(userCode,userName,userPassword,gender,birthday,phone,address,userRole); user.setCreateBy(((User)req.getSession().getAttribute(Constants.USER_SESSION)).getId()); user.setCreationDate(new Date()); //调用Service层方法添加用户 UserServiceImpl userService = new UserServiceImpl(); if(userService.addUser(user)) { try { resp.sendRedirect(req.getContextPath()+"/jsp/user.do?method=query"); } catch (IOException e) { e.printStackTrace(); } } else { try { req.getRequestDispatcher("useradd.jsp").forward(req,resp); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
15.7 删除用户功能实现
-
查看前端资源参数
userlist.js
//用户管理页面上点击删除按钮弹出删除框(userlist.jsp) function deleteUser(obj){ $.ajax({ type:"GET", url:path+"/jsp/user.do", data:{method:"deluser",uid:obj.attr("userid")}, dataType:"json", success:function(data){ if(data.delResult == "true"){//删除成功:移除删除行 cancleBtn(); obj.parents("tr").remove(); changeDLGContent("删除用户【"+obj.attr("username")+"】成功"); }else if(data.delResult == "false"){//删除失败 //alert("对不起,删除用户【"+obj.attr("username")+"】失败"); changeDLGContent("对不起,删除用户【"+obj.attr("username")+"】失败"); }else if(data.delResult == "notexist"){ //alert("对不起,用户【"+obj.attr("username")+"】不存在"); changeDLGContent("对不起,用户【"+obj.attr("username")+"】不存在"); } }, error:function(data){ //alert("对不起,删除失败"); changeDLGContent("对不起,删除失败"); } }); }
-
UserDao
UserDao.java
public interface UserDao { //... /** * 根据userId删除用户 * @param connection * @param userId * @return */ public int deleteUser(Connection connection, int userId) throws SQLException; }
-
UserDaoImpl
UserDaoImpl.java
public class UserDaoImp implements UserDao{ //... /** * 根据用户ID删除用户记录 * @param connection * @param userId * @return * @throws SQLException */ @Override public int deleteUser(Connection connection, int userId) throws SQLException { PreparedStatement preparedStatement = null; int updateRows = 0; if(connection != null) { String sql = "DELETE FROM smbms_user WHERE id = ?"; Object[] params = {userId}; updateRows = BaseDao.executeUpdate(connection, preparedStatement, sql, params); BaseDao.closeResource(null,preparedStatement,null); } return updateRows; } }
-
UserService
UserService.java
public interface UserService { //... /** * 删除用户 * @param userId * @return */ public boolean deleteUser(int userId); }
-
UserServiceImpl
UserServiceImpl.java
public class UserServiceImpl implements UserService { //业务层都会调用dao层,所以要引入Dao层 private UserDao userDao; public UserServiceImpl() { userDao = new UserDaoImp(); } //... /** * 根据id删除用户记录 * @param userId * @return */ @Override public boolean deleteUser(int userId) { Connection connection = null; boolean flag = false; int count = 0; try { connection = BaseDao.getConnection(); connection.setAutoCommit(false); count = userDao.deleteUser(connection, userId); connection.commit(); if(count > 0) { flag = true; } } catch (SQLException e) { e.printStackTrace(); try { connection.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } finally { BaseDao.closeResource(connection,null,null); } return flag; } }
-
Servlet层
UserServlet.java
public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getParameter("method"); if(method != null && method.equals("savepwd")) { this.updatePwd(req, resp); }else if(method != null && method.equals("pwdmodify")) { this.pwdModify(req,resp); }else if (method != null && method.equals("query")) { this.query(req,resp); }else if (method != null && method.equals("add")) { this.add(req,resp); }else if (method != null && method.equals("deluser")) { this.delete(req,resp); } } //... /** * 删除用户 * @param req * @param resp */ private void delete(HttpServletRequest req, HttpServletResponse resp) { String userId = req.getParameter("uid"); Map<String, String> resultMap = new HashMap<>(); if(StringUtils.isNullOrEmpty(userId)) { resultMap.put("delResult","notexist"); }else { UserService userService = new UserServiceImpl(); if(userService.deleteUser(Integer.parseInt(userId))) { resultMap.put("delResult","true"); }else { resultMap.put("delResult","false"); } } try { resp.setContentType("application/json"); PrintWriter writer = resp.getWriter(); writer.write(JSONArray.toJSONString(resultMap)); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
15.8 查看单个用户的详细信息
-
前端页面
观察
userlist.js
中,href请求参数:$(".viewUser").on("click",function(){ //将被绑定的元素(a)转换成jquery对象,可以使用jquery方法 var obj = $(this); window.location.href=path+"/jsp/user.do?method=view&uid="+ obj.attr("userid"); });
userview.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="/jsp/common/head.jsp"%> <div class="right"> <div class="location"> <strong>你现在所在的位置是:</strong> <span>用户管理页面 >> 用户信息查看页面</span> </div> <div class="providerView"> <p><strong>用户编号:</strong><span>${user.userCode }</span></p> <p><strong>用户名称:</strong><span>${user.userName }</span></p> <p><strong>用户性别:</strong> <span> <c:if test="${user.gender == 1 }">男</c:if> <c:if test="${user.gender == 2 }">女</c:if> </span> </p> <p><strong>出生日期:</strong><span>${user.birthday }</span></p> <p><strong>用户电话:</strong><span>${user.phone }</span></p> <p><strong>用户地址:</strong><span>${user.address }</span></p> <p><strong>用户角色:</strong><span>${user.userRoleName}</span></p> <div class="providerAddBtn"> <input type="button" id="back" name="back" value="返回" > </div> </div> </div> </section> <%@include file="/jsp/common/foot.jsp" %> <script type="text/javascript" src="${pageContext.request.contextPath }/js/userview.js"></script>
-
UserDao
UserDao.java
public interface UserDao { //... /** * 根据userId获取用户信息 * @param connection * @param userId * @return */ public User getUserById(Connection connection, Integer userId) throws SQLException; }
-
UserDaoImpl
UserDaoImpl.java
public class UserDaoImp implements UserDao{ //... /** * 根据用户Id查询用户 * @param connection * @param userId * @return * @throws SQLException */ @Override public User getUserById(Connection connection, Integer userId) throws SQLException { PreparedStatement preparedStatement = null; ResultSet resultSet = null; User user = null; if(connection != null) { String sql = "SELECT u.*,r.roleName as userRoleName FROM smbms_user u, smbms_role r WHERE u.userRole = r.id AND u.id = ?"; Object[] params = {userId}; resultSet = BaseDao.execute(connection, preparedStatement, resultSet, sql, params); if(resultSet.next()) { user = new User(); user.setId(resultSet.getInt("id")); user.setUserCode(resultSet.getString("userCode")); user.setUserName(resultSet.getString("userName")); user.setUserPassword(resultSet.getString("userPassword")); user.setGender(resultSet.getInt("gender")); user.setBirthday(resultSet.getDate("birthday")); user.setPhone(resultSet.getString("phone")); user.setAddress(resultSet.getString("address")); user.setUserRole(resultSet.getInt("userRole")); user.setCreateBy(resultSet.getInt("createdBy")); user.setCreationDate(resultSet.getDate("creationDate")); user.setModifyBy(resultSet.getInt("modifyBy")); user.setModifyDate(resultSet.getDate("modifyDate")); user.setUserRoleName(resultSet.getString("userRoleName")); } BaseDao.closeResource(null,preparedStatement,resultSet); } return user; } }
-
UserService
USerService.java
public interface UserService { //... /** * 根据用户Id查询用户信息 * @param userId * @return */ public User getUserById(Integer userId); }
-
UserServiceImp
UserServiceImp.java
public class UserServiceImpl implements UserService { private UserDao userDao; public UserServiceImpl() { userDao = new UserDaoImp(); } //... @Override public User getUserById(Integer userId) { Connection connection = null; User user = null; connection = BaseDao.getConnection(); try { user = userDao.getUserById(connection, userId); } catch (SQLException e) { e.printStackTrace(); } finally { BaseDao.closeResource(connection,null,null); } return user; } }
-
UserServlet
UserServlet.java
public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getParameter("method"); if (method != null && method.equals("savepwd")) { this.updatePwd(req, resp); } else if (method != null && method.equals("pwdmodify")) { this.pwdModify(req, resp); } else if (method != null && method.equals("query")) { this.query(req, resp); } else if (method != null && method.equals("add")) { this.add(req, resp); } else if (method != null && method.equals("deluser")) { this.delete(req, resp); } else if (method != null && method.equals("view")) { this.getUserById(req, resp, "/jsp/userview.jsp"); } } /** * 根据用户Id查询用户 * @param req * @param resp * @param url */ private void getUserById(HttpServletRequest req, HttpServletResponse resp, String url) { String userId = req.getParameter("uid"); if(!StringUtils.isNullOrEmpty(userId)) { UserService userService = new UserServiceImpl(); User user = userService.getUserById(Integer.parseInt(userId)); req.setAttribute("user", user); try { req.getRequestDispatcher(url).forward(req,resp); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
15.9 修改用户功能实现
-
前端页面
userlist.js
中$(".modifyUser").on("click",function(){ var obj = $(this); window.location.href=path+"/jsp/user.do?method=modify&uid="+ obj.attr("userid"); });
usermodify.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="/jsp/common/head.jsp"%> <div class="right"> <div class="location"> <strong>你现在所在的位置是:</strong> <span>用户管理页面 >> 用户修改页面</span> </div> <div class="providerAdd"> <form id="userForm" name="userForm" method="post" action="${pageContext.request.contextPath }/jsp/user.do"> <input type="hidden" name="method" value="modifyexe"> <input type="hidden" name="uid" value="${user.id }"/> <div> <label for="userName">用户名称:</label> <input type="text" name="userName" id="userName" value="${user.userName }"> <font color="red"></font> </div> <div> <label >用户性别:</label> <select name="gender" id="gender"> <c:choose> <c:when test="${user.gender == 1 }"> <option value="1" selected="selected">男</option> <option value="2">女</option> </c:when> <c:otherwise> <option value="1">男</option> <option value="2" selected="selected">女</option> </c:otherwise> </c:choose> </select> </div> <div> <label for="birthday">出生日期:</label> <input type="text" Class="Wdate" id="birthday" name="birthday" value="${user.birthday }" readonly="readonly" οnclick="WdatePicker();"> <font color="red"></font> </div> <div> <label for="phone">用户电话:</label> <input type="text" name="phone" id="phone" value="${user.phone }"> <font color="red"></font> </div> <div> <label for="address">用户地址:</label> <input type="text" name="address" id="address" value="${user.address }"> </div> <div> <label >用户角色:</label> <!-- 列出所有的角色分类 --> <input type="hidden" value="${user.userRole }" id="rid" /> <select name="userRole" id="userRole"></select> <font color="red"></font> </div> <div class="providerAddBtn"> <input type="button" name="save" id="save" value="保存" /> <input type="button" id="back" name="back" value="返回"/> </div> </form> </div> </div> </section> <%@include file="/jsp/common/foot.jsp" %> <script type="text/javascript" src="${pageContext.request.contextPath }/js/usermodify.js"></script>
usermodify.js
中的异步请求//... $.ajax({ type:"GET",//请求类型 url:path+"/jsp/user.do",//请求的url data:{method:"getrolelist"},//请求参数 dataType:"json",//ajax接口(请求url)返回的数据类型 success:function(data){//data:返回数据(json对象) if(data != null){ var rid = $("#rid").val(); userRole.html(""); var options = "<option value=\"0\">请选择</option>"; for(var i = 0; i < data.length; i++){ //alert(data[i].id); //alert(data[i].roleName); if(rid != null && rid != undefined && data[i].id == rid ){ options += "<option selected=\"selected\" value=\""+data[i].id+"\" >"+data[i].roleName+"</option>"; }else{ options += "<option value=\""+data[i].id+"\" >"+data[i].roleName+"</option>"; } } userRole.html(options); } }, error:function(data){//当访问时候,404,500 等非200的错误状态码 validateTip(userRole.next(),{"color":"red"},imgNo+" 获取用户角色列表error",false); } }); //...
-
UserDao
UserDao.java
public interface UserDao { //... /** * 修改用户信息 * @param connection * @param user * @return * @throws SQLException */ public int modifyUser(Connection connection, User user) throws SQLException; }
-
UserDaoImpl
UserDaoImpl.java
package com.ano.dao.user; import com.ano.dao.BaseDao; import com.ano.pojo.User; import com.mysql.jdbc.StringUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /** * @author wangjiao */ public class UserDaoImp implements UserDao{ //... /** * 修改用户 * @param connection * @param user * @return * @throws SQLException */ @Override public int modifyUser(Connection connection, User user) throws SQLException { /** * UPDATE smbms_user * SET phone = '13488888888' * WHERE id = 1 */ PreparedStatement preparedStatement = null; int updateRows = 0; if(connection != null) { String sql = "UPDATE smbms_user SET userName=?, gender=?, birthday=?, phone=?, address=?, userRole=?, modifyBy=?,modifyDate=? WHERE id = ?"; Object[] params = {user.getUserName(),user.getGender(), user.getBirthday(), user.getPhone(), user.getAddress(), user.getUserRole(),user.getModifyBy(),user.getModifyDate(), user.getId()}; updateRows = BaseDao.executeUpdate(connection, preparedStatement, sql, params); BaseDao.closeResource(null, preparedStatement, null); } return updateRows; } }
-
UserService
UserService.java
public interface UserService { //... /** * 修改用户 * @param user * @return */ public boolean modifyUser(User user); }
-
UserServiceImpl
UserServiceImpl.java
public class UserServiceImpl implements UserService { private UserDao userDao; public UserServiceImpl() { userDao = new UserDaoImp(); } //... /** * 修改用户 * @param user * @return */ @Override public boolean modifyUser(User user) { Connection connection = null; int count = 0; boolean flag = false; try { connection = BaseDao.getConnection(); connection.setAutoCommit(false); count = userDao.modifyUser(connection, user); connection.commit(); if(count > 0) { flag = true; } } catch (SQLException e) { e.printStackTrace(); try { connection.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } finally { BaseDao.closeResource(connection,null,null); } return flag; } }
-
UserServlet
UserServlet.java
public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getParameter("method"); if (method != null && method.equals("savepwd")) { this.updatePwd(req, resp); } else if (method != null && method.equals("pwdmodify")) { this.pwdModify(req, resp); } else if (method != null && method.equals("query")) { this.query(req, resp); } else if (method != null && method.equals("add")) { this.add(req, resp); } else if (method != null && method.equals("getrolelist")) { this.getRoleList(req,resp); } else if (method != null && method.equals("deluser")) { this.delete(req, resp); }else if (method != null && method.equals("view")) { this.getUserById(req, resp, "/jsp/userview.jsp"); }else if (method != null && method.equals("modify")) { this.getUserById(req,resp,"usermodify.jsp"); }else if (method != null && method.equals("modifyexe")) { this.modify(req,resp); } } /** * 根据用户Id查询用户 * @param req * @param resp * @param url */ private void getUserById(HttpServletRequest req, HttpServletResponse resp, String url) { String userId = req.getParameter("uid"); if(!StringUtils.isNullOrEmpty(userId)) { UserService userService = new UserServiceImpl(); User user = userService.getUserById(Integer.parseInt(userId)); req.setAttribute("user", user); try { req.getRequestDispatcher(url).forward(req,resp); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } /** * 修改用户 * @param req * @param resp */ private void modify(HttpServletRequest req, HttpServletResponse resp) { String userId = req.getParameter("uid"); String userName = req.getParameter("userName"); String gender = req.getParameter("gender"); String birthday = req.getParameter("birthday"); String phone = req.getParameter("phone"); String address = req.getParameter("address"); String userRole = req.getParameter("userRole"); User user = new User(); user.setId(Integer.valueOf(userId)); user.setUserName(userName); user.setGender(Integer.valueOf(gender)); try { user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday)); } catch (ParseException e) { e.printStackTrace(); } user.setPhone(phone); user.setAddress(address); user.setUserRole(Integer.valueOf(userRole)); user.setModifyBy(((User)req.getSession().getAttribute(Constants.USER_SESSION)).getId()); user.setModifyDate(new Date()); UserService userService = new UserServiceImpl(); if(userService.modifyUser(user)) { try { resp.sendRedirect(req.getContextPath()+"/jsp/user.do?method=query"); } catch (IOException e) { e.printStackTrace(); } }else { try { req.getRequestDispatcher("usermodify.jsp").forward(req,resp); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } /** * 获取用户角色列表 * @param req * @param resp */ private void getRoleList(HttpServletRequest req, HttpServletResponse resp) { RoleService roleService = new RoleServiceImpl(); List<Role> roleList = roleService.getRoleList(); resp.setContentType("application/json"); try { PrintWriter writer = resp.getWriter(); writer.write(JSONArray.toJSONString(roleList)); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }