狂神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

项目搭建准备工作

  1. 搭建一个maven web项目
  2. 配置Tomcat
  3. 测试项目是否能够跑起来
  4. 导入项目中会遇到的jar包 如:jsp,Servlet,mysql驱动
  5. 创建项目包结构                                                                                                                           
  6. 编写实体类                                                                                                                                ORM映射:表--类映射                                                                                                                 
    package com.tang.pojo;
    
    import java.util.Calendar;
    
    /**
     * <h2>用户类</h2>
     */
    public class User {
        private Integer id;//用户id
        private 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;//id
        private 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;//id
        private 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;//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 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;
        }
    }
    

  7. 编写基础公共类
    1. 数据库配置文件                                                                                                                 
    2. 编写数据库的公共类:                                                                                                            
      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               &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;<font style="color: #0ff">传入执行的sql语句</font>
           * @param parameter         &ensp;<font style="color: #0ff">传入执行sql语句中问号的值的数组,如果没有问号则可以为null</font>
           * @param preparedStatement <font style="color: #0ff">用来接收结果集的对象</font>
           * @return &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;  <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开始的所以这里+1
                      preparedStatement.setObject(i + 1, parameter[i]);
                  }
              }
              return preparedStatement.executeQuery();
          }
      
          /**
           * <h2 style="color: red">该方法用来向数据库修改增加或删除数据</h2>
           *
           * @param connection        <font style="color: #0ff">传入数据库链接</font>
           * @param sql               &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;<font style="color: #0ff">传入执行的sql语句</font>
           * @param parameter         &ensp;<font style="color: #0ff">传入执行sql语句中问号的值的数组,如果没有问好则可以为null</font>
           * @param preparedStatement <font style="color: #0ff">用来接收结果集的对象</font>
           * @return &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;  <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开始的所以这里+1
                      preparedStatement.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;
          }
      
      }
      
    3. 编写字符编码过滤器                                                                                                        
      package com.tang.filter;
      
      import jakarta.servlet.*;
      
      import java.io.IOException;
      
      public class CharacterEncodingFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
      
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              //设置字符编码
              servletRequest.setCharacterEncoding("utf-8");
              servletResponse.setCharacterEncoding("utf-8");
              filterChain.doFilter(servletRequest,servletResponse);
          }
      
          @Override
          public 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>
                                       
  8. 导入静态资源

 狂神smbms的静态资源_爱学习的象哥的博客-CSDN博客

超市订单管理

登录功能实现

  1.  编写前端页面

  2. 设置首页                                                                                                                                      

        <!-- 设置欢迎页面 -->
        <welcome-file-list>
            <!-- 此页面设置完成之后则不会启动时进入index.jsp页面了会优先进入此页面 -->
            <welcome-file>/ChaoShi/login.jsp</welcome-file>
        </welcome-file-list>
  3. 编写dao登录用户登录的接口                                                                                                     

    package com.tang.dao.User;
    
    import com.tang.pojo.User;
    import java.sql.Connection;
    
    public interface UserDao {
        //得到要登录的用户信息
        User getLoginUser(Connection connection,String userCode);
    }
    
  4. 编写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 {
    
        @Override
        public 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;
        }
    }
    
  5. 业务层接口                                                                                                                                 

    package com.tang.servlet.user;
    
    import com.tang.pojo.User;
    
    public interface UserServlet {
        //用户登录
        public User login(String userCode,String userPassword);
    }
    
  6. 业务层实现类                                                                                                                             

    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();
        }
    
        @Override
        public 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");
        }
    }
    
  7. 编写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 {
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    
        @Override
        protected 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);
            }
    
        }
    }
    
  8. 注册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>
                        
  9. 测试访问确保以上功能成功                                                                                                                                                                              

登录功能优化 

注销功能:

思路:移除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 {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    @Override
    protected 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 {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public 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);
    }

    @Override
    public 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

密码修改功能

  1.  导入前端素材                                                                                                                             
    <li><a href="${pageContext.request.contextPath }/jsp/pwdmodify.jsp">密码修改</a></li>
       
  2. 写项目建议从底层向上写                                                                                                           
  3. 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);
    }
    
  4.  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>
         */
        @Override
        public 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>
         */
        @Override
        public 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;
        }
    }
    
           
  5. 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);
    }
    
  6. 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  返回查询的用户
         */
        @Override
        public 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 返回是否更改成功
         */
        @Override
        public Boolean updatePwd(int id, String password) {
            return userDao.updatePwd(BaseDao.getConnection(), id, password) > 0;
        }
    }
    
  7. 实现复用需要提取出方法!                                                                                                           
    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 {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
        }
    
        @Override
        protected 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 {
            //获取id
            Object 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","密码修改成功,请重新登录...");
                    //修改成功移除Session
                    request.getSession().removeAttribute(Constants.USER_SESSION);
                }else {
                    //修改失败
                    request.setAttribute("message","密码修改失败...");
                }
            }else {
                request.setAttribute("message","新密码修改有误...");
            }
            request.getRequestDispatcher("/ChaoShi/jsp/pwdmodify.jsp").forward(request,response);
        }
    }
    
  8. 注册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>
  9. 测试              

优化密码修改使用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 {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    @Override
    protected 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 {
        //获取id
        Object 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","密码修改成功,请重新登录...");
                //修改成功移除Session
                request.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.获取用户数量

  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);
    }
    
  2. 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>
         */
        @Override
        public 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>
         */
        @Override
        public 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>
         */
        @Override
        public 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;
        }
    }
    
  3. 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);
    }
    
  4. 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>
         */
        @Override
        public 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>
         */
        @Override
        public 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>
         */
        @Override
        public 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;
        }
    }
    
  5. 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);
    
    }
    
  6. .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>
     */
    @Override
    public 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>
     */
    @Override
    public 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>
     */
    @Override
    public 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 返回该页面查询的人
     */
    @Override
    public 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  返回查询的用户
     */
    @Override
    public 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 返回是否更改成功
     */
    @Override
    public 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>
     */
    @Override
    public 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 返回该页面查询的人
     */
    @Override
    public List<User> getUserList(String username, int userRole, int currentPageNo, int PageSize) {
        if (userRole>0&&currentPageNo!=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语句异常
     */
    @Override
    public 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
     */
    @Override
    public List<Role> getRoleList() throws SQLException, IllegalAccessException {
        return userDao.getRoleList(BaseDao.getConnection());
    }

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

123小步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值