• 用户登录模块---Druid+JDBC+Servlet


    目录

    1.案例:用户登录

    1.1用户登录案例需求:

    1.2开发步骤

    1.2.1创建项目,导入html页面,配置文件,jar包

    ​编辑1.2.2. 创建数据库环境

     1.2.3 创建包cn.itcast.domain,创建类User

     1.2.4创建包cn.itcast.util,编写工具类JDBCUtils

    1.2.5 创建包cn.itcast.dao,创建类UserDao,提供login方法(操作数据库)

    1.2.6编写cn.itcast.web.servlet.LoginServlet类

    1.2.7编写FailServlet和SuccessServlet类

    1.2.8login.html中form表单的action路径的写法

    1.2.9BeanUtils工具类,简化数据封装


    1.案例:用户登录

    1.1用户登录案例需求:

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

     

    1.2开发步骤

    1.2.1创建项目,导入html页面,配置文件,jar包

    a.新建Java项目

     

    b.添加框架支持(Web应用程序)

    c.部署项目

     d.导入servlet-api.jar


    1.2.2. 创建数据库环境

    1. CREATE DATABASE day14;
    2. USE day14;
    3. CREATE TABLE USER(
    4. id INT PRIMARY KEY AUTO_INCREMENT,
    5. username VARCHAR(32) UNIQUE NOT NULL,
    6. PASSWORD VARCHAR(32) NOT NULL
    7. );
    8. INSERT INTO USER (username,PASSWORD) VALUES("superbaby",123);
    9. select * from user;

     1.2.3 创建包cn.itcast.domain,创建类User

    1. package cn.itcast.domain;
    2. /**
    3. * 用户的实体类
    4. */
    5. public class User {
    6. private int id;
    7. private String username;
    8. private String password;
    9. private String gender;
    10. public void setHehe(String gender){
    11. this.gender = gender;
    12. }
    13. public String getHehe(){
    14. return gender;
    15. }
    16. public int getId() {
    17. return id;
    18. }
    19. public void setId(int id) {
    20. this.id = id;
    21. }
    22. public String getUsername() {
    23. return username;
    24. }
    25. public void setUsername(String username) {
    26. this.username = username;
    27. }
    28. public String getPassword() {
    29. return password;
    30. }
    31. public void setPassword(String password) {
    32. this.password = password;
    33. }
    34. @Override
    35. public String toString() {
    36. return "User{" +
    37. "id=" + id +
    38. ", username='" + username + '\'' +
    39. ", password='" + password + '\'' +
    40. ", gender='" + gender + '\'' +
    41. '}';
    42. }
    43. }

     1.2.4创建包cn.itcast.util,编写工具类JDBCUtils

    1. package cn.itcast.util;
    2. import com.alibaba.druid.pool.DruidDataSourceFactory;
    3. import javax.sql.DataSource;
    4. import javax.xml.crypto.Data;
    5. import java.io.IOException;
    6. import java.io.InputStream;
    7. import java.sql.Connection;
    8. import java.sql.SQLException;
    9. import java.util.Properties;
    10. /**
    11. * JDBC工具类 使用Durid连接池
    12. */
    13. public class JDBCUtils {
    14. private static DataSource ds ;
    15. static {
    16. try {
    17. //1.加载配置文件
    18. Properties pro = new Properties();
    19. //使用ClassLoader加载配置文件,获取字节输入流
    20. InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
    21. pro.load(is);
    22. //2.初始化连接池对象
    23. ds = DruidDataSourceFactory.createDataSource(pro);
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. } catch (Exception e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. /**
    31. * 获取连接池对象
    32. */
    33. public static DataSource getDataSource(){
    34. return ds;
    35. }
    36. /**
    37. * 获取连接Connection对象
    38. */
    39. public static Connection getConnection() throws SQLException {
    40. return ds.getConnection();
    41. }
    42. }

    配置文件

    1. driverClassName=com.mysql.jdbc.Driver
    2. url=jdbc:mysql:///day14
    3. username=root
    4. password=root
    5. initialSize=5
    6. maxActive=10
    7. maxWait=3000

    1.2.5 创建包cn.itcast.dao,创建类UserDao,提供login方法(操作数据库)

    1. package cn.itcast.dao;
    2. import cn.itcast.domain.User;
    3. import cn.itcast.util.JDBCUtils;
    4. import org.springframework.dao.DataAccessException;
    5. import org.springframework.jdbc.core.BeanPropertyRowMapper;
    6. import org.springframework.jdbc.core.JdbcTemplate;
    7. /**
    8. * 操作数据库中User表的类
    9. */
    10. public class UserDao {
    11. //声明JDBCTemplate对象共用
    12. private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    13. /**
    14. * 登录方法
    15. * @param loginUser 只有用户名和密码
    16. * @return user包含用户全部数据,没有查询到,返回null
    17. */
    18. public User login(User loginUser){
    19. try {
    20. //1.编写sql
    21. String sql = "select * from user where username = ? and password = ?";
    22. //2.调用query方法
    23. User user = template.queryForObject(sql,
    24. new BeanPropertyRowMapper(User.class),
    25. loginUser.getUsername(), loginUser.getPassword());
    26. return user;
    27. } catch (DataAccessException e) {
    28. e.printStackTrace();//记录日志
    29. return null;//当sql语句执行失败,不会报错,而是返回null
    30. }
    31. }
    32. }

    1.2.6编写cn.itcast.web.servlet.LoginServlet类

    由于导入servlet.api.jar的包,可以使用快捷创建servlet类

     

    1. package cn.itcast.web.servlet;
    2. import cn.itcast.dao.UserDao;
    3. import cn.itcast.domain.User;
    4. import org.apache.commons.beanutils.BeanUtils;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.annotation.WebServlet;
    7. import javax.servlet.http.HttpServlet;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import java.io.IOException;
    11. import java.lang.reflect.InvocationTargetException;
    12. import java.util.Map;
    13. @WebServlet("/loginServlet")
    14. public class LoginServlet extends HttpServlet {
    15. @Override
    16. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    17. //1.设置编码
    18. req.setCharacterEncoding("utf-8");
    19. /* //2.获取请求参数
    20. String username = req.getParameter("username");
    21. String password = req.getParameter("password");
    22. //3.封装user对象
    23. User loginUser = new User();
    24. loginUser.setUsername(username);
    25. loginUser.setPassword(password);*/
    26. //2.获取所有请求参数
    27. Map map = req.getParameterMap();
    28. //3.创建User对象
    29. User loginUser = new User();
    30. //3.1使用BeanUtils封装
    31. try {
    32. BeanUtils.populate(loginUser,map);
    33. } catch (IllegalAccessException e) {
    34. e.printStackTrace();
    35. } catch (InvocationTargetException e) {
    36. e.printStackTrace();
    37. }
    38. //4.调用UserDao的login方法
    39. UserDao dao = new UserDao();
    40. User user = dao.login(loginUser);
    41. //5.判断user
    42. if(user == null){
    43. //登录失败
    44. req.getRequestDispatcher("/failServlet").forward(req,resp);
    45. }else{
    46. //登录成功
    47. //存储数据
    48. req.setAttribute("user",user);
    49. //转发
    50. req.getRequestDispatcher("/successServlet").forward(req,resp);
    51. }
    52. }
    53. @Override
    54. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    55. this.doGet(req,resp);
    56. }
    57. }

    1.设置编码可以防止中文乱码

    2.获取所有请求参数,封装到map集合

    3.创建User对象

    3.1使用BeanUtils.populate()将用户输入的信息(map集合)封装到loginUser对象中

    4.通过反射获得login方法,将loginUser传到方法中,通过JdbcTemplate中的方法queryForObject,返回一个user对象,该对象是数据库中的信息,或者由于数据库不匹配返回null。

    5.判断user,利用getRequestDispatcher进行转发到其他页面。

    1.2.7编写FailServlet和SuccessServlet类

    1. package cn.itcast.web.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/failServlet")
    9. public class FailServlet extends HttpServlet {
    10. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    11. //给页面写一句话
    12. //设置编码
    13. response.setContentType("text/html;charset=utf-8");
    14. //输出
    15. response.getWriter().write("登录失败,用户名或密码错误");
    16. }
    17. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    18. this.doPost(request,response);
    19. }
    20. }
    1. package cn.itcast.web.servlet;
    2. import cn.itcast.domain.User;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.IOException;
    9. @WebServlet("/successServlet")
    10. public class SuccessServlet extends HttpServlet {
    11. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    12. //获取request域中共享的user对象
    13. User user = (User) request.getAttribute("user");
    14. //if语句防止空指针异常
    15. if(user != null){
    16. //给页面写一句话
    17. //设置编码
    18. response.setContentType("text/html;charset=utf-8");
    19. //输出
    20. response.getWriter().write("登录成功!"+user.getUsername()+",欢迎您");
    21. }
    22. }
    23. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    24. this.doPost(request,response);
    25. }
    26. }

    1.2.8login.html中form表单的action路径的写法

    action="/day14_test/loginServlet"

    虚拟目录+Servlet的资源路径

    1.2.9BeanUtils工具类,简化数据封装

    BeanUtils工具类用于封装JavaBean的
    1. JavaBean:标准的Java类
    要求:
    1. 类必须被public修饰
    2. 必须提供空参的构造器
    3. 成员变量必须使用private修饰
    4. 提供公共setter和getter方法
    功能:封装数据

    2. 概念
    成员变量:
    属性:setter和getter方法截取后的产物
    例如:getUsername() --> Username--> username

    3. 方法:
    setProperty()
    getProperty()
    populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中.

  • 相关阅读:
    Chapter 14 主题模型
    EasyRecovery适用于Windows和Mac的专业硬盘恢复软件
    【每日一题】实现 Trie (前缀树)
    CCNA-NAT协议 静态NAT 动态NAT(多对多) PAT(多对一) 内网与外网之间的通信 GNS3实验验证
    Allegro Design Entry HDL(OrCAD Capture HDL)软件界面详细介绍
    双网并行route设置后有一个变成未识别的网络
    一个案例熟悉使用pytorch
    k8s如何优雅地关闭Pod
    IDEA自动注解设置(中文版)
    初接触:从创建工程到导出gerber(学习Altium Designer)
  • 原文地址:https://blog.csdn.net/weixin_65440201/article/details/126197507