需求
1. 編寫login.html登錄頁面,包含username & password 兩個輸入框
2. 使用Druid數據庫連接池技術,操作mysql,test數據庫中user表
3. 使用JdbcTemplate技術封裝JDBC
4. 登錄成功跳轉到SuccessServlet展示:登錄成功!用戶名,歡迎您
5. 登錄失敗跳轉到FailServlet展示:登錄失敗,用戶名或密碼錯誤
需求分析
使用三個部分完成上述需求,第一部分是前端,實現起來很簡單,第二部分是Sevelet部分,第三部分是數據庫的操作部分。
開發步驟
1. 創建項目,導入html頁面,配置文件,jar包
<code>
<title>Title/<title>
/<code>
登錄頁面展示:
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>
在數據庫中添加的內容:
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>
測試結果:
這樣結果說明測試通過。
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。
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
如果輸入錯誤的用戶名和密碼:
如果輸入 正確的賬號密碼:
優化
存在的問題:
對於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>
常用方法
修改步驟:
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>
注:文章轉自互聯網
閱讀更多 源碼教程分享 的文章