文章目錄
- 使用者登入案例需求:
-
- 分析
- 步驟
- 結果
使用者登入案例需求:
1.編寫login.html登入頁面
username & password 兩個輸入框
2.使用Druid資料庫連接配接池技術,操作mysql,servlettest資料庫中user表
3.使用JdbcTemplate技術封裝JDBC
4.登入成功跳轉到SuccessServlet展示:登入成功!使用者名,歡迎您
5.登入失敗跳轉到FailServlet展示:登入失敗,使用者名或密碼錯誤
分析

步驟
檔案樹展示
1.建立項目,配置檔案,jar包
druid.properties配置檔案
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///servlettest
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
2.登陸界面login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/Servlet_Demo/loginServlet" method="post">
<input type="text" name="username" placeholder="使用者名">
<input type="text" name="password" placeholder="密碼">
<input type="submit" value="送出">
</form>
</body>
</html>
3.資料庫準備
CREATE DATABASE servlettest;
USE servlettest;
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32) UNIQUE NOT NULL,
PASSWORD VARCHAR(32) NOT NULL
);
INSERT INTO USER VALUES(null,"Ray",123);
4.建立User類,這個是使用者實體類
package text.userclass;
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 + '\'' +
'}';
}
}
5.工具類JDBCUtils,這個工具類是老朋友了,使用Durid資料庫連接配接池來獲得資料庫連接配接池對象。因為後面會使用JdbcTemplate,它會幫我們歸還資料庫連接配接,是以這裡就不再寫歸還。
package text.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtils {
//資料庫連接配接池對象
private static DataSource ds;
//Druid資料庫連接配接池配置
static{
try {
Properties pro=new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
ds=DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
}
//傳回資料庫連接配接池對象
public static DataSource getDatasource(){
return ds;
}
//傳回資料庫連接配接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
6.建立UserDao類,這個類提供了login方法,我們用User使用者實體類就可以在這裡判斷使用者名和密碼是否正确
package text.dao;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import text.userclass.User;
import text.utils.JDBCUtils;
public class UserDao {
private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDatasource());
/**
* 使用者登陸的方法
* @param loginusername 使用者登陸名和密碼
* @return 所有使用者資訊
*/
public User login(User loginusername){
try {
String sql="select * from USER where username=? and password=?";
User user = template.queryForObject(sql,
new BeanPropertyRowMapper<User>(User.class),
loginusername.getUsername(), loginusername.getPassword());
return user;
} catch (DataAccessException e) {
e.printStackTrace();
return null;
}
}
}
7.在準備工作完成後,我這裡寫了一個Main類來測試一下連接配接是否正确(也可以不寫該類)
package text;
import org.junit.Test;
import text.dao.UserDao;
import text.userclass.User;
public class main {
@Test
public void userlogin(){
User user=new User();
user.setUsername("Ray");
user.setPassword("123");
User loginuser = new UserDao().login(user);
System.out.println(loginuser);
}
}
8.測試完畢,開始寫Servlet類,首先我們需要一個LoginServlet類來判斷使用者是否通過驗證,再去跳轉到對應的頁面
這裡如果一個個去擷取值的話,再一個個封裝成User類的話太麻煩了。采用工具類BeanUtils的populate()方法來簡化這個過程
package text.web;
import org.apache.commons.beanutils.BeanUtils;
import text.dao.UserDao;
import text.userclass.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;
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 {
request.setCharacterEncoding("utf-8");
// String username = request.getParameter("username");
// String password = request.getParameter("password");
// //建立user對象
// User user=new User();
// user.setUsername(username);
// user.setPassword(password);
Map<String, String[]> parameterMap = request.getParameterMap();
User user=new User();
try {
BeanUtils.populate(user,parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//使用UserDao來判斷資料庫中是否有比對資料
UserDao userDao=new UserDao();
User login = userDao.login(user);
if(login!=null){
request.setAttribute("user",user);
request.getRequestDispatcher("/successServlet").forward(request,response);
}else{
request.getRequestDispatcher("/failServlet").forward(request,response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
9.實作成功和失敗的兩種Servlet類
SuccessServlet類
package text.web;
import text.userclass.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 {
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);
}
}
FailServlet類
package text.web;
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);
}
}
結果
登陸login.html
輸入對的資料
輸入錯的資料