JavaWeb實現用戶登錄【HTML+MySQL+JDBCTemplate+Servlet+Druid連接池】

JavaWeb實現用戶登錄【HTML+MySQL+JDBCTemplate+Servlet+Druid連接池】

一、用戶登錄案例需求:

  1. 編寫login.html登錄頁面,username & password 兩個輸入框
  2. 使用Druid數據庫連接池技術,操作mysql,數據庫中user表
  3. 使用JdbcTemplate技術封裝JDBC
  4. 登錄成功跳轉到SuccessServlet展示:登錄成功!用戶名,歡迎您
  5. 登錄失敗跳轉到FailServlet展示:登錄失敗,用戶名或密碼錯誤

二、用戶登錄案例分析:

在這裏插入圖片描述

三、創建項目

  1. 創建JavaWeb項目,將druid.properties放入src文件中。druid.properties文件的相關內容如下:
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///db_student_manager_web?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
  1. 在web/WEB-INF下創建lib文件,將用到JDBCTemplate的相關jar包,全部導入lib文件中。對於想要了解其相關內容,可以點擊右側鏈接👉JDBCTemplate的相關知識
  • jar包的相關目錄如下:
    在這裏插入圖片描述
  1. 將jar包Add as Librsry;然後導入html頁面,login.html中的form表單的action路徑的寫法是:虛擬目錄+Servlet的資源路徑
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="" method="post">
        用戶名:<input type="text" name="username"> <br>
        密碼:<input type="password" name="password"><br>

        <input type="submit" value="登錄">
    </form>
</body>
</html>

四、 創建數據庫的環境

  1. 創建USER表格
CREATE TABLE `user` (
	`id` INT NOT NULL AUTO_INCREMENT,
	`username` VARCHAR ( 32 ) NOT NULL,
	`password` VARCHAR ( 32 ) NOT NULL,
	PRIMARY KEY ( `id` ),
UNIQUE KEY `username` ( `username` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8;
  1. 在user表格裏面添加數據,用於後面的登錄操作
    在這裏插入圖片描述

三、編寫代碼

  1. 創建cn.itcast.domain,創建類User
package cn.itcast.domain;
/**
 * 用戶的實體類
 */
public class User {
    private int id;
    private String username;
    private String password;
    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 getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
  1. 創建cn.itcast.dao,創建類UserDao,提供login方法
package cn.itcast.dao;
import cn.itcast.domain.User;
import cn.itcast.util.JDBCUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * 操作數據庫中User表的類
 */
public class UserDao {
    //聲明JDBCTemplate對象共用
    protected JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    /**
     * 登錄方法
     * @param loginUser 只有用戶名和密碼
     * @return user包含用戶全部數據 , 沒有查詢到,返回null
     */
    public User login(User loginUser){
        try {
            //1.編寫sql
            String sql = "select * from user where username = ? and password = ?";
            //2.調用query方法
            User user = template.queryForObject(sql,
                    new BeanPropertyRowMapper<User>(User.class),
                    loginUser.getUsername(), loginUser.getPassword());
            return user;
        }catch (DataAccessException e){
            e.printStackTrace();
            return null;
        }
    }
}
  1. 創建cn.itcast.util,創建JDBC工具類,使用Druid連接池
package cn.itcast.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * JDBC工具類,使用Druid連接池
 */
public class JDBCUtils {

    private static DataSource ds;
    static {
        try {
            //1.加載配置文件
            Properties pro = new Properties();
            //使用ClassLoader加載配置文件,獲取字節輸入流
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            pro.load(is);
            //2.初始化連接池對象
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //獲取連接池對象
    public static DataSource getDataSource(){
        return ds;
    }

    //獲取連接Connection對象
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}
  1. 創建cn.itcast.web.servlet,創建LoginServlet類
package cn.itcast.web.servlet;
import cn.itcast.dao.UserDao;
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("/LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.設置編碼
        req.setCharacterEncoding("utf-8");
        //2.獲取請求參數
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //3.封裝user對象
        User loginUser = new User();
        loginUser.setUsername(username);
        loginUser.setPassword(password);

        //4.調用UserDao的login方法
        UserDao dao = new UserDao();
        User user = dao.login(loginUser);

        //5.判斷user
        if (user == null){
            //登陸失敗
            req.getRequestDispatcher("/FailServlet").forward(req,resp);
        }else {
            //登錄成功
            //存儲數據
            req.setAttribute("user",user);
            //轉發
            req.getRequestDispatcher("/SuccessServlet").forward(req,resp);
        }
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
  1. 編寫類FailServlet和類SuccessServlet的跳轉頁面。
  • FailServlet類文件:
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("/FailServlet")
public class FailServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設置頁面編碼
        response.setContentType("text/html;charset=utf-8");
        //輸出
        response.getWriter().write("登錄失敗,用戶名或密碼錯誤");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

  • SuccessSuServlet類文件:
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("/SuccessSuServlet")
public class SuccessServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        User user = (User) request.getAttribute("user");

        if (user != null){
            //設置編碼
            response.setContentType("text/html;charset=utf-8");
            //輸出
            response.getWriter().write("登錄成功!!"+user.getUsername()+",歡迎你");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

五、登錄效果演示

在這裏插入圖片描述



擴展:優化代碼

截止到此,已經實現了通過使用JavaWeb來實現用戶登錄的功能,但是對於代碼的上述的編寫,還是有些欠缺的地方;在LoginServlet類文件中將username,password都封裝成了對象,上述的頁面也就只有兩個參數想要進行數據封裝;那麼要是註冊頁面,需要很多的數據項需要封裝的話,會造成代碼冗餘。
那麼我們可以通過下面的方法將數據一次性全部獲取,然後封裝。

BeanUtils工具類,簡化數據封裝

  1. 將commons-beanutils-1.8.0.jar包放入web/WEB-INF/ilb文件中,然後 Add as Library。
  2. 重新編寫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 doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.設置編碼
        req.setCharacterEncoding("utf-8");
        
        //2.獲取所有請求參數
        Map<String, String[]> map = req.getParameterMap();
        ///3.創建User對象
        User loginUser = new User();
        //3.2使用BeanUtils封裝
        try {
            BeanUtils.populate(loginUser,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        //4.調用UserDao的login方法
        UserDao dao = new UserDao();
        User user = dao.login(loginUser);

        //5.判斷user
        if (user == null){
            //登陸失敗
            req.getRequestDispatcher("/FailServlet").forward(req,resp);
        }else {
            //登錄成功
            //存儲數據
            req.setAttribute("user",user);
            //轉發
            req.getRequestDispatcher("/SuccessServlet").forward(req,resp);
        }
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
  • BeanUtils工具類,用於JavaBean,封裝數據。

方法:

  1. setProperty()
  2. getProperty()
  3. populate(Obgect obj,Map map):將map集合的鍵值對信息,封裝到對應的JavaBean集合中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章