1.1.1.1案例需求描述
提供登錄頁面,用於用戶登錄(用戶名和密碼需要查詢數據庫)。如果登錄失敗,需要回到登錄頁面(給出提示信息)。如果登錄成功,頁面進行跳轉,在成功頁面上顯示登錄成功的總人數。
1.1.1.2案例流程分析
1.1.1.3案例准備 -創建數據庫
1.1.1創建數據庫
1.1.1.3建表語句
create database web02_login;
use web02_login;
create table user(
uid int primary key auto_increment,
username varchar(20),
password varchar(20),
nickname varchar(20)
);
insert into user values (null,'zs','123','張三');
insert into user values (null,'ls','123','李四');
insert into user values (null,'ww','123','王五');
1.1.1.4導入相關jar包
其導入的包為數據庫連接池-druid和數據庫連接驅動
項目包結構
1.1.1.5login.jsp
jsp的運行原理
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% /** * 判斷request域中是否有錯誤信息:(第一次進入登錄頁面的時候,沒有錯誤信息) * * 如果有錯誤信息:顯示錯誤信息 */ String msg = ""; if(request.getAttribute("msg") != null){ // 有錯誤信息:顯示錯誤信息: msg = (String)request.getAttribute("msg"); } %> <h1>登錄界面</h1> <h3><font color="red"><%=msg%></font></h3> <form action="/WEB04_login/LoginServlet" method="post"> <table border="1" width="600"> <tr> <td>用戶名</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>密碼</td> <td><input type="password" name="password"/></td> </tr> <tr> <td colspan="2"><input type="submit" value="登錄"></td> </tr> </table> </form> </body> </html>
1.1.1.6登錄成功的界面-success.jsp
<%@page import="domain.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% //進行判斷用戶是否通過登錄界面 if(request.getSession().getAttribute("existUser") == null){ %> <!-- 當需要添加html標簽時需要進行隔開 --> <h1>你好,你還沒有登錄,請點擊鏈接進行登錄<a href="/WEB04_login/login.jsp">登錄</a></h1> <% }else{ %> <h1>用戶登陸成功</h1> <% User user = (User)request.getSession().getAttribute("existUser"); int count = (int)request.getServletContext().getAttribute("count"); %> <h3>你好:<%= user.getUsername()%></h3> <h3>總的登陸成功的人數<%= count %></h3> <% } %> </body> </html>
1.1.1.7控制層(controller)
1.InitServlet.java
package controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** *初始化的servlet *將這個Servlet配置成啟動時加載 */ public class InitServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override /** * 初始化的方法: */ public void init() throws ServletException { // 初始一個值為0。 int count = 0; // 將這個值存入到ServletContext域中。 this.getServletContext().setAttribute("count", count); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
這里需要注意的是需要對這個servlet在web.xml中進行配置
通過<load-on-startup>標簽中進行配置,標簽中填入一個大於2的整形數字(因為tomcat服務器中有一個servlet默認的優先級為1),其數字越小,在服務器啟動加載的優先級越高!
2.LoginServlet.java
package controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import model.UserModel; import domain.User; /** * Servlet implementation class LoginServlet */ public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // 接收數據 // 處理中文亂碼 request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username+password); // 封裝數據 User user = new User(); user.setUsername(username); user.setPassword(password); User login = UserModel.Login(username, password); // 處理數據 if (login == null) { // 登錄失敗 // 向request域中保存一個數據 request.setAttribute("msg", "用戶名或密碼錯誤"); // 使用請求轉發進行頁面跳轉 request.getRequestDispatcher("login.jsp").forward(request, response); } else { // 登錄成功 //保存用戶信息 HttpSession session = request.getSession(); session.setAttribute("existUser",login); // 記錄登錄成功的人數: // 將ServletContext中的值取出 +1 int count = (int) this.getServletContext() .getAttribute("count"); // 進行了+1的操作 count++; // 將+1后的值存回到ServletContext中去。 this.getServletContext().setAttribute("count", count); // 重定向到成功頁面 response.sendRedirect("/WEB04_login/success.jsp"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
接受數據類-User.java
package domain; /** * @author ztr * @version 創建時間:2021年4月16日 上午11:00:32 * 類說明 */ public class User { private Integer uid; private String username; private String password; public User(Integer uid, String username, String password) { super(); this.uid = uid; this.username = username; this.password = password; } public User() { super(); // TODO Auto-generated constructor stub } public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } 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; } }
數據處理類-UserModel.java
package model; import java.sql.Connection; import domain.User; import utils.*; /** * @author ztr * @version 創建時間:2021年4月16日 上午11:02:13 類說明 */ public class UserModel { public static User Login(String username, String password) throws Exception { Connection connection = JdbcUtils.GetConnection(); String sql = "select username,password from user where username = ? and password = ?"; User user = BaseDao.GetInstance(connection, User.class, sql, username, password); return user; } }
數據庫連接工具類
JdbcUtils.java
package utils; import java.io.InputStream; import java.util.Properties; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; /** * @author ztr * @version 創建時間:2021年3月29日 上午10:20:16 類說明 */ /* * 獲取連接 * * @return Connection */ public class JdbcUtils { public JdbcUtils() { super(); // TODO Auto-generated constructor stub } private static DataSource source; static { try { Properties pro = new Properties(); InputStream is = JdbcUtils.class.getClassLoader() .getResourceAsStream("druid.properties"); pro.load(is); source = DruidDataSourceFactory.createDataSource(pro); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Connection GetConnection() throws Exception { Connection connection = source.getConnection(); return connection; } /* * 關閉資源 */ public static void closeResource(Connection connection, PreparedStatement ps) { try { if (ps != null) ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if (connection != null) connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* * 關閉資源 */ public static void closeResource1(Connection connection, PreparedStatement ps, ResultSet rs) { try { if (ps != null) ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if (connection != null) connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if (rs != null) rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
BaseDao.java
package utils; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.ArrayList; import java.util.List; /** * @author ztr * @version 創建時間:2021年4月16日 上午11:21:09 類說明 */ public class BaseDao { // 通用的增刪改操作 public static void update(Connection connection, String sql, Object... args) { // 獲取數據連接 // 預編譯sql語句返回preparedStatement PreparedStatement prepareStatement = null; try { prepareStatement = connection.prepareStatement(sql); // 填充占位符 // prepareStatement.setObject的下標從1開始 for (int i = 0; i < args.length; i++) { prepareStatement.setObject(i + 1, args[i]); } // 執行 prepareStatement.execute(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 資源的關閉 JdbcUtils.closeResource(null, prepareStatement); } } /** * 返回一個數據 * * @param clazz * @param sql * @param args * @return */ public static <T> T GetInstance(Connection connection, Class<T> clazz, String sql, Object... args) { PreparedStatement prepareStatement = null; // 獲取結果集 ResultSet resultSet = null; try { prepareStatement = connection.prepareStatement(sql); for (int i = 0; i < args.length; i++) { prepareStatement.setObject(i + 1, args[i]); } resultSet = prepareStatement.executeQuery(); // 獲取元數據 ResultSetMetaData metaData = resultSet.getMetaData(); // 通過metaData獲取結果集中的列數 int columnCount = metaData.getColumnCount(); if (resultSet.next()) { T newInstance = clazz.newInstance(); for (int i = 0; i < columnCount; i++) { // 獲取列值 Object columnValue = resultSet.getObject(i + 1); // 獲取每列的列名 String columnName = metaData.getColumnLabel(i + 1); // 利用反射 Field field = clazz.getDeclaredField(columnName); // 考慮該屬性是否為私有 field.setAccessible(true); field.set(newInstance, columnValue); } return newInstance; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 關閉資源 JdbcUtils.closeResource1(null, prepareStatement, resultSet); } return null; } /** * 返回多條數據 * @param connection * @param clazz * @param sql * @param args * @return */ public static <T> List<T> getList(Connection connection, Class<T> clazz, String sql, Object... args) { PreparedStatement prepareStatement = null; // 獲取結果集 ResultSet resultSet = null; try { prepareStatement = connection.prepareStatement(sql); for (int i = 0; i < args.length; i++) { prepareStatement.setObject(i + 1, args[i]); } resultSet = prepareStatement.executeQuery(); // 獲取元數據 ResultSetMetaData metaData = resultSet.getMetaData(); // 通過metaData獲取結果集中的列數 int columnCount = metaData.getColumnCount(); // 創建集合對象 ArrayList<T> list = new ArrayList<T>(); while (resultSet.next()) { T newInstance = clazz.newInstance(); for (int i = 0; i < columnCount; i++) { // 獲取列值 Object columnValue = resultSet.getObject(i + 1); // 獲取每列的列名 String columnName = metaData.getColumnLabel(i + 1); // 利用反射 Field field = clazz.getDeclaredField(columnName); // 考慮該屬性是否為私有 field.setAccessible(true); field.set(newInstance, columnValue); } list.add(newInstance); } return list; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 關閉資源 JdbcUtils.closeResource1(null, prepareStatement, resultSet); } return null; } }
數據庫連接池配置文件-druid.properties
url=jdbc:mysql://localhost:3306/web02_login
username=root
password=XXX
driverClassName=com.mysql.cj.jdbc.Driver
運行結果
登錄界面
用戶名或者密碼錯誤
登陸成功
以上博文只是記錄學習,若有錯誤之處,還請大家諒解。