SMBMS(超市订单管理系统)项目从零开始搭建
如果需要完整的系统可以加我qq:1842329236
一、搭建一个maven web项目
新建一个maven,并且使用模板 maven的详细创建,及配置请看这篇文章 https://www.cnblogs.com/twq46/p/16508029.html二、配置Tomcat
Tomcat相关配置详情请看我的这篇文章,关于Tomcat的配置及遇到的问题和解决方法都在文章里 https://www.cnblogs.com/twq46/p/16508029.html三、测试项目是否能够跑起来
四、导入项目中会遇到的jar包
比如jsp,Servlet,mysql,jstl,standar.....<!-- servlet的依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!--JSP的依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!--standard标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--JSTL表达式的依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--连接数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
五、创建项目包结构
六、编写实体(pojo)类
以下四个实体类必须与数据库中表的字段一一对应1.User表的实体类
package com.tang.pojo;
import java.util.Date;
public class User {
private Integer id; //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 createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate; //更新时间
private Integer age;//年龄
private String userRoleName; //用户角色名称
public String getUserRoleName() {
return userRoleName;
}
public void setUserRoleName(String userRoleName) {
this.userRoleName = userRoleName;
}
public Integer getAge() {
/*long time = System.currentTimeMillis()-birthday.getTime();
Integer age = Long.valueOf(time/365/24/60/60/1000).IntegerValue();*/
Date date = new Date();
Integer age = date.getYear()-birthday.getYear();
return age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getUserRole() {
return userRole;
}
public void setUserRole(Integer userRole) {
this.userRole = userRole;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
2.Role表的实体类
package com.tang.pojo;
import java.util.Date;
public class Role {
private Integer id; //id
private String roleCode; //角色编码
private String roleName; //角色名称
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate;//更新时间
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRoleCode() {
return roleCode;
}
public void setRoleCode(String roleCode) {
this.roleCode = roleCode;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
3.Provider(供应商)表的实体类
package com.tang.pojo;
import java.util.Date;
public class Provider {
private Integer id; //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;//更新时间
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getProCode() {
return proCode;
}
public void setProCode(String proCode) {
this.proCode = proCode;
}
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
public String getProDesc() {
return proDesc;
}
public void setProDesc(String proDesc) {
this.proDesc = proDesc;
}
public String getProContact() {
return proContact;
}
public void setProContact(String proContact) {
this.proContact = proContact;
}
public String getProPhone() {
return proPhone;
}
public void setProPhone(String proPhone) {
this.proPhone = proPhone;
}
public String getProAddress() {
return proAddress;
}
public void setProAddress(String proAddress) {
this.proAddress = proAddress;
}
public String getProFax() {
return proFax;
}
public void setProFax(String proFax) {
this.proFax = proFax;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
4.Bill(账单)表的实体类
package com.tang.pojo;
import java.math.BigDecimal;
import java.util.Date;
public class Bill {
private Integer id; //id
private String billCode; //账单编码
private String productName; //商品名称
private String productDesc; //商品描述
private String productUnit; //商品单位
private BigDecimal productCount; //商品数量
private BigDecimal totalPrice; //总金额
private Integer isPayment; //是否支付
private Integer providerId; //供应商ID
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate;//更新时间
private String providerName;//供应商名称
public String getProviderName() {
return providerName;
}
public void setProviderName(String providerName) {
this.providerName = providerName;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBillCode() {
return billCode;
}
public void setBillCode(String billCode) {
this.billCode = billCode;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public String getProductUnit() {
return productUnit;
}
public void setProductUnit(String productUnit) {
this.productUnit = productUnit;
}
public BigDecimal getProductCount() {
return productCount;
}
public void setProductCount(BigDecimal productCount) {
this.productCount = productCount;
}
public BigDecimal getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(BigDecimal totalPrice) {
this.totalPrice = totalPrice;
}
public Integer getIsPayment() {
return isPayment;
}
public void setIsPayment(Integer isPayment) {
this.isPayment = isPayment;
}
public Integer getProviderId() {
return providerId;
}
public void setProviderId(Integer providerId) {
this.providerId = providerId;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
七、编写基础公共类
1.数据库配置文件
resource下db.properties代码url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&&characterEncoding=utf8&&useSSL=true";
username=root
password=root123456
2.编写数据库的公共类
Dao包下BaseDao代码如下package com.tang.dao;
import com.mysql.cj.protocol.Resultset;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
//操作数据库的公共类
public class BaseDao {
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();
}
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
}
//获取数据库的连接
public static Connection getConnection(){
Connection connection = null;//提升作用域
try {
connection = DriverManager.getConnection(url, username, password);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
//编写查询公共类
public static ResultSet execute(Connection connection,String sql,Object[] params,ResultSet resultSet,PreparedStatement preparedStatement) throws SQLException {
//预编译的sql,在后面直接执行就可以了
preparedStatement = connection.prepareStatement(sql);
//问号(参数可能不止一个,且类型未知,因此用Object的数据接收参数)
for (int i = 0; i < params.length; i++) {
//setObject占位符从1开始,但是我们的数组是从0开始
preparedStatement.setObject(i+1,params[i]);
}
resultSet = preparedStatement.executeQuery();
return resultSet;
}
//编写增删改的公共方法
public static int execute(Connection connection,String sql,Object[] params,PreparedStatement preparedStatement) throws SQLException {
preparedStatement = connection.prepareStatement(sql);
//问号(参数可能不止一个,且类型未知,因此用Object的数据接收参数)
for (int i = 0; i < params.length; i++) {
//setObject占位符从1开始,但是我们的数组是从0开始
preparedStatement.setObject(i+1,params[i]);
}
int updateRows = preparedStatement.executeUpdate();
return updateRows;
}
//释放资源
public static boolean coloseResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet){
boolean flag = true;
if(resultSet != null) {
try {
resultSet.close();
//GC回收
resultSet = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
flag = false;//关闭失败
}
}
if(connection != null) {
try {
connection.close();
//GC回收
connection = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
flag = false;//
}
}
if(preparedStatement != null) {
try {
preparedStatement.close();
//GC回收
preparedStatement = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
flag = false;
}
}
return flag;
}
}
3.编写字符编码过滤器
package com.tang.filter;
import javax.servlet.*;
import java.io.IOException;
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");
servletResponse.setContentType("text/html");
filterChain.doFilter(servletRequest,servletResponse);
}
public void destroy() {
}
}
并在web.xml中注册Filter
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.tang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
八、导入静态资源
在webapp下导入以下四个文件 https://files.cnblogs.com/files/blogs/755902/js.zip?t=1659085614https://files.cnblogs.com/files/blogs/755902/images.zip?t=1659085600
https://files.cnblogs.com/files/blogs/755902/css.zip?t=1659085576
https://files.cnblogs.com/files/blogs/755902/calendar.zip?t=1659085557
九、登录界面的实现
1.设置首页
<!-- 设置欢迎界面-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
首页样子
2.编写dao层得到登录用户的接口
dao层用于连接数据库 UserDao接口代码package com.tang.dao.user;
import com.tang.pojo.User;
import java.sql.Connection;
import java.sql.SQLException;
public interface UserDao {
//得到要登录的用户
public User getLoginUser(Connection connection,String userCode,String userPassword) throws SQLException;
}
3.编写dao层得到用户接口的实现类
UserDaoImpl代码package com.tang.dao.user;
import com.tang.dao.BaseDao;
import com.tang.pojo.User;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDaoImpl implements UserDao{
public User getLoginUser(Connection connection, String userCode,String userPassword) throws SQLException {
//准备三个对象
PreparedStatement pstm = null;
ResultSet rs = null;
User user = null;
//判断数据库连接是否成功
if(connection != null){
String sql = "select * from smbms_user where userConde=? and userPassword=?";//连接成功就给它一个SQL语句
Object[] params = {userCode, userPassword};
rs = BaseDao.execute(connection, pstm, rs, sql, params);//执行SQL
if(rs.next()){//若结果集中有数据
//得到该登录用户的信息
user = new User();
user.setId(rs.getInt("id"));
user.setUserCode(rs.getString("userCode"));
user.setUserName(rs.getString("userName"));
user.setUserPassword(rs.getString("userPassword"));
user.setGender(rs.getInt("gender"));
user.setBirthday(rs.getDate("birthday"));
user.setPhone(rs.getString("phone"));
user.setAddress(rs.getString("address"));
user.setUserRole(rs.getInt("userRole"));
user.setCreatedBy(rs.getInt("createdBy"));
user.setCreationDate(rs.getTimestamp("creationDate"));
user.setModifyBy(rs.getInt("modifyBy"));
user.setModifyDate(rs.getTimestamp("modifyDate"));
}
BaseDao.closeResource(null,pstm,rs);//连接可能涉及到业务,在这里先不关
}
return user;
}
}
4.业务层接口
service层用于操作dao层,然后判断登录是否成功package com.tang.service;
import com.tang.pojo.User;
public interface UserService {
//用户登录
public User login(String userCode,String password);
}
5.业务层实现类
package com.tang.service;
import com.tang.dao.BaseDao;
import com.tang.dao.user.UserDao;
import com.tang.dao.user.UserDaoImpl;
import com.tang.pojo.User;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
public class UserServiceImpl implements UserService{
//业务层都会调用dao层,所以我们要引入Dao层;
private UserDao userDao;//dao下的得到登录用户的接口
public UserServiceImpl(){
userDao = new UserDaoImpl();
}
public User login(String userCode, String password) {
Connection connection = null;
User user = null ;
try {
connection = BaseDao.getConnection();//得到连接
//通过业务层调用对应的具体的数据库操作
user = userDao.getLoginUser(connection, userCode, password);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
BaseDao.closeResource(connection,null,null);
}
return user;
}
}
6.编写servlet
package com.tang.servlet;
import com.tang.pojo.User;
import com.tang.service.UserServiceImpl;
import com.tang.util.Constant;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
//Servlet:控制层,调用业务层代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("LoginServlet-->start.....");
//获取用户名和密码,注意和前端login.jsp中的参数名相同
String userCode = req.getParameter("userCode");
String userPassword = req.getParameter("userPassword");
//和数据库中的密码进行对比,调用业务层
UserServiceImpl userService = new UserServiceImpl();
User user = userService.login(userCode, userPassword);//这里已经把登录的人给查出来了
if(user != null){//查有此人,可以登录
//将用户的信息存放到Session中
req.getSession().setAttribute(Constant.USER_SESSION,user);
//跳转到主页
resp.sendRedirect("/smbms_war/jsp/frame.jsp");
}
else {//查无此人,无法登录
//转发会登录页面,顺带提示它,用户名或者密码错误
req.setAttribute("error","用户名或则密码不正确");//给login.jsp中的error负值,然后就会显示出来
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7.注册servlet
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.tang.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
到这完成用户登录的判断,如下图
解决NoClassDefFoundError: Could not initialize class
输入账号和密码之后可能出现下面的500错误,找了一天,发现在target目录下没有db.properties文件,一气之下,直接将db.properties文件直接放到BaseDao同级目录下,因为下面报错的原因就是因为这个问题,所以在清理了一下maven之后再次构建会发现target目录下有db.properties这个文件
最后问题解决
十、登录功能优化
1.注销
思路:移除Session,返回登录界面package com.tang.servlet.user;
import com.tang.util.Constant;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//移除用户的Constant.USER_SESSION
req.getSession().removeAttribute(Constant.USER_SESSION);
resp.sendRedirect("/smbms_war/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.tang.servlet.user.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/jsp/logout.do</url-pattern>
</servlet-mapping>
运行结果图
2.登录拦截
用户没有登录的情况下不能进入主页package com.tang.filter;
import com.tang.pojo.User;
import com.tang.util.Constant;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SysFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//过滤器,从Session中获取用户
User user = (User) request.getSession().getAttribute(Constant.USER_SESSION);
if(user == null){//已经被移除或者注销了,或者未登录
response.sendRedirect("/smbms_war/error.jsp");
}else{
filterChain.doFilter(servletRequest,servletResponse);
}
}
public void destroy() {
}
}
web.xml注册代码如下:
<!-- 用户登录过滤-->
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.tang.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
登录完善之后运行结果图
十一、密码修改
1.导入前端素材
<li><a href="${pageContext.request.contextPath }/jsp/pwdmodify.jsp">密码修改</a></li>
导入之后记得用maven的插件把target给clean一下,然后重新部署项目
2.UserDao接口
//修改当前用户密码
public int updatePwd(Connection connection,int id,int password) throws SQLException;
3.UserDao接口实现类
//修改当前用户密码,需要连接数据库,和当前用户的id,以及旧密码
public int updatePwd(Connection connection, int id, int password) throws SQLException {
PreparedStatement pstm = null;//防止SQL注入
int execute = 0;
if(connection != null){//成功连接数据库
String sql = "update smbms_user set userPassword = ? where id = ?";
Object prams[] = {password,id};//传入两个参数
execute = BaseDao.execute(connection, sql, prams, pstm);
BaseDao.closeResource(null,pstm,null);
}
return execute;
}
4.UserService接口
//根据用户id修改密码
public boolean updatePwd( int id, int password);
5.UserService实现类
public boolean updatePwd(int id, int password) {
Connection connection = null;
boolean flag= false;
//修改密码
try {
connection = BaseDao.getConnection();
if(userDao.updatePwd(connection,id,password) > 0){
flag = true;//密码修改成功
}
} catch (Exception throwables) {
throwables.printStackTrace();
}finally{//关闭资源
BaseDao.closeResource(connection,null,null);
}
return flag;
}
6.Servlet 记得实现复用,需要提取方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getParameter("method");
if(method.equals("savepwd")&& method != null){
this.updatePwd(req,resp);
}
}
public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
//从Session里拿ID
Object o = req.getSession().getAttribute(Constant.USER_SESSION);
String newpassword = req.getParameter("newpassword");
boolean flag = false;
if(o != null && !StringUtils.isNullOrEmpty(newpassword)){
UserServiceImpl userService = new UserServiceImpl();
flag = userService.updatePwd(((User) o).getId(), newpassword);
if(flag){
req.setAttribute("message","修改密码成功,请退出使用新密码登录");
//密码修改成功移除当前session
req.getSession().removeAttribute(Constant.USER_SESSION);
}
else{
req.setAttribute("message","密码修改失败");
}
}else{
req.setAttribute("message","新密码有问题");
}
try {
req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);
//resp.sendRedirect("/smbms_war/jsp/pwdmodify.jsp");
} catch (Exception e) {
e.printStackTrace();
}
}
7.密码验证优化Ajax
//验证旧密码,session中有用户的密码
public void pwdModify(HttpServletRequest req, HttpServletResponse resp){
//从Session里拿ID
Object o = req.getSession().getAttribute(Constant.USER_SESSION);
String oldpassword = req.getParameter("oldpassword");
//万能的map,结果集
HashMap<String, String> resultMap = new HashMap<String, String>();
if(o == null){//session失效了
resultMap.put("result","sessionerror");
}else if(StringUtils.isNullOrEmpty(oldpassword)){//输入的密码为空
resultMap.put("result","error");
}else{
String userPassword = ((User) o).getUserPassword();//Session中用户的密码
if(oldpassword.equals(userPassword)){//输入的密码与原密码相同,前端显示✅
resultMap.put("result","true");
}else{//前台输入的密码与原密码不符则显示❌
resultMap.put("result","false");
}
}
try {
resp.setContentType("application/json");//让该方法返回一个json值
PrintWriter writer = resp.getWriter();
//JSONArray 阿里巴巴的JSON工具类,转换格式
//将结果转换为json格式
writer.write(JSONArray.toJSONString(resultMap));
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
十二、用户管理
1.获取用户数量
(1)UserDao
//查询用户总数
public int getUserCount(Connection connection,String userName,int userRole)throws SQLException;
(2)UserDaoImpl
//根据用户名或者角色查询用户总数
public int getUserCount(Connection connection, String userName, int userRole) throws SQLException {
PreparedStatement pstm = null;
ResultSet rs = 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 ");
ArrayList<Object> list = new ArrayList<Object>();//存放我们的参数
if(!StringUtils.isNullOrEmpty(userName)){
sql.append("and u.userName like ? ");
list.add("%"+userName+"%");//index:0
}
if(userRole>0){
sql.append("and u.userRole = ? ");
list.add(userRole);//index:1
}
//怎么吧list转换为数组
Object[] params = list.toArray();
System.out.println("UserDaoImpl-->getUserCount:"+sql.toString());//输出最后完整的SQL语句
rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);
if(rs.next()){
count = rs.getInt("count");//从结果集中获取最终的数量
}
BaseDao.closeResource(null,pstm,rs);
}
return count;
}
(3)UserService
//查询记录数
public int getUserCount(String username,int userRole);
(4)UserServiceImpl
//查询记录数
public int getUserCount(String username, int userRole) {
Connection connection = null;
int count = 0;
try {
connection = BaseDao.getConnection();
count = userDao.getUserCount(connection, username, userRole);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
BaseDao.closeResource(connection,null,null);
}
return count;
}
2.获取用户列表
(1)userDao
//获取用户列表
public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize)throws Exception;
(2)UserDaoImpl
//获取当前用户列表
public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize)
throws Exception {
PreparedStatement pstm = null;
ResultSet rs = null;
List<User> userList = new ArrayList<User>();
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> list = new ArrayList<Object>();
if(!StringUtils.isNullOrEmpty(userName)){
sql.append(" and u.userName like ?");
list.add("%"+userName+"%");
}
if(userRole > 0){
sql.append(" and u.userRole = ?");
list.add(userRole);
}
sql.append(" order by creationDate DESC limit ?,?");
currentPageNo = (currentPageNo-1)*pageSize;
list.add(currentPageNo);
list.add(pageSize);
Object[] params = list.toArray();
System.out.println("sql ----> " + sql.toString());
rs = BaseDao.execute(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"));
userList.add(_user);
}
BaseDao.closeResource(null, pstm, rs);
}
return userList;
}
(3)UserService
//根据条件查询用户列表
public List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize);
(4)UserServiceImpl
public List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize) {
Connection connection = null;
List<User> userList = null;
System.out.println("queryUserName ---- > " + queryUserName);
System.out.println("queryUserRole ---- > " + queryUserRole);
System.out.println("currentPageNo ---- > " + currentPageNo);
System.out.println("pageSize ---- > " + pageSize);
try {
connection = BaseDao.getConnection();
userList = userDao.getUserList(connection, queryUserName,queryUserRole,currentPageNo,pageSize);
} catch (Exception e) {
e.printStackTrace();
}finally{
BaseDao.closeResource(connection, null, null);
}
return userList;
}
3.获取角色列表
(1)RoleDao
//获取角色列表
public List<Role> getRoleList(Connection connection)throws Exception;
(2)RoleDaoImpl
//获取角色列表
public List<Role> getRoleList(Connection connection) throws Exception {
PreparedStatement pstm = null;
ResultSet rs = null;
ArrayList<Role> roleList = new ArrayList<Role>();
if(connection != null){
String sql = "select * from smbms_role";
Object[] params = {};
rs = BaseDao.execute(connection,pstm,rs,sql,params);
while(rs.next()){
Role _role = new Role();
_role.setId(rs.getInt("id"));
_role.setRoleCode(rs.getString("roleCode"));
_role.setRoleName(rs.getString("roleName"));
roleList.add(_role);
}
BaseDao.closeResource(null,pstm,rs);
}
return roleList;
}
(3)RoleService
//获取角色列表
public List<Role> getRoleList();
(4)RoleServiceImpl
public class RoleServiceImpl implements RoleService{
//引入Dao
private RoleDao roleDao;
public RoleServiceImpl() {
roleDao = new RoleDaoImpl();
}
//获取角色列表
public List<Role> getRoleList() {
List<Role> roleList = null;
Connection connection =null;
try {
connection = BaseDao.getConnection();
roleList = roleDao.getRoleList(connection);
} catch (Exception e) {
e.printStackTrace();
}finally {
BaseDao.closeResource(connection,null,null);
}
return roleList;
}
}
(5)UserServlet
//重点,难点
public void query(HttpServletRequest req, HttpServletResponse resp){
//查询用户列表
//从前端获取数据
String queryUserName = req.getParameter("queryname");
String temp = req.getParameter("queryUserRole");
String pageIndex = req.getParameter("pageIndex");
int queryUserRole = 0;
//获取用户列表
UserServiceImpl userService = new UserServiceImpl();
List<User> userList = null;
//获取角色列表
RoleServiceImpl roleService = new RoleServiceImpl();
List<Role> roleList = null;
//第一次走这个请求,一定是第一页,页面大小固定
int pageSize = 5;//可以把这个写到配置文件中,方便后期修改
int currentPageNo =1;
if(queryUserName == null){
queryUserName = "";
}
if(temp!=null && !temp.equals("")){
queryUserRole = Integer.parseInt(temp);//给查询赋值0,,1,2,3
}
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.getTotalCount();//总共有几页
int totalPageCount = ((int)(totalCount/pageSize))+1;//总共有几页
//控制首页和尾页
//如果页面要小于1了,就显示第一页的东西
if(currentPageNo < 1){
currentPageNo = 1;
}else if(currentPageNo > totalPageCount){//当前页大于了最后一页
currentPageNo = totalPageCount;
}
//获取用户列表展示
userList = userService.getUserList(queryUserName, queryUserRole, currentPageNo, pageSize);
req.setAttribute("userList",userList);
//获取角色列表展示
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();
}
}
4.用户显示的Servlet
(1)获取用户前端的数据(查询)
//从前端获取数据
String queryUserName = req.getParameter("queryname");
String temp = req.getParameter("queryUserRole");
String pageIndex = req.getParameter("pageIndex");
int queryUserRole = 0;
//获取用户列表
UserServiceImpl userService = new UserServiceImpl();
List<User> userList = null;
//获取角色列表
RoleServiceImpl roleService = new RoleServiceImpl();
List<Role> roleList = null;
(2)判断请求是否执行,看参数的值判断
//第一次走这个请求,一定是第一页,页面大小固定
int pageSize = 5;//可以把这个写到配置文件中,方便后期修改
int currentPageNo =1;
if(queryUserName == null){
queryUserName = "";
}
if(temp!=null && !temp.equals("")){
queryUserRole = Integer.parseInt(temp);//给查询赋值0,,1,2,3
}
if(pageIndex != null){
currentPageNo = Integer.parseInt(pageIndex);
}
(3)实现分页
//获取用户的总数(分页:上一页和下一页)
int totalCount = userService.getUserCount(queryUserName, queryUserRole);
//总页数支持
PageSupport pageSupport = new PageSupport();
pageSupport.setCurrentPageNo(currentPageNo);
pageSupport.setPageSize(pageSize);
pageSupport.setTotalCount(totalCount);
// int totalPageCount = pageSupport.getTotalCount();//总共有几页
int totalPageCount = ((int)(totalCount/pageSize))+1;//总共有几页
//控制首页和尾页
//如果页面要小于1了,就显示第一页的东西
if(currentPageNo < 1){
currentPageNo = 1;
}else if(currentPageNo > totalPageCount){//当前页大于了最后一页
currentPageNo = totalPageCount;
}
(4)返回前端
//获取用户列表展示
userList = userService.getUserList(queryUserName, queryUserRole, currentPageNo, pageSize);
req.setAttribute("userList",userList);
//获取角色列表展示
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();
}