JavaWeb-15-SMBMS(以用户管理模块为例)

15.1 项目架构

在这里插入图片描述

15.2 数据库设计
  • 共5张表

在这里插入图片描述

15.3 项目搭建

考虑:

是否使用Maven?依赖还是jar包

搭建一个maven web项目步骤如下:

  1. 使用maven模板创建一个maven项目;

  2. 补全项目结构,java, resources;

  3. 更新web.xml配置版本;

  4. 清理pom.xml;

  5. 配置Tomcat;

  6. 启动Tomcat测试项目是否能够成功跑起来,如下:
    在这里插入图片描述

  7. 导入项目中使用的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>
    
  8. 创建项目包结构,如com.ano;

    在这里插入图片描述

  9. 编写实体类;

    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...
    }
    
  10. 编写基础公共类;

    • 数据库配置文件
    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>
    
  11. 导入静态资源

    在这里插入图片描述

15.4 登录注销功能实现

在这里插入图片描述

  1. 导入前端页面素材

    login.jsp

    注意表单请求地址:

    <form class="loginForm" action="${pageContext.request.contextPath}/login.do"  name="actionForm" id="actionForm"  method="post" >
    
  2. 设置前端页面login.jsp为欢迎页

    web.xml

    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
    
  3. 编写dao层得到登录用户的接口

    UserDao.java

    public interface UserDao {
        /**
         * 得到要登录的用户
         * @param connection
         * @param userCode
         * @return
         */
        public User getLoginUser(Connection connection, String userCode) throws SQLException;
    
    }
    
  4. 编写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;
        }
    }
    
  5. 业务层接口

    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);
    }
    
  6. 业务层实现类

    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;
        }
    }
    
  7. 编写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);
        }
    }
    
  8. 注册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>
    
  9. 注销功能

    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>
    
  10. 注销后或者未登录的权限拦截过滤

编写登录拦截过滤器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 修改密码功能实现

在这里插入图片描述

  1. 导入前端素材

    jsp/pwdmodify.jsp

    注意表单请求地址:

    <form id="userForm" name="userForm" method="post" action="${pageContext.request.contextPath }/jsp/user.do">

  2. 编写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;
    }
    
  3. 编写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;
        }
    }
    
  4. 编写业务层userService修改密码接口

    UserService.java

    public interface UserService {
        //login...
    
        /**
         * 根据当前用户ID修改密码
         * @param id
         * @param password
         * @return
         */
        public boolean updatePwd(int id, String password);
    }
    
  5. 编写业务层实现类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;
        }
    }
    
  6. 编写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);
        }
    }
    
  7. 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>
    
  8. 优化修改密码:验证旧密码使用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);
        }
    }
    
  9. 测试OK!

15.5 用户管理页面实现(查询用户功能)
15.5.1 准备工作
  1. 思路
    在这里插入图片描述

  2. 导入用户列表页面资源

    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 }条记录&nbsp;&nbsp; ${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>
    				&nbsp;&nbsp;
    			</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 获取用户数量
  1. 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;
    }
    
  2. 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;
        }
    }
    
  3. 编写业务层接口UserService

    UserService.java

    public interface UserService {
        //...
        /**
         * 根据用户名和用户角色查询记录数
         * @param userName
         * @param userRole
         * @return
         */
        public int getUserCount(String userName, int userRole);
    }
    
  4. 编写业务层接口实现类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 获取用户列表
  1. 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;
    
    }
    
  2. 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;
        }
    }
    
  3. 编写业务层接口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);
    }
    
  4. 编写业务层接口实现类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 获取角色列表
  1. RoleDao.java

    package com.ano.dao.role;
    public interface RoleDao {
        /**
         *
         * @param connection
         * @return
         */
        public List<Role> getRoleList(Connection connection) throws SQLException;
    }
    
  2. 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;
        }
    }
    
  3. RoleService.java

    package com.ano.service.role;
    
    public interface RoleService {
        /**
         * 查询角色列表
         * @return
         */
        public List<Role> getRoleList();
    }
    
  4. 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
  1. 分页的工具类

    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;
    		}
    	}	
    }
    
  2. 根据userlist.jsp页面字段,编写UserServlet

    主要步骤:

    1. 获取用户前端的数据;
    2. 根据参数的值判断请求是否需要执行;
    3. 为了实现分页,需要计算出当前页面、总页数、页面大小…;
    4. 用户列表显示;
    5. 返回前端。

    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);
        }
    }
    
  3. 测试OK!
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

15.6 添加用户功能实现
  1. 思考项目架构

在这里插入图片描述

  1. 导入添加用户页面资源

    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>
    
  2. UserDao

    UserDao.java

    public interface UserDao {
        //...
    
        /**
         * 添加用户
         * @param connection
         * @param user
         * @return
         */
        public int addUser(Connection connection, User user) throws SQLException;
    }
    
  3. 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;
        }
    }
    
  4. UserService

    UserService.java

    public interface UserService {
        //...
    
        /**
         * 添加用户
         * @param user
         * @return
         */
        public boolean addUser(User user);
    
    }
    
  5. 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;
        }
    }
    
  6. 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 删除用户功能实现
  1. 查看前端资源参数

    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("对不起,删除失败");
    		}
    	});
    }
    
  2. UserDao

    UserDao.java

    public interface UserDao {
        //...
    
        /**
         * 根据userId删除用户
         * @param connection
         * @param userId
         * @return
         */
        public int deleteUser(Connection connection, int userId) throws SQLException;
    }
    
  3. 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;
        }
    }
    
  4. UserService

    UserService.java

    public interface UserService {
        //...
    
        /**
         * 删除用户
         * @param userId
         * @return
         */
        public boolean deleteUser(int userId);
    }
    
  5. 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;
        }
    }
    
  6. 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 查看单个用户的详细信息
  1. 前端页面

    观察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>
    
  2. UserDao

    UserDao.java

    public interface UserDao {
        //...
    
        /**
         * 根据userId获取用户信息
         * @param connection
         * @param userId
         * @return
         */
        public User getUserById(Connection connection, Integer userId) throws SQLException;
    }
    
  3. 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;
        }
    }
    
  4. UserService

    USerService.java

    public interface UserService {
        //...
    
        /**
         * 根据用户Id查询用户信息
         * @param userId
         * @return
         */
        public User getUserById(Integer userId);
    }
    
  5. 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;
        }
    }
    
  6. 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 修改用户功能实现
  1. 前端页面

    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);
    		}
    	});
    //...	
    
  2. UserDao

    UserDao.java

    public interface UserDao {
        //...
    
        /**
         * 修改用户信息
         * @param connection
         * @param user
         * @return
         * @throws SQLException
         */
        public int modifyUser(Connection connection, User user) throws SQLException;
    }
    
  3. 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;
        }
    }
    
  4. UserService

    UserService.java

    public interface UserService {
        //...
    
        /**
         * 修改用户
         * @param user
         * @return
         */
        public boolean modifyUser(User user);
    }
    
  5. 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;
        }
    }
    
  6. 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);
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值