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 }条记录 ${param.currentPageNo }/${param.totalPageCount }页</li>
<c:if test="${param.currentPageNo > 1}">
<a href="javascript:page_nav(document.forms[0],1);">首页</a>
<a href="javascript:page_nav(document.forms[0],${param.currentPageNo-1});">上一页</a>
</c:if>
<c:if test="${param.currentPageNo < param.totalPageCount }">
<a href="javascript:page_nav(document.forms[0],${param.currentPageNo+1 });">下一页</a>
<a href="javascript:page_nav(document.forms[0],${param.totalPageCount });">最后一页</a>
</c:if>
</ul>
<span class="page-go-form"><label>跳转至</label>
<input type="text" name="inputPage" id="inputPage" class="page-key" />页
<button type="button" class="page-btn" onClick='jump_to(document.forms[0],document.getElementById("inputPage").value)'>GO</button>
</span>
</div>
</body>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/rollpage.js"></script>
</html>
主线一
- 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。
慢慢来吧,今天状态有点不对,还是得早睡 ==
这个项目就到此为止了。。。

浙公网安备 33010602011771号