使用idea---操作数据库与tomcat的实战练习———— SMBMS项目

SMBMS

项目搭建准备工作

1.项目架构

在这里插入图片描述
在这里插入图片描述

2.数据库设计

在这里插入图片描述
在这里插入图片描述

3.项目搭建

1、项目如何搭建?
  • 是否使用maven?

    • 使用maven要去网上找依赖
    • 不使用maven要自己手动导jar包

    为了方便,这个项目使用maven搭建

2、创建项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 补全maven项目结构

在这里插入图片描述

  1. 更新WEB.XML的配置版本
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
</web-app>
  1. 清理pom.xml

    只需要保留GAV+项目的打包方式即可

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.thhh</groupId>
  <artifactId>smbms</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

</project>

3、配置Tomcat
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、测试项目是否搭建完成

在这里插入图片描述
在这里插入图片描述

5、导入依赖

用什么导入什么,不一定要一次性全部导入
  <dependencies>
    <!--servlet依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <!--JSP依赖-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2.1-b03</version>
    </dependency>
    <!--数据库连接依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>
    <!--JSTL标签-->
    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl-api</artifactId>
      <version>1.2</version>
    </dependency>
    <!--JSTL标签的依赖-->
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
  </dependencies>

6、创建项目包结构

  • 首先创建一个总的包,命名"com.公司名"
    在这里插入图片描述

  • 在创建这个项目会使用的包
    在这里插入图片描述

7、创建实体类/JavaBean/ORM映射

数据库中有5张表,但是地址表没有什么用处,所以我们暂时不创建地址表对用的实体类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OnV82GEu-1626251512221)(SMBMS.assets/1747479-20200908233229281-1248921664.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nDgAEqyf-1626251512222)(SMBMS.assets/1747479-20200908233243766-127564630.png)]

8、编写数据库操作的基础公共类BaseDao

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 数据库配置文件,这是一个资源文件,应该创建在maven项目的resources文件中
  • 在这里插入图片描述
  • 在这里插入图片描述
DRIVER=com.mysql.jdbc.Driver
URL=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8
USERNAME=root
PASSWORD=123

在这里插入图片描述

  • 使用静态代码块实现初始化参数
private static String DRIVER;
private static String URL;
private static String USERNAME;
private static String PASSWORD;

static {//静态代码块,在调用这个类的地方优先自动执行
    //读取配置文件
    //1、创建properties对象
    Properties properties = new Properties();
    //2、通过类加载器加载资源文件为字节输入流
    InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
    try {
        properties.load(in);
    } catch (IOException e) {
        e.printStackTrace();
    }
    DRIVER = properties.getProperty("DRIVER");
    URL = properties.getProperty("URL");
    USERNAME = properties.getProperty("USERNAME");
    PASSWORD = properties.getProperty("PASSWORD");
}
  • 编写数据库操作的公共方法
package com.thhh.dao;
/**
 * 注意理解这个类中的方法之所以要传入这些数据库操纵对象是因为为了统一的关闭资源
 * 而传入的对象中可以都是null,具体的对象获取在方法里面进行;也可以只有conn实例化,其他对象的实例化同样放在具体的方法里进行
 */

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

//操作数据库的公共类
public class BaseDao {
    private static String DRIVER;
    private static String URL;
    private static String USERNAME;
    private static String PASSWORD;

    //静态代码块用于初始化JDBC4大参数,且静态代码块只会在第一次调用这个类的时候执行一次
    static {//静态代码块,在调用这个类的地方优先自动执行
        //读取配置文件
        //1、创建properties对象
        Properties properties = new Properties();
        //2、通过类加载器加载资源文件为字节输入流
        InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
        try {
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        DRIVER = properties.getProperty("DRIVER");
        URL = properties.getProperty("URL");
        USERNAME = properties.getProperty("USERNAME");
        PASSWORD = properties.getProperty("PASSWORD");
    }

    //1、编写获取数据库的连接对象的公共方法
    public static Connection getConnection(){
        Connection conn= null;
        try {
            //1、加载驱动类
            Class.forName(DRIVER);
            //2、获取连接对象
            conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return conn;
    }

    //2、编写查询公共方法 —— 注意查询的结果返回为ResultSet结果集
    /**
     * 用于查询数据的公共方法,注意:使用发送SQL语句的对象为PreparedStatement
     * @param sql:查询的sql语句,由前端传递
     * @param params:sql语句中占位符的值
     *
     *===============这下面的3个参数之所以在调用的时候传递原因就在于这3个都是资源,我们需要关闭,如果我们直接在这个方法里获取资源对象的话,那么我们就应该在这个方法中关闭资源===============
     *===============但是调用处还在等待这个方法返回结果集,所以我们不应该在这个地方获取这3个对象,而应该由调用出传递,这样可以统一管理和关闭资源===============
     *
     * @param conn:调用出使用BaseDao.getConnection()获取到数据库连接对象传入
     * @param pstmt:调用出只是传入null的引用。这个对象真正的实例化放在这个方法里面
     * @param rs:返回的结果集,和pstmt只是传入null的引用。这个对象真正的实例化放在这个方法里面
     *
     * @return:返回查询到的结果集
     */
    public static ResultSet executeQuery(String sql,Object[] params,Connection conn,PreparedStatement pstmt,ResultSet rs){
        try {
            pstmt = conn.prepareStatement(sql);
            for (int i=1;i<= params.length;i++){//循环遍历参数数组,并将参数设入SQL中
                pstmt.setObject(i,params[i-1]);//注意:数组的index从0开始,而PreparedStatement中设置占位符的值的index从1开始
            }
            rs = pstmt.executeQuery();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return  rs;
    }

    //3、编写修改公共方法
    /**
     * 用于修改数据的公共方法,注意:使用发送SQL语句的对象为PreparedStatement
     * @param sql:修改数据的sql语句模板
     * @param params:模板中占位符对应的值
     *
     * =====下面两个对象需要调用出传入也是为了统一管理和关闭资源=====
     * @param conn:调用出使用BaseDao.getConnection()获取到数据库连接对象传入
     * @param pstmt:调用出只是传入null的引用。这个对象真正的实例化放在这个方法里面
     *
     * @return 返回受影响的行数
     */
    public static int executeUpdate(String sql,Object[] params,Connection conn,PreparedStatement pstmt){
        int result = 0;
        try {
            pstmt = conn.prepareStatement(sql);
            for (int i=1;i< params.length;i++){//循环遍历参数数组,并将参数设入SQL中
                pstmt.setObject(i,params[i-1]);//注意:数组的index从0开始,而PreparedStatement中设置占位符的值的index从1开始
            }
            result = pstmt.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return  result;
    }

    //4、编写关闭资源公共方法
    /**
     * 关闭资源
     * @param conn:调用出使用BaseDao.getConnection()获取到数据库连接对象传入
     * @param pstmt:调用出只是传入null的引用。这个对象真正的实例化放在这个方法里面
     * @param rs:返回的结果集,和pstmt只是传入null的引用。这个对象真正的实例化放在这个方法里面
     * @return:返回关闭资源的结果
     *
     * 注意:关闭资源的时候要倒着关
     */
    public static boolean close(Connection conn,PreparedStatement pstmt,ResultSet rs){
        boolean flag = true;
        if (rs!=null){
            try {
                rs.close();
                rs = null;//让这个变量为null,gc就会自动对其进行回收
            } catch (SQLException throwables) {
                throwables.printStackTrace();
                flag = false;//关闭失败就将flag设置false
            }
        }
        if (pstmt!=null){
            try {
                pstmt.close();
                pstmt = null;
            } catch (SQLException throwables) {
                throwables.printStackTrace();
                flag = false;
            }
        }
        if (conn!=null){
            try {
                conn.close();
                conn = null;
            } catch (SQLException throwables) {
                throwables.printStackTrace();
                flag = false;
            }
        }
        return flag;//返回关闭结果
    }
}

9、编写字符编码过滤器

//编写过滤器

package com.thhh.filter;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncoding implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        chain.doFilter(request,response);
    }

    public void destroy() {

    }
}
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
    <!--注册字符编码过滤器-->
    <filter>
        <filter-name>CharacterEncoding</filter-name>
        <filter-class>com.thhh.filter.CharacterEncoding</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

10、导入静态资源

包括HTML、CSS、JS等,注意:这些资源都是网站的,所以我们应该将这些资源放在webapp下面

在这里插入图片描述

通过以上的步骤,一个WEB项目的搭建工作就算基本完成了

BaseDao总结

package com.wang.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class BaseDao {
    public static String driver;
    public static String url;
    public static String username;
    public static String password;
    //静态代码块 类加载的时候 完成初始化
    static {			
        Properties properties = new Properties();
        //通过类加载器 读取流中的数据
        InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");

        try {
            //将这个流加载到 properties中
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //通过properties来获得数据
         driver = properties.getProperty("driver");
         url = properties.getProperty("url");
         username = properties.getProperty("username");
         password = properties.getProperty("password");
    }

    //获得数据库的连接
    public static Connection getConnection(){
        Connection connection = null;
        try {
            //加载驱动
            Class.forName(driver);
            //连接数据库
            connection = DriverManager.getConnection(url,username,password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

    //jdbc查询公共方法
    public static ResultSet execute(Connection connection,ResultSet resultSet,PreparedStatement preparedStatement,String sql,Object[] params) {
        //预编译
        try {
            preparedStatement = connection.prepareStatement(sql);
            //Object[] params 为传递进来的参数
            for (int i = 0; i < params.length; i++) {//循环遍历参数数组,并将参数设入SQL中
                preparedStatement.setObject(i+1,params[i]);//注意:数组的index从0开始,而PreparedStatement中设置占位符的值的index从1开始
            }
            resultSet = preparedStatement.executeQuery();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return resultSet;
    }

    //jdbc删改公共方法
    public static int execute(Connection connection,PreparedStatement preparedStatement,String sql,Object[] params) {
        //预编译
        int updateRows = 0;
        try {
            preparedStatement = connection.prepareStatement(sql);

            for (int i = 0; i < params.length; i++) {//循环遍历参数数组,并将参数设入SQL中
                preparedStatement.setObject(i+1,params[i]);//注意:数组的index从0开始,而PreparedStatement中设置占位符的值的index从1开始
            }

            updateRows = preparedStatement.executeUpdate();


        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return updateRows;
    }

    public static Boolean closeResource(Connection connection,ResultSet resultSet,PreparedStatement preparedStatement){
        Boolean flag = true;

        if(connection!=null){
            try {
                connection.close();
                //GC回收
                connection = null;
            } catch (SQLException throwables) {
                throwables.printStackTrace();
                flag = false;
            }
        }
        if(resultSet!=null){
            try {
                resultSet.close();
                //GC回收
                resultSet = null;
            } catch (SQLException throwables) {
                throwables.printStackTrace();
                flag = false;
            }
        }
        if(preparedStatement!=null){
            try {
                preparedStatement.close();
                //GC回收
                preparedStatement = null;
            } catch (SQLException throwables) {
                throwables.printStackTrace();
                flag = false;
            }
        }
        return flag;
    }
}

db.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?useSSL=true&useUnicode=true&characterEncoding=utf-8
username=root
password=123456

登录功能实现

在这里插入图片描述

1.编写前端页面

2.设置首页

<!--    设置欢迎首页-->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
   

3.编写dao层得到登录用户登录的接口

package com.wang.dao.user;

import com.wang.pojo.User;

import java.sql.Connection;
import java.sql.SQLException;

public interface UserDao {
    //从数据库中获取登录用户的信息
    public User getLoginUser(Connection connection, String userCode) throws SQLException;
}

4.编写dao接口的实现类

package com.wang.dao.user;

import com.wang.dao.BaseDao;
import com.wang.pojo.User;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDaoImpl implements UserDao{
    @Override
    public User getLoginUser(Connection connection, String userCode) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pstm = null;
        User user = null;


        if (connection!=null){
            String sql = "select * from smbms_user where userCode=?";
            Object[] params = {userCode};

            //我们要使用之前 重写的方法,就需要 按照重写的方法来给参数
            rs = BaseDao.execute(connection, rs, pstm, sql, params);

            if (rs.next()){
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUserCode(rs.getString("userCode"));
                user.setUserName(rs.getString("userName"));
                user.setUserPassword(rs.getString("userPassword"));
                user.setGender(rs.getInt("gender"));
                user.setBirthday(rs.getDate("birthday"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                user.setUserRole(rs.getInt("userRole"));
                user.setCreatedBy(rs.getInt("createdBy"));
                user.setCreationDate(rs.getTimestamp("creationDate"));
                user.setModifyBy(rs.getInt("modifyBy"));
                user.setModifyDate(rs.getTimestamp("modifyDate"));

            }
            BaseDao.closeResource(null,rs,pstm);
        }
        return user;
    }
}

5.业务层接口

package com.wang.service.user;

import com.wang.pojo.User;

public interface UserService {
    public User login(String userCode,String password);
}

6.业务层实现类

package com.wang.service.user;

import com.wang.dao.BaseDao;
import com.wang.dao.user.UserDao;
import com.wang.dao.user.UserDaoImpl;
import com.wang.pojo.User;
import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLException;

public class UserServiceImpl implements UserService{
    //业务层需要调用dao 层的方法,所以需要引入dao
    private UserDao userDao;
    public UserServiceImpl(){
        userDao = new UserDaoImpl();
    }
    @Override
    public User login(String userCode, String password) {
        Connection connection = null;
        User user = null;

        try {
            connection = BaseDao.getConnection();
            //调用的具体方法
            user = userDao.getLoginUser(connection,userCode);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            BaseDao.closeResource(connection,null,null);
        }
        return user;
    }

@Test
    public void test(){
    UserServiceImpl userService = new UserServiceImpl();
    User admin = userService.login("admin", "1234567");
    System.out.println(admin.getUserPassword());
}
}

7.编写servlet

package com.wang.servlet.user;

import com.wang.pojo.User;
import com.wang.service.user.UserServiceImpl;
import com.wang.util.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("LoginServlet---start");
        String userCode = req.getParameter("userCode");
        String userPassword = req.getParameter("userPassword");

        //需要调用service的实现类
        UserServiceImpl userService = new UserServiceImpl();

        User user = userService.login(userCode, userPassword);

        if (user!=null){

            req.getSession().setAttribute(Constants.USER_SESSION,user);
            resp.sendRedirect("/smbms/jsp/frame.jsp");
        }else{
            req.setAttribute("error","用户名或密码不正确");
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

8.注册servlet

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.wang.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.wang.servlet.user;

import com.wang.util.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginOutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //用户名 与密码注销,即将session给移除即可
        req.getSession().removeAttribute(Constants.USER_SESSION);
        resp.sendRedirect(req.getContextPath()+"/login.jsp");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

注册xml

<servlet>
    <servlet-name>LoginOutServlet</servlet-name>
    <servlet-class>com.wang.servlet.user.LoginOutServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginOutServlet</servlet-name>
    <url-pattern>/jsp/logout.do</url-pattern>
</servlet-mapping>

登录拦截优化

编写一个过滤器,并注册

package com.wang.filter;

import com.wang.pojo.User;
import com.wang.util.Constants;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.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;

        //过滤器,从session中获取
        User user = (User) request.getSession().getAttribute(Constants.USER_SESSION);
        if (user==null){
            response.sendRedirect("/smbms/error.jsp");
        }else {
            filterChain.doFilter(request,response);
        }
    }

    @Override
    public void destroy() {

    }
}
   <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.wang.filter.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <url-pattern>/jsp/*</url-pattern>
    </filter-mapping>

密码修改

1.导入前端素材

<li><a href="${pageContext.request.contextPath }/jsp/pwdmodify.jsp">密码修改</a></li>

2.写项目建议从底层向上写
在这里插入图片描述

3.Dao基础设置(在项目准备的时候已经封装好了,直接调用即可)(获得properties资源 连接数据库 操作数据库增删改查)的基础代码封装

4.UserDao接口( 面向对象编程 针对user的数据库操作)

//修改当前用户的密码
public int updatePwd(Connection connection,int id,int password) throws SQLException;

5.UserDao接口实现类(具体实现)

//修改当前用户的密码
@Override
public int updatePwd(Connection connection, int id, int password) throws SQLException {
    PreparedStatement patm = null;
    int execute = 0;
    if (connection!=null){
        String sql = "update smbms_user set userPassword=? where id = ?";
        Object parma[] = {id,password};

        execute = BaseDao.execute(connection, patm, sql, parma);
        BaseDao.closeResource(null,null,patm);
    }
    return execute;
}

6.UserService层

//密码修改
public Boolean updatePwd(String userCode,String userPassword);

7.UserService实现类

@Override
public Boolean updatePwd(String userCode,String userPassword) {
    Boolean flag = false;
    Connection connection = null;

    try {
        connection = BaseDao.getConnection();
        if (userDao.updatePwd(connection,userCode,userPassword)>0){
            flag = true;
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        BaseDao.closeResource(connection,null,null);
    }
    return flag;
}

8.servlet层 记得实现复用,需要提取出方法

package com.wang.servlet.user;

import com.wang.pojo.User;
import com.wang.service.user.UserServiceImpl;
import com.wang.util.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");
        if("savepwd".equals(method)){
            updatePwd(req,resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }


    public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
        //从session中拿到 值
        Object o = req.getSession().getAttribute(Constants.USER_SESSION);
        //从前端拿到新的密码
        String newpassword = req.getParameter("newpassword");

        Boolean flag = false;

        if (o!=null && newpassword!= null ){

            System.out.println(flag);

            UserServiceImpl userService = new UserServiceImpl();

            flag = userService.updatePwd(newpassword,((User)o).getUserCode());

            if (flag){

                System.out.println(flag);

                req.setAttribute("message","密码修改成功! 请退出重新登录!");
                req.getSession().removeAttribute(Constants.USER_SESSION);
            }else {
                req.setAttribute("message","密码修改失败!");

            }
        }else {
            req.setAttribute("message","新密码设置有错误!");
        }
        try {
            req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

9.测试;

优化密码修改使用Ajax;

1.阿里巴巴的fastjson

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>

用户管理实现

思路:

在这里插入图片描述

1.导入分页的工具类

2.用户列表页面导入

userlist.jsp导入

1、获取用户数量

1.UserDao

//根据用户名或角色来查询用户总数
public int getUserCount(Connection connection,String username,int userRole) throws SQLException;

2.UserDaolmpl

//根据用户名或角色来查询用户总数{该项目中最难理解的SQL}
@Override
public int getUserCount(Connection connection, String username, int userRole) throws SQLException {

    ResultSet rs = null;
    PreparedStatement pstm = null;
    int count = 0;


    if (connection!=null){//如果没有username 与 userRole 则默认查询全部的count人数,并查出具体表单来
        StringBuffer sql = new StringBuffer("select count(1) as count from smbms_user u,smbms_role r where u.userRole = r.id");
        ArrayList<Object> list = new ArrayList<Object>();//用来存放传递来的参数

        if (!StringUtils.isNullOrEmpty(username)){//按姓名查询的那个接口
            sql.append(" and u.userName like ?");
            list.add("%"+username+"%");//index: 0
        }
        if (userRole>0){//按职责查询的那个接口
            sql.append(" and u.userRole = ?");
            //index: 1
            list.add(userRole);//因为userRole是int 类型 故可以不添加%  % 来进行模糊定义
        }

        //将list转化为数组
        Object[] params = list.toArray();
        //在这里输出完整的sql语句,便于分析 检查
        System.out.println("UserDaoImpl-->getUserCount:sql"+sql.toString());

        //调用BaseDao的方法查询
       rs = BaseDao.execute(connection, rs, pstm, sql.toString(), params);

       if (rs.next()){
           count = rs.getInt("count");//从结果集中获得总数的数量
       }
       BaseDao.closeResource(null,rs,pstm);
    }
    return count;
}

3.UserService

//查询记录数
public int getUserCount(String username,int userRole);

4.UserServicelmpl

@Override
public int getUserCount(String username, int userRole) {
    Connection connection =null;
    int count = 0;
    try {
        connection = BaseDao.getConnection();
        count = userDao.getUserCount(connection, username, userRole);
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        BaseDao.closeResource(connection,null,null);
    }
    return count;
}


@Test
public void test(){
    UserServiceImpl userService = new UserServiceImpl();
    int userCount = userService.getUserCount(null, 0);
    System.out.println(userCount);
}

2、获取用户列表

1.UserDao

//通过条件查询-userList
public List<User> getUserList(Connection connection,String userName,int userRole,int currenPageNo,int pageSize) throws SQLException;

2.UserDaolmpl

//通过条件查询-userList
@Override
public List<User> getUserList(Connection connection, String userName, int userRole, int currenPageNo, int pageSize) throws SQLException {
    PreparedStatement pstm = null;
    ResultSet rs = null;
    ArrayList<User> userList = new ArrayList<User>();
    if (connection!=null){
        StringBuffer sql = new StringBuffer();
        sql.append("select  u.* ,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole = r.id");
        ArrayList<Object> list = new ArrayList<Object>();
        if (!StringUtils.isNullOrEmpty(userName)){
            sql.append(" and u.userName like ?");
            list.add("%"+userName+"%");
        }
        if (userRole>0){
            sql.append(" and u.userRole = ?");
            list.add(userRole);
        }
        sql.append(" order by creationDate DESC limit ?,?");
        currenPageNo = (currenPageNo-1)*pageSize;
        list.add(currenPageNo);
        list.add(pageSize);

        Object[] params = list.toArray();
        System.out.println("sql----->"+sql.toString());
        rs = BaseDao.execute(connection,rs,pstm,sql.toString(),params);

        while (rs.next()){
            User _user = new User();
            _user.setId(rs.getInt("id"));
            _user.setUserCode(rs.getString("userCode"));
            _user.setUserName(rs.getString("userName"));
            _user.setGender(rs.getInt("gender"));
            _user.setBirthday(rs.getDate("birthday"));
            _user.setPhone(rs.getString("phone"));
            _user.setUserRole(rs.getInt("userRole"));
            _user.setUserRoleName(rs.getString("userRoleName"));
            userList.add(_user);
        }
        BaseDao.closeResource(null,rs,pstm);
    }
    return userList;
}

3.UserService

//根据条件查询用户列表
public List<User> getUserList(String queryUserName,int queryUserRole,int currentPageNo,int pageSize);

4.UserServicelmpl

//根据条件查询用户列表
@Override
public List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize) {
    Connection connection = null;
    List<User> userList = null;

    System.out.println("queryUserName--"+queryUserName);
    System.out.println("queryUserRole--"+queryUserRole);
    System.out.println("currentPageNo--"+currentPageNo);
    System.out.println("pageSize--"+pageSize);


    connection = BaseDao.getConnection();
    try {
        userList = userDao.getUserList(connection, queryUserName, queryUserRole, currentPageNo, pageSize);
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        BaseDao.closeResource(connection,null,null);
    }
    return userList;
}

3、获取角色操作

为了我们职责统一,可以吧角色的操作单独放在一个包中,和POJO类对应

RoleDao

//获取角色列表
public List<Role> getRoleList(Connection connection) throws SQLException;

RoleDaoImpl

package com.wang.dao.role;

import com.wang.dao.BaseDao;
import com.wang.pojo.Role;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class RoleDaoImpl implements RoleDao{
    //获取角色列表
    @Override
    public List<Role> getRoleList(Connection connection) throws SQLException {
        PreparedStatement pstm = null;
        ResultSet resultSet = null;
        ArrayList<Role> roleList = new ArrayList<Role>();

        if (connection!=null){
            String sql = "select * from smbms_role";
            Object[] params = {};
            resultSet = BaseDao.execute(connection, resultSet, pstm, sql, params);

            while (resultSet.next()){
                Role role = new Role();
                role.setId(resultSet.getInt("id"));
                role.setRoleCode(resultSet.getString("roleCode"));
                role.setRoleName(resultSet.getString("roleName"));
                roleList.add(role);
            }
            BaseDao.closeResource(null,resultSet,pstm);
        }
        return roleList;
    }
}

RoleService

    //获取角色列表
public List<Role> getRoleList();

RoleServiceImpl

public class RoleServiceImpl implements RoleService{
    //引入dao
    private RoleDao roleDao;

    public RoleServiceImpl() {
        roleDao = new RoleDaoImpl();
    }
    //获取角色列表
    @Override
    public List<Role> getRoleList() {
        Connection connection = null;
        List<Role> roleList = null;

        connection = BaseDao.getConnection();
        try {
            roleList = roleDao.getRoleList(connection);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return roleList;
    }
}

4、用户显示的Servlet

1.获取用户前端的数据(查询)

2判断请求是否需要执行,看参数的值判断

3.为了实现分页,需要计算出当前页面和总页面,页面大小…

4.用户列表展示

5.返回前端

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String method = req.getParameter("method");
    if ("savepwd".equals(method) && method != null) {//新密码修改
        updatePwd(req, resp);
    } else if ("pwdmodify".equals(method) && method != null){//对旧密码的验证
        this.pwdModify(req, resp);
    } else if (("query").equals(method) && method!=null){
        this.query(req,resp);
    }
}
//联表查询 重点 难点 必须自从头到尾的整理清楚
public void query(HttpServletRequest req, HttpServletResponse resp){
    //查询用户列表

    //从前端获取数据
    String queryUserName = req.getParameter("queryname");
    String temp = req.getParameter("queryUserRole");
    String pageIndex = req.getParameter("pageIndex");
    int queryUserRole = 0;

    //获取用户列表
    UserServiceImpl userService = new UserServiceImpl();
    List<User> userList = null;

    //第一次走这个请求时,一定是第一页,页面大小是固定的;
    int pageSize = 5;//可以把这些到配置文件中,方便后期修改;
    int currentPageNo = 1;

    if (queryUserName == null){
        queryUserName = "";
    }
    if (temp!=null && !temp.equals("")){
        queryUserRole = Integer.parseInt(temp);//给查询赋值!0,1,2,3
    }
    if (pageIndex!=null){
        currentPageNo = Integer.parseInt(pageIndex);
    }

    //获取用户的总页数(分页:上一页,下一页的情况)
    int totalCount = userService.getUserCount(queryUserName, queryUserRole);
    //总页数支持
    PageSupport pageSupport = new PageSupport();
    pageSupport.setCurrentPageNo(currentPageNo);
    pageSupport.setPageSize(pageSize);
    pageSupport.setTotalCount(totalCount);

    int totalPageCount = ((int)(totalCount/pageSize))+1;


    //控制首页和尾页
    //如果页面要小于1了,就显示第一页的东西
    if (currentPageNo<1){
        currentPageNo = 1;
    }else if (currentPageNo>totalPageCount){//当前页面大于了最后一页;
        currentPageNo = totalPageCount;
    }

    //获取用户列表展示

    System.out.println("-------userList前");
    userList = userService.getUserList(queryUserName, queryUserRole, currentPageNo, pageSize);
    req.setAttribute("userList",userList);

    System.out.println("-------userList后");

    RoleServiceImpl roleService = new RoleServiceImpl();
    List<Role> roleList = roleService.getRoleList();
    req.setAttribute("roleList",roleList);
    req.setAttribute("totalCount",totalCount);
    req.setAttribute("currentPageNo",currentPageNo);
    req.setAttribute("totalPageCount",totalPageCount);
    req.setAttribute("queryUserName",queryUserName);
    req.setAttribute("queryUserRole",queryUserRole);


    System.out.println("req.setAttribute后");

    //返回前端

    try {
        req.getRequestDispatcher("userlist.jsp").forward(req,resp);
    } catch (ServletException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("这里是UserServlet的请求转发;");
}

upport.setCurrentPageNo(currentPageNo);
pageSupport.setPageSize(pageSize);
pageSupport.setTotalCount(totalCount);

int totalPageCount = ((int)(totalCount/pageSize))+1;


//控制首页和尾页
//如果页面要小于1了,就显示第一页的东西
if (currentPageNo<1){
    currentPageNo = 1;
}else if (currentPageNo>totalPageCount){//当前页面大于了最后一页;
    currentPageNo = totalPageCount;
}

//获取用户列表展示

System.out.println("-------userList前");
userList = userService.getUserList(queryUserName, queryUserRole, currentPageNo, pageSize);
req.setAttribute("userList",userList);

System.out.println("-------userList后");

RoleServiceImpl roleService = new RoleServiceImpl();
List<Role> roleList = roleService.getRoleList();
req.setAttribute("roleList",roleList);
req.setAttribute("totalCount",totalCount);
req.setAttribute("currentPageNo",currentPageNo);
req.setAttribute("totalPageCount",totalPageCount);
req.setAttribute("queryUserName",queryUserName);
req.setAttribute("queryUserRole",queryUserRole);


System.out.println("req.setAttribute后");

//返回前端

try {
    req.getRequestDispatcher("userlist.jsp").forward(req,resp);
} catch (ServletException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
System.out.println("这里是UserServlet的请求转发;");

}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
超市管理系统: 1.数据库设计: smbms_user 超市的工作人员 每个工作人员都有角色 smbms_role 人员的角色 3种: 系统管理员: 经理 : 普通员工: smbms_bill 超市账单 账单属于某个供应商 smbms_provider 供应商 2.项目框架设计: myeclipse+mysql+java web(servlet|jsp) 3.开发模式: MVC开发模式 注意: (1)创建项目数据库时,采用UTF-8的编码. EncodingFilter (2)项目搭建 smbms src source folder com.hfxt.entity com.hfxt.controller UserServlet ProviderServlet BillServlet ... com.hfxt.filter com.hfxt.listener com.hfxt.service com.hfxt.service.impl com.hfxt.dao com.hfxt.dao.impl com.hfxt.util ... resources source folder db.properties test source folder WebRoot/ commom/存放公共页面 css/ img/ js/ /WEB-INF/admin(存放jsp) (3)jsp:建议放在WEB-INF下 html-》jsp:后缀名+page头部声明 jsp中的资源引用: 绝对路径: ①${pageContext.request.contextPath }/css/style.css 或者 ②<%=request.getContextPath()%> ③<c:set var="path" value="${pageContext.request.contextPath }"/> 可以使用${path}来获取 相对路径时相对于url(不建议) 统一: /admin/user/* /admin/provider/* ... <filter-mapping> <url-pattern>/admin/*</url-pattern> <> 如何处理登录问题? ①方式1 login.jsp放在WEB-INF /admin/user/toLogin->login.jsp /admin/user/login->点击登录时的处理 在过滤器中,if(url.indexOf("/toLogin") != -1 ||...){ //放行 chain.doFilter(request,response); return; } ②方式2 单独放置登录页面 login.html login.jsp 4.项目周期 1周时间 项目答辩时间: 5.项目分析: (1)登录功能: ①根据用户名查询数据库, 将用户输入的密码加密, 与数据库查询出的密码进行比对. 加密方法: String p2 = Base64.encode(p.getBytes() );//Base64方式加密 或者 String password = DigestUtils.md5Hex(value);//MD5方式加密 ②登录 public User login(String us,String ps){} public String login(String username){ //根据username查询密码p1 | 根据p1和输入的密码p1比较 | ------------------- |后台 | 相等,登录 否则,登录失败 } (2)控制器使用Servlet分发请求控制,实现一个Servlet处理多个请求 (3)根据用户角色id,来判断是否显示哪些管理模块, 或者是否显示删除、增加和修改图标 (4)页面提取: 首页等页面的头部,左侧导航,底部 等都可以单独的提取到JSP中. 在源页面上进行引用. <%@include file=""%> <jsp:include page="">等 (百度搜索iframe的使用) (5)账单,供应商,用户查询列表带分页。 该分页查询还需带条件。 条件查询: 支持模糊查询。 条件在查询之后, 要继续回显到页面上。 (6)供应商下拉列表: 1.在准备跳转目标页面的servlet中,查询所有供应商信息. 传到页面上 2.在JSP页面上, 拿到传递来的供应商信息.动态展示在下拉列表中. (7)账单,供应商,用户新增修改时: 1.页面必须有JS客户端验证. 2.Servlet服务端获取页面参数时,必须要有服务端验证. 例如判空 3.新增的成功失败给出提示. 4.用户新增时,注意界面使用的日期控件.和新增前,密码加密存储. (8)用户查询: 管理员可以查看所有用户列表. 经理与普通用户只能查看自身信息,没有权限查看所有用户,无需显示用户列表,值显示自己信息即可。 (9)账单,供应商,用户修改功能: 主键编号等不让改.修改页面依然需要JS验证. 服务端验证. 修改成功,失败给出提示. 用户修改: 权限修改. 只提供给管理员,用来修改普通用户与经理. (10)账单,供应商,用户删除功能: 需要弹窗提示.也可以自己编写界面 确认删除之后,成功失败给出提示. 供应商删除: 检查当有所属未支付账单时,给出提示,不允许删除.如果没有,则删除该供应商的所有账单 用户删除: 不允许删除自身. (11)密码修改功能: 1.修改密码页面,必须有JS验证.服务端验证. 2.旧密码必须与当前登录账号的密码相同. 3.新密码修改时,加密存储. 4.修改密码失败,在当前页面给出提示.修改成功,提示请重新登录,自动退出并跳往登录页,保证session失效 (12)访问权限控制: 1.增加过滤器. 登录页面可直接访问. 如果访问不是登录地址,则根据session判断是否登录. 如果已经登录,核心页面直接显示; 如果没有登录,跳转到登录页面; 如果已经登录,访问登录页面,跳转到核心页面 (13)错误页配置: 1.编写错误页. 2. 在web.xml中配置: <error-page> <error-code>404</error-code> <location>/404Error.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/500Error.jsp</location> </error-page>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三横同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值