Tomcat、Servlet、Request案例

案例:用户登录

用户登录案例需求

  1. 编写login.html登录页面
  2. 使用Druid数据库连接池技术,操作mysql,数据库名为Study,数据表名为users
  3. 使用JdbcTemplate技术封装JDBC
  4. 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
  5. 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

下载架包

  1. commons-logging-1.2.jar 下载。说明:用来记录程序运行时的活动的日志记录。

  2. druid-1.0.9.jar下载地址。说明:Druid是一个数据库连接池,可以用来创建数据库连接池对象。

  3. mchange-commons-java-0.2.12.jar下载。说明:C3P0数据库连接池依赖架包

  4. mysql-connector-java-5.1.37.jar下载。说明:MySQL驱动架包

  5. Spring 框架部分架包:

    1. spring-corespring-beans模块提供了框架的基础结构部分,包含控制反转和依赖注入功能。
    2. spring-jdbc模块提供了JDBC抽象层,不需要再编写单调的JDBC代码,解析数据库提供商指定的错误编码。
    3. spring-tx模块为实现指定接口和所有的简单Java对象的类提供编程式和声明式的业务管理。

实现

  1. 创建项目(RequestExample),导入架包到web/WEB-INF/lib目录下

    20200519141529
  2. 创建html页面:login.html

    复制
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>用户登录</title>
    </head>
    <body>
    <form action="" method="post">
    用户名:<label><input type="text" name="username"></label><br>
    密码:<label><input type="password" name="password"></label><br>
    <input type="submit" value="登录">
    </form>
    </body>
    </html>
  3. 创建数据库连接池的配置文件:driud.properties

    复制
    # 数据库连接池类全名称
    driverClassName=com.mysql.jdbc.Driver
    # 连接数据库的URL——jdbc:mysql://MySQL地址/数据库名
    url=jdbc:mysql://127.0.0.1:3306/Study
    # 数据库用户名
    username=用户名
    # 数据库密码
    password=密码
    # 数据库连接池初始化连接数
    initialSize=5
    # 数据库连接池最大连接数
    maxActive=10
    # 最大等待时间(毫秒为单位)
    maxWait=3000
  4. 创建数据表:

    复制
    USE Study;
    CREATE TABLE users(
    -- 用户id为主键,主键值自增。
    id INT PRIMARY KEY AUTO_INCREMENT,
    -- 用户名唯一,且非空。
    username VARCHAR(32) UNIQUE NOT NULL,
    -- 用户密码非空
    userPassword VARCHAR(32) NOT NULL
    );
    INSERT INTO users(username, userPassword) VALUES(LeeHua, 2018520), (Rainbow, 20201314);
  5. 创建一个用户实体类,用该实体类数据类型来存储用户信息:user.domain.User.java

    复制
    package user.domain;
    /** @Description: 用户实体类 */
    public class User {
    private int id;
    private String username;
    private String userPassword;
    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    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;
    }
    @Override
    public String toString() {
    return "User{" +
    "id=" + id +
    ", username='" + username + '\'' +
    ", userPassword='" + userPassword + '\'' +
    '}';
    }
    }
  6. 创建一个Jdbc工具类,用来获取数据库连接池对象:JdbcUtil.java

    复制
    package user.util;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import javax.sql.DataSource;
    import java.io.InputStream;
    import java.util.Properties;
    public class JdbcUtil {
    private static DataSource dataSource;
    static {
    try {
    // 获取加载配置文件的对象
    Properties properties = new Properties();
    // 获取类的类加载器
    ClassLoader classLoader = JdbcUtil.class.getClassLoader();
    // 获取druid-1.0.9.properties配置文件资源输入流
    InputStream resourceAsStream = classLoader.getResourceAsStream("druid.properties");
    // 加载配置文件
    properties.load(resourceAsStream);
    // 获取连接池对象
    dataSource = DruidDataSourceFactory.createDataSource(properties);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    public static DataSource getDataSource() {
    return dataSource;
    }
    }
  7. 创建操作数据库users表中的类:UserDao.java

    复制
    package user.dao;
    import org.springframework.dao.DataAccessException;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import user.domain.User;
    import user.util.JdbcUtil;
    public class UserDao {
    /** 创建JdbcTemplate对象,需要传入数据库连接池对象。 */
    private JdbcTemplate template = new JdbcTemplate(JdbcUtil.getDataSource());
    /**
    * 登录方法
    * @param loginUser 只有用户名的密码
    * @return 用户全部数据
    */
    public User login(User loginUser) {
    try {
    // 定义预编译SQL语句
    String sql = "SELECT * FROM users WHERE username = ? AND userPassword = ?";
    // 查询结果,将结果封装为对象
    User user = template. queryForObject(
    sql,
    // 将查询到的结果封装为 User 自定义数据结构
    new BeanPropertyRowMapper<User>(User.class),
    // 传入预编译sql语句的参数
    loginUser.getUsername(),
    loginUser.getUserPassword()
    );
    return user; // 查询到有对应的用户数据,返回数据
    } catch (DataAccessException e) {
    e.printStackTrace();
    return null; // 查询不到对应的用户数据,返回null
    }
    }
    }
  8. 创建三个servlet类:获取用户请求信息是否正确类、用户登录成功类、用户登录失败类

    1. 用户登录成功类:SuccessServlet.java

      复制
      package web.servlet;
      import user.domain.User;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      @WebServlet("/web/servlet/successServlet")
      public class SuccessServlet extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      // 获取request域中共享的user对象
      User user = (User) request.getAttribute("username");
      if (user != null) {
      // 设置编码
      response.setContentType("text/html;charset=utf-8");
      // 输出
      response.getWriter().write("登录成功。"+ user.getUsername() +",欢迎您!");
      }
      }
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      this.doGet(request, response);
      }
      }
    2. 用户登录失败类:FailServlet.java

      复制
      package web.servlet;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      @WebServlet("/web/servlet/failServlet")
      public class FailServlet extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      // 设置编码
      response.setContentType("text/html;charset=utf-8");
      // 输出
      response.getWriter().write("登录失败,用户名或密码错误!");
      }
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      this.doGet(request, response);
      }
      }
    3. 获取用户请求信息是否正确类:LoginServlet.java

      复制
      package web.servlet;
      import user.dao.UserDao;
      import user.domain.User;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      @WebServlet("/web/servlet/loginServlet")
      public class LoginServlet extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      // 设置编码
      request.setCharacterEncoding("utf-8");
      // 获取请求参数
      String username = request.getParameter("username");
      String userPassword = request.getParameter("userPassword");
      // 封装User对象(将获取到的请求参数封装到自定义数据类型中)
      User loginUser = new User();
      loginUser.setUsername(username);
      loginUser.setUserPassword(userPassword);
      // 创建UserDao,来操作数据库users表
      UserDao userDao = new UserDao();
      // 查询users表中是否存在请求的username和userPassword的一组数据
      User user = userDao.login(loginUser);
      if (user == null) {
      // 不存在这组数据,登录失败。
      // 将 request, response 传给 FailServlet.java
      request.getRequestDispatcher("/web/servlet/failServlet").forward(request, response);
      } else {
      // 存在这组数据,登录成功
      // 设置请求属性 'user':user
      request.setAttribute("username", loginUser);
      // 将 request, response 传给 SuccessServlet.java
      request.getRequestDispatcher("/web/servlet/successServlet").forward(request, response);
      }
      }
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      this.doGet(request, response);
      }
      }
  9. 编写login.html文件指定的servlet文件路径:

    复制
    <form action="/RequestExample_war_exploded/web/servlet/loginServlet" method="post">

    修改该行即可。

  10. 上面基本的实现已经完成,下面进行测试

测试

  1. 启动服务器,浏览器访问:http://localhost:8080/RequestExample_war_exploded/login.html

  2. 输入正确的用户名和密码:

    20200523022551
  3. 数据表中的数据如下:

    20200523022651
  4. 登录,跳转到页面:http://localhost:8080/RequestExample_war_exploded/web/servlet/loginServlet

    20200523022810
  5. 如果输入的账号密码,在数据库中没有一组与之对应的用户数据,那么会跑出错误,且页面也会跳转到:http://localhost:8080/RequestExample_war_exploded/web/servlet/loginServlet

    20200523023110

    跳转后的页面:

    20200523023159

参考文献

  1. commons-logging.jar的作用
  2. C3P0基本使用教程
  3. Spring 5.0.0框架介绍_中文版_第二章
  4. Spring JDBC 的简单使用
posted @   LeeHua  阅读(371)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航