JavaWeb-超市订单管理系统

SMBMS

超市订单管理系统,一个Demo,主要巩固JavaWeb中的MVC架构,以及如何让项目变得更加规范,该Demo缺少前端以及数据库建表的练习,重点放在项目建立的规范。

前言

在设计模式中有这样一个原则,叫做单一职责原则,就是一个类只做一件事情,在此也是一样,JSP文件负责数据展示,Servlet控制层负责获取前端数据,调用业务层,Service业务层负责获得Servlet传的数据实现具体业务,Dao层负责访问数据库并持久化。

职责分明,每个目录都有对应的职责

顺序是这样的:控制层->业务层->数据持久化层

开发时应该从底层开始。也就是从数据持久化层开始dao层。

项目功能架构

数据库模型设计

sql文件:

项目搭建

  • 使用Maven创建Web项目

  • 配置Tomcat

  • 导入jar包

    javax.servlet-api 4.0.1

    javax.servlet.jsp-api 2.3.3

    javax.servlet.jsp.jstl 1.2

    mysql-connector-java 5.1.47

    taglibs 1.1.2

  • 创建项目结构

  • 编写实体类

  • 编写公共类

    • 数据库配置文件

      driver=com.mysql.jdbc.Driver
      url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8&useSSL=false
      username=root
      password=root
      
    • 数据库的公共类

    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");
        }
    
        //获取连接
        public static Connection getConnection(){
            Connection connection = null;
            try {
                Class.forName(driver);
                connection = DriverManager.getConnection(url, username, password);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return connection;
        }
    
        //DQL语句
        public static ResultSet excute(Connection connection, ResultSet resultSet, PreparedStatement preparedStatement,String sql,Object[] params) throws SQLException {
            preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                preparedStatement.setObject(i + 1,params[i]);
            }
            resultSet = preparedStatement.executeQuery();
            return resultSet;
        }
    
        //DML语句
        public static int excute(Connection connection, PreparedStatement preparedStatement,String sql,Object[] params) 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;
        }
    
        //关闭资源
        public static boolean closeResources(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
            boolean flag = true;
            if(resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException throwables) {
                    flag = false;
                    throwables.printStackTrace();
                }
            }
            if(preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException throwables) {
                    flag = false;
                    throwables.printStackTrace();
                }
            }
            if(connection != null) {
                try {
                    connection.close();
                } catch (SQLException throwables) {
                    flag = false;
                    throwables.printStackTrace();
                }
            }
            return flag;
        }
    }
    
    • 字符编码过滤器
    public class CharacterEncodingFilter implements Filter {
        public void init(FilterConfig filterConfig) throws ServletException {}
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            servletRequest.setCharacterEncoding("utf-8");
            servletResponse.setCharacterEncoding("utf-8");
            filterChain.doFilter(servletRequest, servletResponse);
        }
        public void destroy() {}
    

    注册过滤器

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • 导入静态资源(前端页面)

功能实现

登录功能

  • 编写前端页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>系统登录 - 超市订单管理系统</title>
    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css"/>
</head>
<body class="login_bg">
<section class="loginBox">
    <header class="loginHeader">
        <h1>超市订单管理系统</h1>
    </header>
    <section class="loginCont">
        <form class="loginForm" action="${pageContext.request.contextPath}/login.do" method="post" name="actionForm"
              id="actionForm">
            <div class="info">${error}</div>
            <div class="inputbox">
                <label for="userCode">用户名:</label>
                <input type="text" class="input-text" id="userCode" name="userCode" placeholder="请输入用户名" required/>
            </div>
            <div class="inputbox">
                <label for="userPassword">密码:</label>
                <input type="password" id="userPassword" name="userPassword" placeholder="请输入密码" required/>
            </div>
            <div class="subBtn">
                <input type="submit" value="登录"/>
                <input type="reset" value="重置"/>
            </div>
        </form>
    </section>
</section>
</body>
</html>
  • 设置为欢迎页
<welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
</welcome-file-list>
  • 编写dao层接口UserDao,声明得到用户实体类的方法
public interface UserDao {
    public User getLoginUser(Connection connection, String userCode, String userPassword) throws SQLException;
}
  • 编写该接口的实现类UserDaoImpl,实现该方法
public class UserDaoImpl implements UserDao {
    public User getLoginUser(Connection connection, String userCode,String userPassword) 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};
            //调用BaseDao的方法查询语句
            resultSet = BaseDao.excute(connection, resultSet,preparedStatement,sql, params);
            if (resultSet != null) {
                user = new User();
            }
            if(user != null && resultSet.next()) {
                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.setCreatedBy(resultSet.getInt("createdBy"));
                user.setCreationDate(resultSet.getDate("creationDate"));
                user.setModifyBy(resultSet.getInt("modifyBy"));
                user.setModifyDate(resultSet.getDate("modifyDate"));
            }
            BaseDao.closeResources(connection,preparedStatement,resultSet);

        }
        //得到该实体类对象
        return user;
    }
}
  • 编写业务层接口UserService方法,并声明登录业务的方法
public interface UserService {
    public User login(String userCode, String password);
}
  • 编写UserService接口的实现类UserServiceImpl,实现该方法
public class UserServiceImpl implements UserService {
    //维持UserDao的引用
    private UserDao userDao;
	//构造注入
    public UserServiceImpl() {
        userDao = new UserDaoImpl();
    }

    public User login(String userCode, String password) {
        Connection connection = null;
        User user = null;
        //调用BaseDao的方法
        connection = BaseDao.getConnection();
        try {
            //调用UserDao的方法
            user = userDao.getLoginUser(connection, userCode, password);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //关闭资源
            BaseDao.closeResources(connection,null,null);
            //与业务层紧密相关的代码,确认密码是否一致
            if(user != null && user.getUserPassword() != null && !user.getUserPassword().equals(password))
                user = null;
        }
        //返回实体类对象
        return user;
    }
}
  • 编写控制层LoginSerlvet
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //当此Servlet被调用时,打印台会输出该语句
        System.out.println("LoginServlet running...");
        String userCode = req.getParameter("userCode");
        String password = req.getParameter("userPassword");
        //创建业务层对象,调用该方法
        UserService userService = new UserServiceImpl();
        User user = userService.login(userCode, password);
        //控制请求转发,重定向
        if(user != null) {
            //将该实体类对象储存到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
<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>servlet.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login.do</url-pattern>
</servlet-mapping>

注销功能

将Session对象中的实体类对象移除

  • 编写LogoutServlet
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("/login.jsp");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  • 注册Servlet
<servlet>
    <servlet-name>LogoutServlet</servlet-name>
    <servlet-class>servlet.user.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LogoutServlet</servlet-name>
    <url-pattern>/jsp/logout.do</url-pattern>
</servlet-mapping>
  • 编写监听器,若Session中无实体类对象,则转发到错误界面
public class SysFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {}
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        User user = (User)request.getSession().getAttribute(Constants.USER_SESSION);
        if(user == null)
            response.sendRedirect("/error.jsp");
        filterChain.doFilter(request,response);
    }
    public void destroy() {}
}
  • 注册监听器
<filter>
    <filter-name>SysFilter</filter-name>
    <filter-class>filter.SysFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SysFilter</filter-name>
    <url-pattern>/jsp/*</url-pattern>
</filter-mapping>

密码修改

  • UserDao接口
public int passwordModify(Connection connection, String userCode, String userPassword) throws SQLException;
  • UserImpl实现类
    public int passwordModify(Connection connection, String userCode, String userPassword) throws SQLException {
        //调用BaseDao类的方法
        connection = BaseDao.getConnection();
        String sql = "update smbms_user set userPassword=? where userCode=?";
        Object[] params = {userPassword,userCode};
        int result = 0;
        if(connection != null){
            result = BaseDao.excute(connection, null, sql, params);
            BaseDao.closeResources(connection,null,null);
        }
        return result;
    }
  • UserService接口
public boolean passwordModify(String userCode, String password);
  • UserServiceImpl
public boolean passwordModify(String userCode, String password) {
    boolean flag = false;
    try {
        //调用UserDao层的方法
        int i = userDao.passwordModify(null, userCode, password);
        if(i > 0)
            flag = true;
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }
    return flag;
}
  • 控制层UserServlet
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);
        } 
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
    public void updatePwd(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("PasswordModifyServlet running....");
        String newpassword = req.getParameter("newpassword");
        boolean flag = false;
        Object obj = req.getSession().getAttribute(Constants.USER_SESSION);
        if(obj != null && newpassword != null && newpassword.length() != 0) {
            UserServiceImpl service = new UserServiceImpl();
            User user = (User) obj;
            flag = service.passwordModify(user.getUserCode(), newpassword);
			//将成功或失败信息存入Attribute中传到pwdmodify.jsp页面,并展示
            if(flag) {
                //密码修改成功移除session重新登录
                req.setAttribute("message", "修改成功,请返回登录页面重新登录!");
                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();
        }
    }
  • 注册UserServlet
<servlet>
    <servlet-name>UserServlet</servlet-name>
    <servlet-class>servlet.user.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/jsp/user.do</url-pattern>
</servlet-mapping>
验证旧密码

验证旧密码:这是密码修改里的一个小分支

密码修改三要素:输入旧密码,输入新密码,确认新密码,三个条件必须全部符合才能成功修改

但是验证旧密码,如果还是要用请求转发,刷新整个页面,显得很麻烦

为此引入了Ajax,即可以动态刷新局部的数据,在输入旧密码时,离开焦点时就可以与服务器发生交互。

准备工作:在项目的pom.xml包中导入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>
  • js文件
//在该输入框失去焦点时会调用该函数
oldpassword.on("blur",function(){
    $.ajax({
        type:"GET",
        url:path+"/jsp/user.do",
        data:{method:"pwdmodify",oldpassword:oldpassword.val()},
        dataType:"json",
        success:function(data){
            if(data.result === "true"){//旧密码正确
                validateTip(oldpassword.next(),{"color":"green"},imgYes,true);
            }else if(data.result === "false"){//旧密码输入不正确
                validateTip(oldpassword.next(),{"color":"red"},imgNo + " 原密码输入不正确",false);
            }else if(data.result === "sessionerror"){//当前用户session过期,请重新登录
                validateTip(oldpassword.next(),{"color":"red"},imgNo + " 当前用户session过期,请重新登录",false);
            }else if(data.result === "error"){//旧密码输入为空
                validateTip(oldpassword.next(),{"color":"red"},imgNo + " 请输入旧密码",false);
            }
        },
        error:function(data){
            //请求出错
            validateTip(oldpassword.next(),{"color":"red"},imgNo + " 请求错误",false);
        }
    });
    /*
$.ajax({
type:以何种方式进行提交请求
url:提交请求的url
data:传送的数据(json格式)
success:请求成功时的回调
error:请求失败时的回调
});
    */
  • 处理请求的UserServlet
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //代码复用派上用场了,多个请求可以提交到同一个Servlet
        //只要验证是哪一个何种请求提交至此处,再调用不同的方法即可。
        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);
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
    public void pwdModify(HttpServletRequest req, HttpServletResponse resp) {
        //处理的结果存到该Map中
        Map<String, String> resultMap = new HashMap<String, String>();
        Object obj = req.getSession().getAttribute(Constants.USER_SESSION);
        String oldpassword = req.getParameter("oldpassword");
        if(obj == null) {
            //session过期
            resultMap.put("result","sessionerror");
        } else if(oldpassword != null && oldpassword.length() == 0) {
            resultMap.put("result", "error");
        } else {
            String userPassword = ((User) obj).getUserPassword();
            if(userPassword != null && !userPassword.equals(oldpassword)) {
                resultMap.put("result", "false");
            } else {
                resultMap.put("result", "true");
            }
        }
        //设置响应
        resp.setContentType("application/json");
        PrintWriter writer = null;
        try {
            writer = resp.getWriter();
            //将集合对象转换成JSON字符串
            writer.write(JSONArray.toJSONString(resultMap));
            //清空缓存、关闭通道
            writer.flush();
            writer.close();
        } catch (IOException e) {	
            e.printStackTrace();
        }
    }
}

用户管理

  • 导入分页的工具类

    PageSupport.java

    package util;
    
    public class PageSupport {
        //当前页码
        private int currentPageNo = 1;
    
        //用户总数量
        private int totalCount = 0;
    
        //页面容量
        private int pageSize = 0;
    
        //总页数
        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 void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
    
        public int getPageSize() {
            return pageSize;
        }
    
    
        public int getTotalPageCount() {
            return totalPageCount;
        }
    
        public void setTotalPageCount(int totalPageCount) {
            this.totalPageCount = totalPageCount;
        }
        public void setTotalPageCountByRs() {
            if(totalCount % pageSize == 0) {
                totalPageCount = totalCount / pageSize;
            } else if(totalCount % pageSize > 0) {
                totalPageCount = totalCount / pageSize + 1;
            } else totalPageCount = 0;
        }
    }
    
    
  • 用户列表页面

<%@ 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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<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>
主线一
  • UserDao
//获取查询总数
public int getUserCount(Connection connection, String userName, int userRole) throws SQLException;
  • UserDaoImpl
//根据用户名和角色获取用户总量
public int getUserCount(Connection connection, String userName, int userRole) throws SQLException {
    int count = 0;
    PreparedStatement pstm = null;
    ResultSet rs = null;
    if(connection != null) {
        //使用者可能会根据名字查询或通过角色查询
        StringBuilder sql = new StringBuilder();
        ArrayList<Object> objs = new ArrayList<Object>();
        sql.append("select count(1) as count from smbms_user u, smbms_role r where u.userRole = r.id");
        if(!StringUtils.isNullOrEmpty(userName)) {
            sql.append(" and u.userName like ?");
            objs.add("%" + userName + "%");
        }
        if(userRole > 0) {
            sql.append(" and u.userRole = ?");
            objs.add(userRole);
        }
        System.out.println("UserDaoImpl->getUserCount:"+ sql.toString());
        Object[] params = objs.toArray();
        //调用BaseDao的方法
        rs = BaseDao.excute(connection, pstm , rs, sql.toString(), params);
        if(rs.next()) {
            count = rs.getInt("count");
        }
    }
    BaseDao.closeResources(connection,pstm,rs);
    return count;
}
  • UserService
public int getUserCount(String userName,int userRole);
  • UserServiceImpl
public int getUserCount(String userName, int userRole) {
    Connection connection = null;
    int count = 0;
    try {
        connection = BaseDao.getConnection();
        //调用UserDao的方法
        count = userDao.getUserCount(connection, userName, userRole);
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        BaseDao.closeResources(connection, null, null);
    }
    return count;
}
主线二
  • UserDao
 //获取用户列表
    public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize) throws SQLException;
  • UserDaoImpl
public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize) throws SQLException {
    List<User> list = new ArrayList<User>();
    PreparedStatement pstm = null;
    ResultSet rs = null;
    ArrayList<Object> objs = new ArrayList<Object>();
    if(connection != null) {
        StringBuilder sql = new StringBuilder();
        sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole = r.id");
        if(!StringUtils.isNullOrEmpty(userName)) {
            sql.append(" and u.userName like ?");
            objs.add("%" + userName + "%");

        }
        if(userRole > 0) {
            sql.append(" and u.userRole = ?");
            objs.add(userRole);
        }
        //分页:limit ?,?
        sql.append(" order by creationDate Desc limit ?,?");
        System.out.println("UserDaoImpl->getUserList:" + sql);
        currentPageNo = (currentPageNo - 1) * pageSize;
        objs.add(currentPageNo);
        objs.add(pageSize);
        Object[] params = objs.toArray();
        //调用BaseDao层的方法
        rs = BaseDao.excute(connection, pstm, rs, sql.toString(), params);
        while(rs.next()) {
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setUserCode(rs.getString("userCode"));
            user.setUserName(rs.getString("userName"));
            user.setGender(rs.getInt("gender"));
            user.setBirthday(rs.getDate("birthday"));
            user.setPhone(rs.getString("phone"));
            user.setUserRole(rs.getInt("userRole"));
            user.setUserRoleName(rs.getString("userRoleName"));
            user.setAge();
            list.add(user);
        }
        BaseDao.closeResources(connection, pstm, rs);
    }
    return list;
}
  • UserService
//获取用户列表
public List<User> getUserList(String userName, int userRole, int currentPageNo, int pageSize);
  • UserServiceImpl
public List<User> getUserList(String userName, int userRole, int currentPageNo, int pageSize) {
    Connection connection = null;
    List<User> userList = null;
    try {
        connection = BaseDao.getConnection();
        //调用UserDao层的方法
        userList = userDao.getUserList(connection, userName, userRole, currentPageNo, pageSize);
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        //调用BaseDao层的方法关闭资源
        BaseDao.closeResources(connection, null, null);
    }
    return userList;
}
终极任务
  • UserServlet

前文说到为提高Servlet的复用率,避免创建一堆Servlet,采用get传值的方式,将方法提取出来,传不同值执行不同的方法。

其实,仔细想想Servlet的作用,可以先分类:获取前端数据,处理前端数据,调用业务层的 方法,请求转发。

public void query(HttpServletRequest req, HttpServletResponse resp) {
    //获取前端数据
    String queryUserName = req.getParameter("queryname");
    String temp = req.getParameter("queryUserRole");
    String pageIndex = req.getParameter("pageIndex");
    //第一次进入该页面默认第一页,设置为第一页,且页面容量大小为5
    int  queryUserRole = 0;
    int currentPageNo = 1;
    int pageSize = 5;
    //若获取的查询用户名为空或为null赋个空串
    if(StringUtils.isNullOrEmpty(queryUserName)) {
        queryUserName = "";
    }
    System.out.println("UserServelt->query:" + queryUserName);
    //下拉框选择没问题则处理为整型
    if(temp != null && !temp.equals("")) {
        queryUserRole = Integer.parseInt(temp);
    }
    //此处也同理,若非空则转为int型
    if(pageIndex != null) {
        currentPageNo = Integer.parseInt(pageIndex);
    }

	//调用业务层的方法
    UserServiceImpl userService = new UserServiceImpl();
    int userCount = userService.getUserCount(queryUserName, queryUserRole);
    //引入该工具类
    PageSupport pageSupport = new PageSupport();
    pageSupport.setPageSize(pageSize);
    pageSupport.setCurrentPageNo(currentPageNo);
    pageSupport.setTotalCount(userCount);
    //控制首页和尾页
    if(currentPageNo < 1){
        currentPageNo = 1;
    } else if(currentPageNo > pageSupport.getTotalPageCount()) {
        currentPageNo = pageSupport.getTotalPageCount();
    }

    //调用业务层方法
    RoleService roleService = new RoleServiceImpl();
    List<Role> roleList = roleService.getRoleList();
    //角色列表更新到前端
    req.setAttribute("roleList",roleList);

    //调用另一个业务层的方法
    List<User> userList = userService.getUserList(queryUserName, queryUserRole, pageSupport.getCurrentPageNo(), pageSupport.getPageSize());
    //数据传送到前端
    req.setAttribute("userList", userList);
    req.setAttribute("totalPageCount", pageSupport.getTotalCount());
    req.setAttribute("totalCount", userCount);
    req.setAttribute("currentPageNo", pageSupport.getCurrentPageNo());
    req.setAttribute("totalPageCount",pageSupport.getTotalPageCount());

    //请求转发
    try {
        req.getRequestDispatcher("userlist.jsp").forward(req, resp);
    } catch (ServletException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这个用户管理挺难的, 涉及到分页需要的内容挺多的。

从数据库中取出查询后的用户总数->便于进行分页,还引入了PageSupport工具类

从数据库中取出用户列表->展示到前端需要用上。。。

一些感想

最大的收获应该是一些编程思维,分层、职责单一,常用的字符串提取到类中的常量,方便修改。。。

也更加熟悉了Servlet的职责,底层开始编写,慢慢往上写,写完一层都稍微做一下小测试,可以让开发更加高效。

思路清晰比一直写更加重要,代码不要一直写,先把大概框架定出来再去开枝散叶。

有些业务需要熟悉:分页数据库、JDBC连接数据库,这个BaseDao就可圈可点。也是当了个CRUD boy。

慢慢来吧,今天状态有点不对,还是得早睡 ==

这个项目就到此为止了。。。

posted @ 2021-05-28 19:30  Code_Ice  阅读(122)  评论(0)    收藏  举报