狂神Smbms(javaWeb超市订单管理系统)实现
Smbms
数据库:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?characterEncoding=utf8&serverTimezone=Asia/Shanghai
username=root
password=98526
项目如何搭建?
考虑使不使用Maven搭建?依赖,jar
项目搭建准备工作
- 搭建一个maven web项目
- 配置Tomcat
- 测试项目是否能够跑起来
- 导入项目中会遇到的jar包 如:jsp,Servlet,mysql驱动
- 创建项目包结构
- 编写实体类 ORM映射:表--类映射
package com.tang.pojo;import java.util.Calendar;/*** <h2>用户类</h2>*/ public class User {private Integer id;//用户idprivate String userCode;//用户编码private String userName;//用户名称private String userPassword;//用户密码private Integer gender;//性别private Calendar birthday;//出生日期private String phone;//电话private String address;//住址private Integer userRole;//用户角色private Integer createdBy;//创建者private Calendar creationDate;//创建日期private Integer modifyBy;//跟新者private Calendar modifyDate;//跟新时间private Integer age;//年龄private String userRoleName;//用户角色名称//返回用户当前年龄public Integer getAge(){Calendar instance = Calendar.getInstance();return (instance.get(Calendar.YEAR))-(birthday.get(Calendar.YEAR));}//GetSet方法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 Calendar getBirthday() {return birthday;}public void setBirthday(Calendar 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 Calendar getCreationDate() {return creationDate;}public void setCreationDate(Calendar creationDate) {this.creationDate = creationDate;}public Integer getModifyBy() {return modifyBy;}public void setModifyBy(Integer modifyBy) {this.modifyBy = modifyBy;}public Calendar getModifyDate() {return modifyDate;}public void setModifyDate(Calendar modifyDate) {this.modifyDate = modifyDate;}public void setAge(Integer age) {this.age = age;}public String getUserRoleName() {return userRoleName;}public void setUserRoleName(String userRoleName) {this.userRoleName = userRoleName;}}
package com.tang.pojo;import java.util.Calendar;/*** <h2>角色类</h2>*/ public class Role {private Integer id;//idprivate String roleCode;//角色编码private String roleName;//角色名称private String createdBy;//创建者private Calendar creationDate;//创建时间private Integer modifyBy;//跟新者private Calendar 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 String getCreatedBy() {return createdBy;}public void setCreatedBy(String createdBy) {this.createdBy = createdBy;}public Calendar getCreationDate() {return creationDate;}public void setCreationDate(Calendar creationDate) {this.creationDate = creationDate;}public Integer getModifyBy() {return modifyBy;}public void setModifyBy(Integer modifyBy) {this.modifyBy = modifyBy;}public Calendar getModifyDate() {return modifyDate;}public void setModifyDate(Calendar modifyDate) {this.modifyDate = modifyDate;} }
package com.tang.pojo;import java.util.Calendar;/*** <h2>供应商类</h2>*/ public class Provider {private Integer id;//idprivate String proCode;//商品编号private String proName;//供应商名称private String proDesc;//供应商描述private String proContact;//供应商联系人private String proPhone;//供应商电话private String proAddress;//供应商地址private String proFax;//供应商真传private String createdBy;//创建者private Calendar creationDate;//创建时间private Integer modifyBy;//跟新者private Calendar 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 String getCreatedBy() {return createdBy;}public void setCreatedBy(String createdBy) {this.createdBy = createdBy;}public Calendar getCreationDate() {return creationDate;}public void setCreationDate(Calendar creationDate) {this.creationDate = creationDate;}public Integer getModifyBy() {return modifyBy;}public void setModifyBy(Integer modifyBy) {this.modifyBy = modifyBy;}public Calendar getModifyDate() {return modifyDate;}public void setModifyDate(Calendar modifyDate) {this.modifyDate = modifyDate;} }
package com.tang.pojo;import java.math.BigDecimal; import java.util.Calendar;/*** <h2>账单类</h2>*/ public class Bill {private Integer id;//idprivate String billCode;//账号编码private String productName;//商品名称private String productDesc;//商品描述private String productUnit;//商品单位private BigDecimal productCount;//商品数量private BigDecimal totalPrice;//总金额private Integer isPayment;//是否支付private Integer providerId;//供应商idprivate Integer createdBy;//创建者private Calendar creationDate;//创建日期private Integer modifyBy;//跟新者private Calendar modifyDate;//跟新时间private String 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 Calendar getCreationDate() {return creationDate;}public void setCreationDate(Calendar creationDate) {this.creationDate = creationDate;}public Integer getModifyBy() {return modifyBy;}public void setModifyBy(Integer modifyBy) {this.modifyBy = modifyBy;}public Calendar getModifyDate() {return modifyDate;}public void setModifyDate(Calendar modifyDate) {this.modifyDate = modifyDate;}public String getProviderName() {return providerName;}public void setProviderName(String providerName) {this.providerName = providerName;} }
- 编写基础公共类
- 数据库配置文件
- 编写数据库的公共类:
package com.tang.dao;import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties;/*** <h2>操作数据库的公共类</h2>*/ 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) {System.err.println("操作数据库的公共类BaseDao:资源加载失败...");}try {driver = properties.getProperty("driver");url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");} catch (Exception e) {System.err.println("操作数据库的公共类BaseDao:资源获取失败...");}}/*** <h2 style="color: red">该方法用来获取数据库链接</h2>* <p style="color: yellow">该链接用来回滚数据库或者操作等等</p>** @return <font style="color: yellow">返回一个数据库链接</font>*/public static Connection getConnection() {try {Class.forName(driver);} catch (ClassNotFoundException e) {System.err.println("操作数据库的公共类BaseDao:JDBC驱动加载失败....");}try {return DriverManager.getConnection(url, username, password);} catch (SQLException e) {System.err.println("操作数据库的公共类BaseDao:数据库链接获取失败....");}return null;}/*** <h2 style="color: red">该方法用来向数据库查询数据</h2>** @param connection <font style="color: #0ff">传入数据库链接</font>* @param sql        <font style="color: #0ff">传入执行的sql语句</font>* @param parameter  <font style="color: #0ff">传入执行sql语句中问号的值的数组,如果没有问号则可以为null</font>* @param preparedStatement <font style="color: #0ff">用来接收结果集的对象</font>* @return              <font style="color: #0ff">返回一个查询结果的集ResultSet</font>* @throws SQLException <font style="color: #0ff">可能出现sql语句不对的异常</font>*/public static ResultSet executeQuery(Connection connection, String sql, Object[] parameter, PreparedStatement preparedStatement) throws SQLException {preparedStatement = connection.prepareStatement(sql);if (parameter!=null){for (int i = 0; i < parameter.length; i++) {//因为这里传入参数的问好是从1开始的所以这里+1preparedStatement.setObject(i + 1, parameter[i]);}}return preparedStatement.executeQuery();}/*** <h2 style="color: red">该方法用来向数据库修改增加或删除数据</h2>** @param connection <font style="color: #0ff">传入数据库链接</font>* @param sql        <font style="color: #0ff">传入执行的sql语句</font>* @param parameter  <font style="color: #0ff">传入执行sql语句中问号的值的数组,如果没有问好则可以为null</font>* @param preparedStatement <font style="color: #0ff">用来接收结果集的对象</font>* @return                     <font style="color: #0ff">返回受影响的行数</font>* @throws SQLException <font style="color: #0ff">可能出现sql语句不对的异常</font>*/public static Integer executeUpdate(Connection connection, String sql, Object[] parameter, PreparedStatement preparedStatement) throws SQLException {PreparedStatement preparedStatement1 = connection.prepareStatement(sql);if (parameter!=null){for (int i = 0; i < parameter.length; i++) {//因为这里传入参数的问好是从1开始的所以这里+1preparedStatement.setObject(i + 1, parameter[i]);}}return preparedStatement1.executeUpdate();}/*** <h2 style="color: red">该方法用来进行数据库或结果集等流的关闭</h2>* <font style="color: #00ff97;font-size: 10px;">注意:该方法只能实现关闭的类或他的父类实现了AutoCloseable接口才能进行关闭,否则请手动关闭!<font/>* <font style="color: #00ff97;font-size: 10px;">推荐使用该方法进行关闭应为该方法关闭的同时还调用了垃圾回收...<font/>* @param closeResources <font style="color: #0ff">传入需要关闭的资源</font>* @return <font style="color: #0ff">返回是否关闭成功</font>*/public static Boolean close(AutoCloseable... closeResources) {boolean flag = true;try {for (AutoCloseable closeResource : closeResources) {if (closeResource != null) {closeResource.close();}//这里为null是为了使GC线程更好的回收closeResource=null;}System.gc();} catch (Exception e) {System.err.println("操作数据库的公共类BaseDao:资源关闭失败...");flag=false;}return flag;}}
- 编写字符编码过滤器
package com.tang.filter;import jakarta.servlet.*;import java.io.IOException;public class CharacterEncodingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//设置字符编码servletRequest.setCharacterEncoding("utf-8");servletResponse.setCharacterEncoding("utf-8");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {} }
<!-- 过滤 --><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>
- 导入静态资源
狂神smbms的静态资源_爱学习的象哥的博客-CSDN博客
超市订单管理
登录功能实现
编写前端页面
设置首页
<!-- 设置欢迎页面 --><welcome-file-list><!-- 此页面设置完成之后则不会启动时进入index.jsp页面了会优先进入此页面 --><welcome-file>/ChaoShi/login.jsp</welcome-file></welcome-file-list>
编写dao登录用户登录的接口
package com.tang.dao.User;import com.tang.pojo.User; import java.sql.Connection;public interface UserDao {//得到要登录的用户信息User getLoginUser(Connection connection,String userCode); }
编写dao接口的实现类
package com.tang.dao.User;import com.tang.dao.BaseDao; import com.tang.pojo.User; import com.tang.util.ResultSetGetHashMap; import java.sql.*; import java.util.Date; import java.util.HashMap;public class UserDaoImpl implements UserDao {@Overridepublic User getLoginUser(Connection connection, String userCode) {User user = new User();String sql = "select * from smbms_user where userCode=?";Object[] Code = {userCode};PreparedStatement preparedStatement = null;try {ResultSet resultSet = BaseDao.executeQuery(connection, preparedStatement, sql, Code);HashMap<String, HashMap<Integer, Object>> hashMap = ResultSetGetHashMap.getHashMap(resultSet);user.setId((Integer) hashMap.get("id").get(0));user.setUserCode((String) hashMap.get("userCode").get(0));user.setUserName((String) hashMap.get("userName").get(0));user.setUserPassword((String) hashMap.get("userPassword").get(0));user.setGender((Integer) hashMap.get("gender").get(0));user.setBirthday((Date) hashMap.get("birthday").get(0));user.setPhone((String)hashMap.get("phone").get(0));user.setAddress((String)hashMap.get("address").get(0));user.setUserRole((Integer) hashMap.get("userRole").get(0));user.setCreatedBy((Integer) hashMap.get("createdBy").get(0));user.setCreationDate((Date) hashMap.get("creationDate").get(0));user.setModifyBy((Integer) hashMap.get("modifyBy").get(0));user.setModifyDate((Date) hashMap.get("modifyDate").get(0));BaseDao.close(preparedStatement,resultSet);} catch (SQLException e) {System.out.println("UserDaoImpl类的getLoginUser方法的sql异常....");}return user;} }
业务层接口
package com.tang.servlet.user;import com.tang.pojo.User;public interface UserServlet {//用户登录public User login(String userCode,String userPassword); }
业务层实现类
package com.tang.servlet.user;import com.tang.dao.BaseDao; import com.tang.dao.UserDao.UserDao; import com.tang.dao.UserDao.UserDaoImpl; import com.tang.pojo.User;import java.sql.Connection;public class UserServletImpl implements UserServlet{private final UserDao userDao;public UserServletImpl() {this.userDao=new UserDaoImpl();}@Overridepublic User login(String userCode, String userPassword) {Connection connection = BaseDao.getConnection();//通过业务层调调用对应具体的数据库操作User user = userDao.getLoginUser(connection, userCode);if (userPassword.equals(user.getUserPassword())){BaseDao.close(connection);return user;}else {System.err.println("警告:UserServletImpl类的login方法探测用户密码并不正确但还是正常返回用户信息!");}BaseDao.close(connection);return user;}public static void main(String[] args) {new UserServletImpl().login("admin","1234566");} }
编写Servlet
package com.tang.Servlet.User;import com.tang.pojo.User; import com.tang.servlce.user.UserServletImpl; import com.tang.util.Constants; import jakarta.servlet.*; import jakarta.servlet.http.*;import java.io.IOException;//Servlet:控制层调用业务层代码 public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取用户名和密码String userCode = request.getParameter("userCode");String userPassword =request.getParameter("userPassword");//与数据库中的密码进行对比User user =new UserServletImpl().login(userCode, userPassword);if (user.getId() != null) {if (user.getUserPassword().equals(userPassword)){//查有此人,并密码正确可以登录request.getSession().setAttribute(Constants.USER_SESSION, user);//跳转主页response.sendRedirect( request.getContextPath()+"/ChaoShi/jsp/frame.jsp");}else {//查无此人,转发回登录页面,顺带提示用户名或密码错误request.setAttribute("error", "用户名或密码不正确");request.getRequestDispatcher("/ChaoShi/login.jsp").forward(request, response);}}else {//查无此人,转发回登录页面,顺带提示用户名或密码错误request.setAttribute("error", "用户名或密码不正确");request.getRequestDispatcher("/ChaoShi/login.jsp").forward(request, response);}} }
注册Servlet
<!--登录页面注册--><servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.tang.Servlet.User.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login.do</url-pattern></servlet-mapping>
测试访问确保以上功能成功
登录功能优化
注销功能:
思路:移除Session返回登录页面
package com.tang.Servlet.User;import com.tang.util.Constants;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;public class LogoutServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//移除用户数据request.getSession().removeAttribute(Constants.USER_SESSION);//回到登录页面response.sendRedirect(request.getContextPath()+"/ChaoShi/login.jsp");}
}
注册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>/ChaoShi/jsp/logout.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>LogoutServlet</servlet-name><url-pattern>/jsp/logout.do</url-pattern></servlet-mapping>
登录拦截优化
package com.tang.filter;import com.tang.pojo.User;
import com.tang.util.Constants;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;public class SysFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request=(HttpServletRequest)servletRequest;HttpServletResponse response=(HttpServletResponse)servletResponse;User user = (User) request.getSession().getAttribute(Constants.USER_SESSION);System.out.println(user);if (user==null||user.getId()==null){System.out.println("用户并未登录");request.setAttribute("error", "请先进行登录");request.getRequestDispatcher("/ChaoShi/login.jsp").forward(servletRequest,servletResponse);}filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}
注册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>/ChaoShi/jsp/*</url-pattern></filter-mapping>
测试,登录,注销,权限,都要保证OK
密码修改功能
- 导入前端素材
<li><a href="${pageContext.request.contextPath }/jsp/pwdmodify.jsp">密码修改</a></li>
- 写项目建议从底层向上写
- UserDao接口
package com.tang.dao.UserDao;import com.tang.pojo.User; import java.sql.Connection;public interface UserDao {//得到要登录的用户信息User getLoginUser(Connection connection,String userCode);//修改当前用户的密码int updatePwd(Connection connection,int id,String password); }
- UserDao接口实现类
package com.tang.dao.UserDao;import com.tang.dao.BaseDao; import com.tang.pojo.User; import org.junit.jupiter.api.Test;import java.sql.*; import java.util.Date; import java.util.HashMap;/*** <h1>该类用于实现用户类所需要的功能</h1>*/ public class UserDaoImpl implements UserDao {/*** <h2 style="color: red">该方法用来查询数据库中的人员传入需要查找的数据库和人员id</h2>* <span style="color: red">注意:如果数据库没有这个人,则返回的user类里的内容为null,对象并不为null</span>* @param connection <span style="color: #00ff97;">需要既进入的数据库</span>* @param userCode <span style="color: #00ff97;">需要在数据库查询的人员id</span>* @return <span style="color: #00ff97;">返回查询到的用户类</span>*/@Overridepublic User getLoginUser(Connection connection, String userCode) {User user = new User();String sql = "select * from smbms_user where userCode=?";Object[] Code = {userCode};PreparedStatement preparedStatement = null;try {ResultSet resultSet = BaseDao.executeQuery(connection, preparedStatement, sql, Code);HashMap<String, HashMap<Integer, Object>> hashMap = BaseDao.getHashMap(resultSet);user.setId((Integer) hashMap.get("id").get(0));user.setUserCode((String) hashMap.get("userCode").get(0));user.setUserName((String) hashMap.get("userName").get(0));user.setUserPassword((String) hashMap.get("userPassword").get(0));user.setGender((Integer) hashMap.get("gender").get(0));user.setBirthday((Date) hashMap.get("birthday").get(0));user.setPhone((String)hashMap.get("phone").get(0));user.setAddress((String)hashMap.get("address").get(0));user.setUserRole((Integer) hashMap.get("userRole").get(0));user.setCreatedBy((Integer) hashMap.get("createdBy").get(0));user.setCreationDate((Date) hashMap.get("creationDate").get(0));user.setModifyBy((Integer) hashMap.get("modifyBy").get(0));user.setModifyDate((Date) hashMap.get("modifyDate").get(0));BaseDao.close(preparedStatement,resultSet);} catch (SQLException e) {System.err.println("UserDaoImpl类的getLoginUser方法的sql异常....");}return user;}/*** <h2 style="color: red">该方法用来修改用户的密码传入用户的id,和需要修改的新密码即可进行修改</h2>* @param connection* <font style="color: #00ff97;>需要进行修改的数据库</font>* @param id* <font style="color: #00ff97;>需要修改密码的用户</font>* @param password* <font style="color: #00ff97;>新密码</font>* @return* <font style="color: #00ff97;>返回数据库影响行数</font>*/@Overridepublic int updatePwd(Connection connection, int id, String password) {if (connection ==null||id==0||password==null){System.err.println("UserDaoImpl类的updatePwd方法传入的参数不能为空...");}String sql="update smbms_user set userPassword = ? where id=?";PreparedStatement preparedStatement=null;Object[] obj={password,id};Integer integer=null;try {integer = BaseDao.executeUpdate(connection, preparedStatement, sql, obj);BaseDao.close(connection, preparedStatement);} catch (SQLException e) {System.err.println("UserDaoImpl类的updatePwd方法的数据库修改数据异常....");}return integer;} }
- UserServlce层接口
package com.tang.servlce.user;import com.tang.pojo.User;import java.sql.Connection;public interface UserServlet {//用户登录public User login(String userCode,String userPassword);//根据id用户去修改密码public Boolean updatePwd(int id, String password); }
- UserServlce层接口实现类
package com.tang.servlce.user;import com.tang.dao.BaseDao; import com.tang.dao.UserDao.UserDao; import com.tang.dao.UserDao.UserDaoImpl; import com.tang.pojo.User;import java.sql.Connection;public class UserServletImpl implements UserServlet{private final UserDao userDao;public UserServletImpl() {this.userDao=new UserDaoImpl();}/*** <h2>通过传入userCode来查询用户并返回</h2>* @param userCode 传入要查询的userCode* @param userPassword 并未判断密码* @return 返回查询的用户*/@Overridepublic User login(String userCode, String userPassword) {Connection connection = BaseDao.getConnection();//通过业务层调调用对应具体的数据库操作User user = userDao.getLoginUser(connection, userCode);BaseDao.close(connection);return user;}/*** <h2>该方法,传入用户的id,和需要更改的密码就可以更改用户的密码</h2>* @param id 更改密码用户的id* @param password 更改的新密码* @return 返回是否更改成功*/@Overridepublic Boolean updatePwd(int id, String password) {return userDao.updatePwd(BaseDao.getConnection(), id, password) > 0;} }
- 实现复用需要提取出方法!
package com.tang.Servlet.User;import com.mysql.cj.util.StringUtils; import com.tang.pojo.User; import com.tang.servlce.user.UserServletImpl; import com.tang.util.Constants; import jakarta.servlet.*; import jakarta.servlet.http.*; import java.io.IOException;/*** 实现Servlet复用*/ public class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String method = request.getParameter("method");if (method!=null&&method.equals("savepwd")){updatePwd(request,response);}}/*** 改方法用来修改密码*/void updatePwd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取idObject obj = request.getSession().getAttribute(Constants.USER_SESSION);String parameter = request.getParameter("newpassword");Boolean flag=false;if (obj!=null&& !StringUtils.isNullOrEmpty(parameter)){flag = new UserServletImpl().updatePwd(((User) obj).getId(), parameter);if (flag){request.setAttribute("message","密码修改成功,请重新登录...");//修改成功移除Sessionrequest.getSession().removeAttribute(Constants.USER_SESSION);}else {//修改失败request.setAttribute("message","密码修改失败...");}}else {request.setAttribute("message","新密码修改有误...");}request.getRequestDispatcher("/ChaoShi/jsp/pwdmodify.jsp").forward(request,response);} }
- 注册XML
<servlet><servlet-name>UserServlet</servlet-name><servlet-class>com.tang.Servlet.User.UserServlet</servlet-class></servlet><servlet-mapping><servlet-name>UserServlet</servlet-name><url-pattern>/jsp/user.do</url-pattern></servlet-mapping>
- 测试
优化密码修改使用Ajax:
1.阿里巴巴的Fastjson
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.80</version>
</dependency>
2.验证用户
package com.tang.Servlet.User;import com.alibaba.fastjson.JSONArray;
import com.mysql.cj.util.StringUtils;
import com.tang.pojo.User;
import com.tang.servlce.user.UserServletImpl;
import com.tang.util.Constants;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;/*** 实现Servlet复用*/
public class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String method = request.getParameter("method");if (method!=null&&method.equals("pwdmodify")){PwdModify(request,response);}else if (method!=null&&method.equals("savepwd")){updatePwd(request,response);}}/*** 该方法用来验证用户的旧密码*/void PwdModify(HttpServletRequest request, HttpServletResponse response){//获取登录的当前用户Object obj = request.getSession().getAttribute(Constants.USER_SESSION);String oldpassword = request.getParameter("oldpassword");//万能的map:结果集HashMap<String, String> objectObjectHashMap = new HashMap<>();if (obj==null){//Sessin过期了objectObjectHashMap.put("result","sessionerror");}else if (StringUtils.isNullOrEmpty(oldpassword)){//输入的密码是否为空objectObjectHashMap.put("result","error");}else {//Session中用户的老密码String userPassword = ((User) obj).getUserPassword();//判断输入的密码是否正确if (userPassword.equals(oldpassword)){objectObjectHashMap.put("result","true");}else {objectObjectHashMap.put("result","false");}}//转换为json格式/*** 将map的["result","true"]* 转换为JSON格式={key:value}*/response.setContentType("application/json");try {PrintWriter writer = response.getWriter();writer.write(JSONArray.toJSONString(objectObjectHashMap));writer.flush();//刷新writer.close();} catch (IOException e) {System.out.println("UserServlet类的PwdModify方法的流转换出错...");}}/*** 该方法用来修改用户密码*/void updatePwd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取idObject obj = request.getSession().getAttribute(Constants.USER_SESSION);String parameter = request.getParameter("newpassword");Boolean flag=false;if (obj!=null&& !StringUtils.isNullOrEmpty(parameter)){flag = new UserServletImpl().updatePwd(((User) obj).getId(), parameter);if (flag){request.setAttribute("message","密码修改成功,请重新登录...");//修改成功移除Sessionrequest.getSession().removeAttribute(Constants.USER_SESSION);}else {//修改失败request.setAttribute("message","密码修改失败...");}}else {request.setAttribute("message","新密码修改有误...");}request.getRequestDispatcher("/ChaoShi/jsp/pwdmodify.jsp").forward(request,response);}
}
用户管理实现:
思路:
1.导入分类的工具
package com.tang.util;public class PageSupport {//当前页码来自用户输入private int currentPageN;//总数量private int totalCount;//页面容量private int SizePage;//总页数private int totalPageCount;public int getCurrentPageN() {return currentPageN;}//设置当前在第几页面public void setCurrentPageN(int currentPageN) {if(currentPageN>0){this.currentPageN = currentPageN;}else {System.err.println("设置的当前页面不能为负数!");}}public int getTotalCount() {return totalCount;}//设置总共有多少条记录public void setTotalCount(int totalCount) {if (totalCount>0){this.totalCount = totalCount;}}public int getSizePage() {return SizePage;}//设置页面大小public void setSizePage(int sizePage) {if (sizePage>0){SizePage = sizePage;}}//获取总页数public int getTotalPageCount() {totalPageCount=totalCount/ SizePage;return totalPageCount;}public void setTotalPageCount(int totalPageCount) {if (totalPageCount*SizePage-SizePage<totalCount) {System.err.println("总页数与实际总数不匹配...");}this.totalPageCount = totalPageCount;}
}
2.用户列表页面导入
userlist.jsp
1.获取用户数量
- UserDao
package com.tang.dao.UserDao;import com.tang.pojo.User; import java.sql.Connection;public interface UserDao {//得到要登录的用户信息User getLoginUser(Connection connection,String userCode);//修改当前用户的密码int updatePwd(Connection connection,int id,String password);//查询用户总数,根据用户名或者角色long getUserCount(Connection connection,String username,String userRole); }
- UserDaoImpl
package com.tang.dao.UserDao;import com.mysql.cj.util.StringUtils; import com.tang.dao.BaseDao; import com.tang.pojo.User;import java.sql.*; import java.util.*; import java.util.Date;/*** <h1>该类用于实现用户类所需要的功能</h1>*/ public class UserDaoImpl implements UserDao {/*** <h2 style="color: red">该方法用来查询数据库中的人员传入需要查找的数据库和人员id</h2>* <span style="color: red">注意:如果数据库没有这个人,则返回的user类里的内容为null,对象并不为null</span>* @param connection <span style="color: #00ff97;">需要既进入的数据库</span>* @param userCode <span style="color: #00ff97;">需要在数据库查询的人员id</span>* @return <span style="color: #00ff97;">返回查询到的用户类</span>*/@Overridepublic User getLoginUser(Connection connection, String userCode) {User user = new User();String sql = "select * from smbms_user where userCode=?";Object[] Code = {userCode};PreparedStatement preparedStatement = null;try {ResultSet resultSet = BaseDao.executeQuery(connection, preparedStatement, sql, Code);HashMap<String, HashMap<Integer, Object>> hashMap = BaseDao.getHashMap(resultSet);user.setId((Integer) hashMap.get("id").get(0));user.setUserCode((String) hashMap.get("userCode").get(0));user.setUserName((String) hashMap.get("userName").get(0));user.setUserPassword((String) hashMap.get("userPassword").get(0));user.setGender((Integer) hashMap.get("gender").get(0));user.setBirthday((Date) hashMap.get("birthday").get(0));user.setPhone((String)hashMap.get("phone").get(0));user.setAddress((String)hashMap.get("address").get(0));user.setUserRole((Integer) hashMap.get("userRole").get(0));user.setCreatedBy((Integer) hashMap.get("createdBy").get(0));user.setCreationDate((Date) hashMap.get("creationDate").get(0));user.setModifyBy((Integer) hashMap.get("modifyBy").get(0));user.setModifyDate((Date) hashMap.get("modifyDate").get(0));BaseDao.close(preparedStatement,resultSet);} catch (SQLException e) {System.err.println("UserDaoImpl类的getLoginUser方法的sql异常....");}return user;}/*** <h2 style="color: red">该方法用来修改用户的密码传入用户的id,和需要修改的新密码即可进行修改</h2>* @param connection* <font style="color: #00ff97;>需要进行修改的数据库</font>* @param id* <font style="color: #00ff97;>需要修改密码的用户</font>* @param password* <font style="color: #00ff97;>新密码</font>* @return* <font style="color: #00ff97;>返回数据库影响行数</font>*/@Overridepublic int updatePwd(Connection connection, int id, String password) {if (connection ==null||id==0||password==null){System.err.println("UserDaoImpl类的updatePwd方法传入的参数不能为空...");}String sql="update smbms_user set userPassword = ? where id=?";PreparedStatement preparedStatement=null;Object[] obj={password,id};Integer integer=null;try {integer = BaseDao.executeUpdate(connection, preparedStatement, sql, obj);BaseDao.close(connection, preparedStatement);} catch (SQLException e) {System.err.println("UserDaoImpl类的updatePwd方法的数据库修改数据异常....");}return integer;}/***<h2 style="color: red">该方法用来进行查询用户的数量输入数据库和用户名或者用户角色进行查询</h2>* @param connection <font style="color: #00ff97;>传入需要进行查询的数据库</font>* @param username <font style="color: #00ff97;>传入需要进行查询的用户名</font>* @param userRole <font style="color: #00ff97;>传入需要进行查询的角色 </font>* @return <font style="color: #0f0;>返回查询到的数量</font>*/@Overridepublic long getUserCount(Connection connection, String username, String userRole) {if (connection==null){System.err.println("UserDaoImpl类的getUserCount方法传入数据库不能为空!");return 0;}ArrayList<Object> list = new ArrayList<>();StringJoiner sb = new StringJoiner(" and ");sb.add("select count(1) as `count` from smbms_user u,smbms_role r where u.userRole=r.id");if (!StringUtils.isNullOrEmpty(username)){sb.add("u.userName like ?");list.add("%"+username+"%");}if (!StringUtils.isNullOrEmpty(userRole)){sb.add("u.userRole=?");list.add(userRole);}PreparedStatement preparedStatement = null;HashMap<String, HashMap<Integer, Object>> hashMap=null;try {ResultSet resultSet = BaseDao.executeQuery(connection, preparedStatement, sb.toString(), list.toArray());hashMap= BaseDao.getHashMap(resultSet);BaseDao.close(resultSet,preparedStatement);} catch (SQLException e) {System.err.println("UserDaoImpl类的getUserCount方法数据库查询异常!");e.printStackTrace();}assert hashMap != null;return (long) hashMap.get("count").get(0);}/*** <p>重载方法比起上面的方法多了一个是否关闭传入的数据库的值</p>*/public long getUserCount(Connection connection, String username, String userRole,Boolean CloseConnection) {long userCount = this.getUserCount(connection, username, userRole);if (CloseConnection){BaseDao.close(connection);}return userCount;} }
- UserService
package com.tang.servlce.user;import com.tang.pojo.User;import java.sql.Connection;public interface UserServlet {//用户登录public User login(String userCode,String userPassword);//根据id用户去修改密码public Boolean updatePwd(int id, String password);//输入用户名或者m,角色进行查询用户public long getUserCount(String username,String userRole); }
- UserServiceImpl
package com.tang.dao.UserDao;import com.mysql.cj.util.StringUtils; import com.tang.dao.BaseDao; import com.tang.pojo.User;import java.sql.*; import java.util.*; import java.util.Date;/*** <h1>该类用于实现用户类所需要的功能</h1>*/ public class UserDaoImpl implements UserDao {/*** <h2 style="color: red">该方法用来查询数据库中的人员传入需要查找的数据库和人员id</h2>* <span style="color: red">注意:如果数据库没有这个人,则返回的user类里的内容为null,对象并不为null</span>* @param connection <span style="color: #00ff97;">需要既进入的数据库</span>* @param userCode <span style="color: #00ff97;">需要在数据库查询的人员id</span>* @return <span style="color: #00ff97;">返回查询到的用户类</span>*/@Overridepublic User getLoginUser(Connection connection, String userCode) {User user = new User();String sql = "select * from smbms_user where userCode=?";Object[] Code = {userCode};PreparedStatement preparedStatement = null;try {ResultSet resultSet = BaseDao.executeQuery(connection, preparedStatement, sql, Code);HashMap<String, HashMap<Integer, Object>> hashMap = BaseDao.getHashMap(resultSet);user.setId((Integer) hashMap.get("id").get(0));user.setUserCode((String) hashMap.get("userCode").get(0));user.setUserName((String) hashMap.get("userName").get(0));user.setUserPassword((String) hashMap.get("userPassword").get(0));user.setGender((Integer) hashMap.get("gender").get(0));user.setBirthday((Date) hashMap.get("birthday").get(0));user.setPhone((String)hashMap.get("phone").get(0));user.setAddress((String)hashMap.get("address").get(0));user.setUserRole((Integer) hashMap.get("userRole").get(0));user.setCreatedBy((Integer) hashMap.get("createdBy").get(0));user.setCreationDate((Date) hashMap.get("creationDate").get(0));user.setModifyBy((Integer) hashMap.get("modifyBy").get(0));user.setModifyDate((Date) hashMap.get("modifyDate").get(0));BaseDao.close(preparedStatement,resultSet);} catch (SQLException e) {System.err.println("UserDaoImpl类的getLoginUser方法的sql异常....");}return user;}/*** <h2 style="color: red">该方法用来修改用户的密码传入用户的id,和需要修改的新密码即可进行修改</h2>* @param connection* <font style="color: #00ff97;>需要进行修改的数据库</font>* @param id* <font style="color: #00ff97;>需要修改密码的用户</font>* @param password* <font style="color: #00ff97;>新密码</font>* @return* <font style="color: #00ff97;>返回数据库影响行数</font>*/@Overridepublic int updatePwd(Connection connection, int id, String password) {if (connection ==null||id==0||password==null){System.err.println("UserDaoImpl类的updatePwd方法传入的参数不能为空...");}String sql="update smbms_user set userPassword = ? where id=?";PreparedStatement preparedStatement=null;Object[] obj={password,id};Integer integer=null;try {integer = BaseDao.executeUpdate(connection, preparedStatement, sql, obj);BaseDao.close(connection, preparedStatement);} catch (SQLException e) {System.err.println("UserDaoImpl类的updatePwd方法的数据库修改数据异常....");}return integer;}/***<h2 style="color: red">该方法用来进行查询用户的数量输入数据库和用户名或者用户角色进行查询</h2>* @param connection <font style="color: #00ff97;>传入需要进行查询的数据库</font>* @param username <font style="color: #00ff97;>传入需要进行查询的用户名</font>* @param userRole <font style="color: #00ff97;>传入需要进行查询的角色 </font>* @return <font style="color: #0f0;>返回查询到的数量</font>*/@Overridepublic long getUserCount(Connection connection, String username, String userRole) {if (connection==null){System.err.println("UserDaoImpl类的getUserCount方法传入数据库不能为空!");return 0;}ArrayList<Object> list = new ArrayList<>();StringJoiner sb = new StringJoiner(" and ");sb.add("select count(1) as `count` from smbms_user u,smbms_role r where u.userRole=r.id");if (!StringUtils.isNullOrEmpty(username)){sb.add("u.userName like ?");list.add("%"+username+"%");}if (!StringUtils.isNullOrEmpty(userRole)){sb.add("u.userRole=?");list.add(userRole);}PreparedStatement preparedStatement = null;HashMap<String, HashMap<Integer, Object>> hashMap=null;try {ResultSet resultSet = BaseDao.executeQuery(connection, preparedStatement, sb.toString(), list.toArray());hashMap= BaseDao.getHashMap(resultSet);BaseDao.close(resultSet,preparedStatement);} catch (SQLException e) {System.err.println("UserDaoImpl类的getUserCount方法数据库查询异常!");e.printStackTrace();}assert hashMap != null;return (long) hashMap.get("count").get(0);}/*** <p>重载方法比起上面的方法多了一个是否关闭传入的数据库的值</p>*/public long getUserCount(Connection connection, String username, String userRole,Boolean CloseConnection) {long userCount = this.getUserCount(connection, username, userRole);if (CloseConnection){BaseDao.close(connection);}return userCount;} }
UserDao
package com.tang.dao.UserDao;import com.tang.pojo.User; import java.sql.Connection; import java.util.List;public interface UserDao {//得到要登录的用户信息User getLoginUser(Connection connection,String userCode);//修改当前用户的密码int updatePwd(Connection connection,int id,String password);//查询用户总数,根据用户名或者角色进行查询long getUserCount(Connection connection,String username,int userRole);//获取用户列表List<User> getUserList(Connection connection,String username,int userRole,int currentPageNo,int PageSize);}
.UserDaoImpl
package com.tang.dao.UserDao;import com.mysql.cj.util.StringUtils;
import com.tang.dao.BaseDao;
import com.tang.pojo.User;
import com.tang.util.PageSupport;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.*;
import java.util.Date;/*** <h1>该类用于实现用户类所需要的功能</h1>*/
public class UserDaoImpl implements UserDao {/*** <h2 style="color: red">该方法用来查询数据库中的人员传入需要查找的数据库和人员id</h2>* <span style="color: red">注意:如果数据库没有这个人,则返回的user类里的内容为null,对象并不为null</span>** @param connection <span style="color: #00ff97;">需要既进入的数据库</span>* @param userCode <span style="color: #00ff97;">需要在数据库查询的人员id</span>* @return <span style="color: #00ff97;">返回查询到的用户类</span>*/@Overridepublic User getLoginUser(Connection connection, String userCode) {User user = new User();String sql = "select * from smbms_user where userCode=?";Object[] Code = {userCode};PreparedStatement preparedStatement = null;try {ResultSet resultSet = BaseDao.executeQuery(connection, preparedStatement, sql, Code);HashMap<String, HashMap<Integer, Object>> hashMap = BaseDao.getHashMap(resultSet);user.setId((Integer) hashMap.get("id").get(0));user.setUserCode((String) hashMap.get("userCode").get(0));user.setUserName((String) hashMap.get("userName").get(0));user.setUserPassword((String) hashMap.get("userPassword").get(0));user.setGender((Integer) hashMap.get("gender").get(0));user.setBirthday((Date) hashMap.get("birthday").get(0));user.setPhone((String) hashMap.get("phone").get(0));user.setAddress((String) hashMap.get("address").get(0));user.setUserRole((Integer) hashMap.get("userRole").get(0));user.setCreatedBy((Integer) hashMap.get("createdBy").get(0));user.setCreationDate((Date) hashMap.get("creationDate").get(0));user.setModifyBy((Integer) hashMap.get("modifyBy").get(0));user.setModifyDate((Date) hashMap.get("modifyDate").get(0));BaseDao.close(preparedStatement, resultSet);} catch (SQLException e) {System.err.println("UserDaoImpl类的getLoginUser方法的sql异常....");}return user;}/*** <h2 style="color: red">该方法用来修改用户的密码传入用户的id,和需要修改的新密码即可进行修改</h2>** @param connection <font style="color: #00ff97;>需要进行修改的数据库</font>* @param id <font style="color: #00ff97;>需要修改密码的用户</font>* @param password <font style="color: #00ff97;>新密码</font>* @return <font style="color: #00ff97;>返回数据库影响行数</font>*/@Overridepublic int updatePwd(Connection connection, int id, String password) {if (connection == null || id == 0 || password == null) {System.err.println("UserDaoImpl类的updatePwd方法传入的参数不能为空...");}String sql = "update smbms_user set userPassword = ? where id=?";PreparedStatement preparedStatement = null;Object[] obj = {password, id};Integer integer = null;try {integer = BaseDao.executeUpdate(connection, preparedStatement, sql, obj);BaseDao.close(connection, preparedStatement);} catch (SQLException e) {System.err.println("UserDaoImpl类的updatePwd方法的数据库修改数据异常....");}return integer;}/*** <h2 style="color: red">该方法用来进行查询用户的数量输入数据库和用户名或者用户角色进行查询</h2>** @param connection <font style="color: #00ff97;>传入需要进行查询的数据库</font>* @param username <font style="color: #00ff97;>传入需要进行查询的用户名</font>* @param userRole <font style="color: #00ff97;>传入需要进行查询的角色 </font>* @return <font style="color: #0f0;>返回查询到的数量</font>*/@Overridepublic long getUserCount(Connection connection, String username, int userRole) {if (connection == null) {System.err.println("UserDaoImpl类的getUserCount方法传入数据库不能为空!");return 0;}ArrayList<Object> list = new ArrayList<>();StringJoiner sb = new StringJoiner(" and ");sb.add("select count(1) as `count` from smbms_user u,smbms_role r where u.userRole=r.id");if (!StringUtils.isNullOrEmpty(username)) {sb.add("u.userName like ?");list.add("%" + username + "%");}if (userRole > 0) {sb.add("u.userRole=?");list.add(userRole);}PreparedStatement preparedStatement = null;HashMap<String, HashMap<Integer, Object>> hashMap = null;try {ResultSet resultSet = BaseDao.executeQuery(connection, preparedStatement, sb.toString(), list.toArray());hashMap = BaseDao.getHashMap(resultSet);BaseDao.close(resultSet, preparedStatement);} catch (SQLException e) {System.err.println("UserDaoImpl类的getUserCount方法数据库查询异常!");e.printStackTrace();}assert hashMap != null;return (long) hashMap.get("count").get(0);}/*** <p>重载方法比起上面的方法多了一个是否关闭传入的数据库的值</p>*/public long getUserCount(Connection connection, String username, int userRole, Boolean CloseConnection) {long userCount = this.getUserCount(connection, username, userRole);if (CloseConnection) {BaseDao.close(connection);}return userCount;}/*** <h1 style="color: red">该方法通过页数来查询用户信息</h1>* @param connection 需要查询的数据库* @param username 需要查询的人名* @param userRole 需要查询的角色* @param currentPageNo 在那个页码查询* @param PageSize 设置页面大小* @return 返回该页面查询的人*/@Overridepublic List<User> getUserList(Connection connection, String username, int userRole, int currentPageNo, int PageSize) {PageSupport pageSupport = new PageSupport();long userCount = this.getUserCount(connection, username, userRole);pageSupport.setTotalCount((int) userCount);pageSupport.setSizePage(PageSize);pageSupport.setCurrentPageN(currentPageNo);String sql = "select distinct * from smbms_user as u,smbms_role as r where u.userRole=r.id and u.id limit ?,?";int a = pageSupport.getCurrentStartPageId();int b = pageSupport.getCurrentEndPageId();Object[] obj = {a - 1, b};PreparedStatement properties = null;List<User> transformation = null;try {ResultSet resultSet = BaseDao.executeQuery(connection, properties, sql, obj);transformation = transformations(resultSet);} catch (SQLException | IllegalAccessException e) {e.printStackTrace();}return transformation;}//该方法用来将结果集转换为User对象private List<User> transformations(ResultSet resultSet) throws SQLException, IllegalAccessException {List<User> list = new ArrayList<>();Field[] declaredFields = User.class.getDeclaredFields();HashMap<String, Field> fieldsMap = new HashMap<>();for (Field field : declaredFields) {fieldsMap.put(field.getName(), field);}User user=null;ResultSetMetaData metaData = resultSet.getMetaData();while (resultSet.next()) {user = new User();//注意这里是从一开始的因为ResultSetMetaData是从一开始的!for (int i = 1; i <= metaData.getColumnCount(); i++) {//获取列名下标是从一开始的!!!String columnLabel = metaData.getColumnName(i);Field field = fieldsMap.get(columnLabel);if (field!=null){field.setAccessible(true);field.set(user,resultSet.getObject(columnLabel));}}list.add(user);}return list;}
}
7.UserServlet
package com.tang.servlce.user;import com.tang.pojo.User;import java.sql.Connection;
import java.util.List;public interface UserServlet {//用户登录public User login(String userCode,String userPassword);//根据id用户去修改密码public Boolean updatePwd(int id, String password);//输入用户名或者角色进行查询用户public long getUserCount(String username,int userRole);//获取页数获取用户列表List<User> getUserList(String username, int userRole, int currentPageNo, int PageSize);
}
8.UserServletImpl
package com.tang.servlce.user;import com.tang.dao.BaseDao;
import com.tang.dao.UserDao.UserDao;
import com.tang.dao.UserDao.UserDaoImpl;
import com.tang.pojo.User;import java.sql.Connection;
import java.util.List;public class UserServletImpl implements UserServlet{private final UserDao userDao;public UserServletImpl() {this.userDao=new UserDaoImpl();}/*** <h2>通过传入userCode来查询用户并返回</h2>* @param userCode 传入要查询的userCode* @param userPassword 并未判断密码* @return 返回查询的用户*/@Overridepublic User login(String userCode, String userPassword) {Connection connection = BaseDao.getConnection();//通过业务层调调用对应具体的数据库操作User user = userDao.getLoginUser(connection, userCode);BaseDao.close(connection);return user;}/*** <h2>该方法,传入用户的id,和需要更改的密码就可以更改用户的密码</h2>* @param id 更改密码用户的id* @param password 更改的新密码* @return 返回是否更改成功*/@Overridepublic Boolean updatePwd(int id, String password) {return userDao.updatePwd(BaseDao.getConnection(), id, password) > 0;}/*** <h2>该方法用来查询用户数量需要传入用户的名字或者角色</h2>* @param username <font>传入用户的名字,可以为null则查询全部的名字</font>* @param userRole <font><传入用户的角色,可以为null则查询全部的角色/font>* @return <font>返回查询的数量</font>*/@Overridepublic long getUserCount(String username, int userRole) {return new UserDaoImpl().getUserCount(BaseDao.getConnection(),username,userRole,true);}/*** <h1 style="color: red">该方法通过页数来查询用户信息</h1>* @param username 需要查询的人名* @param userRole 需要查询的角色* @param currentPageNo 在那个页码查询* @param PageSize 设置页面大小* @return 返回该页面查询的人*/@Overridepublic List<User> getUserList(String username, int userRole, int currentPageNo, int PageSize) {if (userRole>0&¤tPageNo!=0&&PageSize>0){System.err.println("UserServletImpl类的getUserList方法传入参数不对....");return null;}return userDao.getUserList(BaseDao.getConnection(),username,userRole,currentPageNo,PageSize);}}
获取角色
1.UserDao
//获取角色列表List<Role> getRoleList(Connection connection) throws SQLException, IllegalAccessException;
2.UserDaoImpl
/*** <h2 style="color: red">该方法通过传入数据库来获取角色对象</h2>* @param connection 获取数据库链接* @return 返回对象Role的list集合* @throws SQLException 抛出sql语句异常*/@Overridepublic List<Role> getRoleList(Connection connection) throws SQLException, IllegalAccessException {String sql="select * from smbms_role";PreparedStatement preparedStatement=null;ResultSet resultSet=null;try {resultSet = BaseDao.executeQuery(connection,preparedStatement,sql,null);} catch (SQLException e) {System.err.println("UserDaoImpl的getRoleList方法数据库查询有误....");}List<Role> transformationsRole = getTransformationsRole(resultSet);BaseDao.close(preparedStatement,resultSet);return transformationsRole;}//该方法用来将结果集转换为Role对象private List<Role> getTransformationsRole(ResultSet resultSet) throws SQLException, IllegalAccessException {List<Role> roles = new ArrayList<>();Field[] declaredFields = Role.class.getDeclaredFields();HashMap<String, Field> stringFieldHashMap = new HashMap<>();for (Field declaredField : declaredFields) {stringFieldHashMap.put(declaredField.getName(),declaredField);}while (resultSet.next()) {Role role = new Role();for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) {String columnName = resultSet.getMetaData().getColumnName(i);Field field = stringFieldHashMap.get(columnName);if (field!=null){field.setAccessible(true);field.set(role,resultSet.getObject(columnName));}}roles.add(role);}return roles;}
3.UserServlce
//获取角色列表List<Role> getRoleList() throws SQLException, IllegalAccessException;
4.UserServlceImpl
/*** <h1 style="color: red">该方法用来获取角色列表</h1>** @return 返回一个包含角色的List*/@Overridepublic List<Role> getRoleList() throws SQLException, IllegalAccessException {return userDao.getRoleList(BaseDao.getConnection());}
狂神Smbms(javaWeb超市订单管理系统)实现相关推荐
- JavaWeb项目smbms超市订单管理系统
项目简介 smbms超市订单管理系统,主要用于用户管理.订单管理.供应商管理等功能,是学习JavaWeb练习的一个小项目 这个博客只讲了部分功能(用户登录界面,和密码修改界面),以及用户管理的实现. ...
- SMBMS 超市订单管理系统
SMBMS 超市订单管理系统 文章目录 前言 SMBMS 超市订单管理系统 项目搭建准备工作 1. smbms项目搭建 0.数据库: 1.搭建一个mavenWeb项目 2.配置Tomcat 3.测试项 ...
- ❤️JavaWeb《超市订单管理系统—了解底层原理》(建议收藏)❤️
SMBMS 图示 登录界面 主界面 订单管理页面 添加订单页面 供应商管理页面 供应商添加页面 用户管理页面 用户添加页面 修改密码页面 - 系统功能结构图: 数据库结构: 1.项目搭建前期准备 1. ...
- SMBMS超市订单管理系统
文章目录 MVC三层架构(代码整体以此分层编写) 基本架构 项目搭建准备工作 1- 4 5 创建项目包结构 6-7 8 导致静态资源 登录功能实现 1.编写前端页面 2.设置首页 3.编写Dao层用户 ...
- 【Django】第一课 基于Django超市订单管理系统开发
概念 django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架,采用的是MTV架构模式进行分层架构. 项目搭建 打开pycharm开发软件,打开开发软件的内置dos窗口操作命 ...
- 开源项目-超市订单管理系统
哈喽,大家好,今天给大家带来的开源系统是-超市订单管理系统 系统主要包括订单管理,供应商管理,用户管理等模块 系统登录 订单管理 供应商管理 用户管理 以上就是该系统的大致内容了,感兴趣的同学可以下载 ...
- xdm俺来了、详解超市订单管理系统SSM版本
演示视频 超市订单管理系统SSM版本 声名:此系统修改了一些原来的页面内容,以及修补之前项目不足的地方- 另外新添了一个 根据时间 计算 早上 中午 下午 晚上的demo 记录在右上角 另外优化了一个 ...
- 基于SSM框架+MySQL的超市订单管理系统【源码+文档+PPT】
目录 1.系统需求分析 1.1 系统功能分析 1.2 系统功能需求 1.3 系统性能需求 2.数据库设计 2.1 数据库需求分析 3.数据库物理结构设计 4.各功能模块的设计与实现 4.1 开发框架 ...
- [附源码]java毕业设计超市订单管理系统
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
最新文章
- Win10网页打不开提示DNS_PROBE_POSSIBLE错误解决
- Machine Learning week 9 quiz: programming assignment-Anomaly Detection and Recommender Systems
- python基础教程:对象之间的交互
- 2108889队2021年数学建模美赛C题花絮视频!
- synchronized和ReentrantLock区别,用新的lock有什么好处?举例说说
- 认识计算机硬件实验项目,实验1 认识计算机的硬件与硬件组装
- 再不懂ZooKeeper,就安安心心把这篇文章看完
- epoll实现socket通信
- pthon-递归实战-操作文件
- C语言手写模拟字符串String类
- 华为云NP考试题库_华为np题库
- [cf] Codeforces Round #595 (Div. 3) B12 Books Exchange
- php发送邮件email
- CHI论文阅读(1)EmoGlass: an End-to-End AI-Enabled Wearable Platform for Enhancing Self-Awareness of Emoti
- Focal loss 和 GHM
- Centos7.9+mysql8.0开启指定IP远程连接数据库
- 女人,你真的懂自己吗:女生空间QQ情感日志
- 通过U盘的HDD启动安装原版Win7系统教程-Win7安装版
- Spring Data JPA 原理与实战第十一天 Session相关、CompletableFuture、LazyInitializationException
- linux反序排列文件,关于linux vim命令 总结