【JavaWeb】用戶登錄案例


需求

1. 編寫login.html登錄頁面,包含username & password 兩個輸入框

2. 使用Druid數據庫連接池技術,操作mysql,test數據庫中user表

3. 使用JdbcTemplate技術封裝JDBC

4. 登錄成功跳轉到SuccessServlet展示:登錄成功!用戶名,歡迎您

5. 登錄失敗跳轉到FailServlet展示:登錄失敗,用戶名或密碼錯誤

需求分析

使用三個部分完成上述需求,第一部分是前端,實現起來很簡單,第二部分是Sevelet部分,第三部分是數據庫的操作部分。

【JavaWeb】用戶登錄案例

開發步驟

1. 創建項目,導入html頁面,配置文件,jar包


<code>



<title>Title/<title>










/<code>

登錄頁面展示:

【JavaWeb】用戶登錄案例

2. 創建數據庫環境

<code>
CREATE DATABASE test;
USE test;
CREATE TABLE USER(
\t\t\t
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32) UNIQUE NOT NULL,
password VARCHAR(32) NOT NULL,
address VARCHAR(32) NOT NULL,
phone VARCHAR(32) NOT NULL

\t\t\t);/<code>

在數據庫中添加的內容:

【JavaWeb】用戶登錄案例

3. 創建包cn.lwl.domain,創建類User類

其中包含三個私有屬性,id,name和password,並創建三個屬性的get和set方法已經重寫toString()方法。

<code>package cn.lwl.domain;

/** 用戶的實體類
* @author liwenlong
* @data 2020/3/19
*/
public class User {

private int id;
private String name;
private String 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;
}

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

'}';
}
}/<code>

4. 創建JDBC工具類,使用Durid數據庫連接池

導入配置文件 druid.properties

<code>driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test
username=root
password=1234
initialSize=5
maxActive=10
maxWait=3000/<code>

創建工具類 :

<code>
package cn.lwl.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

/**
* JDBC工具類,使用Durid數據庫連接池
*
* @author liwenlong
* @data 2020/3/20
*/
public class JDBCUtils {
//聲明連接池對象
public static DataSource ds;

static {
//加載配置文件,初始化連接池
try {
Properties pro = new Properties();
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);

//初始化連接池對象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}

}

//獲取連接池對象
public static DataSource getDateSource() {
return ds;
}

//獲取連接對象
public static Connection getConnection() throws Exception {
return ds.getConnection();
}
}/<code>

5.操作數據庫中User表的類UserDao

<code>package cn.lwl.domain.dao;

import cn.lwl.domain.User;
import cn.lwl.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

/**
* 操作數據庫中User表的類
*
* @author liwenlong
* @data 2020/3/19
*/
public class UserDao {

//聲明JDBCTemplate對象供類中方法使用
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDateSource());

public User login(User loginUser) { //形參loginUser為只有用戶名和密碼的User
//編寫SQL語句
String sql = "select * from user where name=? and password =?";
//調用query方法,執行SQL語句

User user = template.queryForObject(sql,
new BeanPropertyRowMapper<user>(User.class),
loginUser.getName(), loginUser.getPassword());
//返回的為含有所有信息的user
return user;
}

}/<user>/<code>

6. 測試UserDao

上面步驟完成後不著急繼續完成其他代碼,而是應該測試當前代碼是否正確。

新建一個test包用於測試,在包中新建UserDaoTest類:

<code>package cn.lwl.test;

import cn.lwl.domain.User;
import cn.lwl.domain.dao.UserDao;
import org.junit.jupiter.api.Test;

/**
* @author liwenlong
* @data 2020/3/20
*/
public class UserDaoTest {

@Test
public void testLogin(){

User loginUser = new User();
loginUser.setName("LadyGaGa");
loginUser.setPassword("123456");

UserDao dao = new UserDao();
User user = dao.login(loginUser);
System.out.println(user);

}
}/<code>

測試結果:

【JavaWeb】用戶登錄案例

這樣結果說明測試通過。

7.編寫cn.lwl.web.servlet.LoginServelt類,完成登錄的具體邏輯

<code>package cn.lwl.web.servlet;

import cn.lwl.domain.User;
import cn.lwl.domain.dao.UserDao;

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;

/**
* @author liwenlong
* @data 2020/3/21

*/
@WebServlet("/loginServlet")
public class LoginServelt extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設置編碼方式
req.setCharacterEncoding("utf-8");
//獲取請求參數
String name = req.getParameter("name");
String password = req.getParameter("password");
//封裝成對象
User loginUser = new User();
loginUser.setName(name);
loginUser.setPassword(password);
//調用userDao的方法
UserDao userDao = new UserDao();
User user = userDao.login(loginUser);

//判斷是否正確
if(user == null){
//賬號密碼錯誤
//轉發到另一個頁面
req.getRequestDispatcher("/failServlet").forward(req,resp);
}else {//成功
//存儲數據並轉發
req.setAttribute("user",user);
req.getRequestDispatcher("/successServlet").forward(req,resp);
}
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}/<code>

將login.html中的action補充完整,寫法為:虛擬目錄+Servlet的資源路徑,虛擬目錄可以在【Run】-【Edit Configurations】中設置和查看,Servlet的資源路徑根據LoginServelt類中@WebServlet("/loginServlet")可以看出設置的是/loginServlet。

【JavaWeb】用戶登錄案例

8.轉發到的成功和失敗頁面

<code>package cn.lwl.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;

/**
* @author liwenlong
* @data 2020/3/21
*/
@WebServlet("/successServlet")
public class SuccessServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設置編碼方式
response.setContentType("text/html;charset=utf-8");
//輸出
response.getWriter().write("登陸成功,尊敬的"+request.getAttribute("user")+",歡迎您!");
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}/<code>
<code>package cn.lwl.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;

/**
* @author liwenlong
* @data 2020/3/21
*/
@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);
}
/<code>

運行測試

在瀏覽器中輸入:http://localhost:8080/lwl/login.html

【JavaWeb】用戶登錄案例

如果輸入錯誤的用戶名和密碼:

【JavaWeb】用戶登錄案例

如果輸入 正確的賬號密碼:


【JavaWeb】用戶登錄案例

優化

存在的問題:

對於LoginServelt類中的這段代碼:

<code>//獲取請求參數
String name = req.getParameter("name");
String password = req.getParameter("password");
//封裝成對象
User loginUser = new User();
loginUser.setName(name);/<code>

這段代碼存在一定的問題,目前只是驗證了User對象的兩個屬性name和password,如果將來一個類中有很多個對象(例如註冊頁面),那麼採用上述的方式進行封裝對象就不是特別的合適,那麼我們將會採用下面的方法一次性將所有的屬性封裝成為對象。

改進

使用getParameterMap()函數一次獲取所有屬性,然後利用BeanUtils工具類完成屬性封裝成類。

BeanUtils介紹

BeanUtils 是 Apache commons組件的成員之一,主要用於簡化JavaBean封裝數據的操作。它可以給JavaBean封裝一個字符串數據,也可以將一個表單提交的所有數據封裝到JavaBean中。BeanUtils工具常用工具類有兩個:BeanUtils、ConvertUtils。BeanUtils用於封裝數據,ConvertUtils用於處理類型轉換。

JavaBean:是標準的Java類,用來封裝數據。它遵循以下規範:

<code>類必須被public修飾
必須提供空參的構造器
成員變量必須使用private修飾
提供公有的setter和getter方法/<code>

常用方法

【JavaWeb】用戶登錄案例

修改步驟:

1. 導入Jar包 commons-beanutils-1.9.4.jar

2.修改代碼

<code>package cn.lwl.web.servlet;

import cn.lwl.domain.User;
import cn.lwl.domain.dao.UserDao;
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;

/**
* @author liwenlong
* @data 2020/3/21
*/
@WebServlet("/loginServlet")
public class LoginServelt extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設置編碼方式
req.setCharacterEncoding("utf-8");
// //獲取請求參數
// String name = req.getParameter("name");
// String password = req.getParameter("password");
// //封裝成對象
// User loginUser = new User();
// loginUser.setName(name);
// loginUser.setPassword(password);

//獲取所有請求參數
Map<string> map = req.getParameterMap();
//封裝成對象
User loginUser = new User();
try {
BeanUtils.populate(loginUser,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}


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

//判斷是否正確
if(user == null){
//賬號密碼錯誤
//轉發到另一個頁面
req.getRequestDispatcher("/failServlet").forward(req,resp);
}else {//成功
//存儲數據並轉發
req.setAttribute("user",user);
req.getRequestDispatcher("/successServlet").forward(req,resp);
}
}

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

}/<string>/<code>

注:文章轉自互聯網


分享到:


相關文章: