案例-登录(mysql,druid连接池技术JDBCTemplateservlet)

Posted --believe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了案例-登录(mysql,druid连接池技术JDBCTemplateservlet)相关的知识,希望对你有一定的参考价值。

需求分析

  1. 编写login.html登录页面

    username & password 两个输入框

  2. 使用Druid数据库连接池技术,操作mysql中的user表

  3. 使用JdbcTemplate技术封装JDBC

  4. 登录成功跳转到SuccessServlet

    展示:登录成功!用户名,欢迎您xxx用户

  5. 登录失败跳转到FailServlet

    展示:登录失败,用户名或者密码错误

步骤

  • 导入数据库驱动包,Druid数据库连接池包,JdbcTemplate一系列包

  • 编写登录页面login.html

  • 定义User实体类

  • 定义UserDao数据库连接对象

  • 编写处理登录servlet以及展示页面成功和失败的servlet

代码

项目目录

登录页面login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<!--用户输入表单-->
<form method="post" action="/demo_login_1/loginServlet" style="margin:auto;">
    姓名:<input type="text" name="name" placeholder="输入姓名"></br>
    密码:<input type="password" name="password" placeholder="输入密码"></br>
    <input type="submit" name="btn" value="提交">
</form>
</body>
</html>

User实体类

package cn.itcast.domain;

/**
 * 实体类,注意这里面的属性要和数据库中的属性写成一样的
 * 方便在UserDao中queryForObject使用BeanPropertyMapper
 */
public class User 
    private  int id;
    private String name;
    private String password;

    public User() 
    

    @Override
    public String toString() 
        return "User" +
                "id=" + id +
                ", name='" + name + '\\'' +
                ", password='" + password + '\\'' +
                '';
    

    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    


JDBCUtils.java获取数据库连接池DataSource

druid.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/day15
username=believe
password=believe
initialSize=5
maxActive=10
maxWait=3000

定义工具类,用于获取DataSource

package cn.itcast.Utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.util.Properties;

/**
 * JDBC工具类,用于获取数据库连接池
 */
public class JDBCUtils 
    private static DataSource ds;
    static 

        try 
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(pro);
         catch (IOException e) 
            e.printStackTrace();
         catch (Exception e) 
            e.printStackTrace();
        
    
    public static DataSource getDataSource()
        return ds;
    



UserDao数据库连接实体(利用JDBCTemplate)

package cn.itcast.dao;

import cn.itcast.Utils.JDBCUtils;
import cn.itcast.domain.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * 数据库连接获取user信息
 * 需要导入的包:1.JDBC驱动:连接数据库
 *             2.Druid数据库连接池:创建datasource
 *             3.JDBCTemplate:快速创建connection
 *             4.BeanUtils:利用反射将map转换为实体对象
 */
public class UserDao 
    public static User getUser(User loginUser)

        try
            JdbcTemplate jt = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql="SELECT * FROM USER WHERE NAME=? AND PASSWORD=?;";
            User user = jt.queryForObject(sql,
                    new BeanPropertyRowMapper<>(User.class),
                    loginUser.getName(), loginUser.getPassword());//最后两个参数是问号填充
            return user;

        catch (Exception e)
            e.printStackTrace();
            return null;
        

    


servlet

LoginServlet

package cn.itcast.web.servlet;

import cn.itcast.dao.UserDao;
import cn.itcast.domain.User;
import org.apache.commons.beanutils.BeanUtils;

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;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        this.doGet(request, response);
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        //获取表单的输入值
        request.setCharacterEncoding("utf-8");//设置编码方式
        Map<String, String[]> map = request.getParameterMap();
        User loginuser = new User();
        try 
            //将表单输入的map集合转换成一个User对象
            BeanUtils.populate(loginuser,map);
            User user = UserDao.getUser(loginuser);

            if(null==user)
                //查询不到就失败,转发到failedServlet
                request.getRequestDispatcher("/failedServlet").forward(request,response);

            else

                //查询成功,转发到successServlet
                request.setAttribute("user",user);
                request.getRequestDispatcher("/successServlet").forward(request,response);

            
         catch (IllegalAccessException e) 
            e.printStackTrace();
         catch (InvocationTargetException e) 
            e.printStackTrace();
        
    


SuccessServlet

package cn.itcast.web.servlet;

import cn.itcast.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("/successServlet")
public class SuccessServlet extends HttpServlet 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        this.doGet(request, response);
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        User user = (User) request.getAttribute("user");
        //设置响应的mime类型,防止乱码
        response.setContentType("text/html;charset=utf-8;");
        response.getWriter().write("你好,"+user.getName()+"用户!好久不见");
    


FailedServlet

package cn.itcast.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("/failedServlet")
public class FailedServlet extends HttpServlet 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        this.doGet(request, response);
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

        //设置响应的mime类型,防止乱码
        response.setContentType("text/html;charset=utf-8;");
        response.getWriter().write("用户密码错误,登录失败");

    


演示

项目总结

需要导入哪些jar包?各自有什作用?

  • 数据库驱动jar包

    用于连接数据库,由数据库厂商提供,有统一的接口。

  • Druid数据库连接池jar包

    阿里巴巴提供的数据库连接池技术。通过DruidDataSourceFactory创建

    DruidDataSourceFactory.createDataSource(pro)
    
  • JDBCTemplate jar包 和 BeanUtils jar包

    JDBC模板,通过JDBCTemplate(DataSource)创建对象。

    再通过对象.queryForObject查询数据库构造实体(比如User)对象。

    需要借助BeanUtils工具类将实体的字节码对象映射到实体对象上去。

    jt.queryForObject(sql,new BeanPropertyRowMapper<>(User.class),sql中的?参数)
    

JDBCUtils工具类分析

  1. 主要功能

    • 加载读取druid.properties,利用druid数据库连接池工厂创建一个数据库连接池。

      Properties pro = new Properties();
      pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
      ds = DruidDataSourceFactory.createDataSource(pro);
      
    • 获取数据库连接池

文件目录结构分析

  • dao

    数据库访问对象,实现数据库连接访问操作

  • domain

    定义实体类

  • web

    实现servlet逻辑

以上是关于案例-登录(mysql,druid连接池技术JDBCTemplateservlet)的主要内容,如果未能解决你的问题,请参考以下文章

为啥修改阿里druid连接池监控登录密码后登陆不成功

Java 之 request 案例——用户登录

Springboot集成druid数据库连接池

Druid 连接池,重启Mysql数据库后,Druid会自动重新连接不,该在哪配置?

druid连接池

SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面