基於servlet+原生dbc的登入案例(含servlet知識點梳理)
前言
為什麼寫這篇文章:我的一篇學習筆記,同時分享給大家,互幫互助共同進步。
適宜人群:java初學者
你將學習到:servlet相關知識
條件:java開發相關環境(jdk、mysql、Tomcat、idea)
資料參考:網路,https://blog.csdn.net/qq_19782019/article/details/80292110
注意:本文僅供學習使用,如有侵權,請聯絡作者刪除。
一、servlet知識點梳理
1.什麼是servlet
servlet是用Java編寫的伺服器端程式,其主要功能在於互動式地瀏覽和修改資料,生成動態Web內容。Servlet技術的核心是Servlet,它是所有Servlet類必須直接或者間接實現的一個介面。
2.servlet是如何工作的?
- 客戶端傳送請求到伺服器
- 伺服器啟動並呼叫Servlet,Servlet根據客戶端請求生成響應內容並將其傳給伺服器
- 伺服器將響應返回客戶端
3.servlet的工作原理
使用者請求致使Servlet容器呼叫Servlet的Service()方法,並傳入一個ServletRequest物件和一個ServletResponse物件。ServletRequest物件和ServletResponse物件都是由Servlet容器(例如TomCat)封裝好的,並不需要程式設計師去實現,程式設計師可以直接使用這兩個物件。ServletRequest中封裝了當前的Http請求,因此,開發人員不必解析和操作原始的Http資料。ServletResponse表示當前使用者的Http響應,程式設計師只需直接操作ServletResponse物件就能把響應輕鬆的發回給使用者。
4.servlet介面中定義的5個方法
- init():只有在servlet第一次被請求時會呼叫此方法,呼叫這個方法時,Servlet容器會傳入一個ServletConfig()物件進來從而對Servlet物件進行初始化。
- getServletConfig:這個方法會返回Servlet的一段描述,可以返回一段字串。
- service():每當請求Servlet時,Servlet容器就會呼叫這個方法。
- getServletInfo():返回Servlet的一段描述,返回由Servlet容器傳給init( )方法的ServletConfig物件。
- destroy():當Servlet被銷燬時,Servlet容器就會呼叫這個方法,一般在這個方法中會寫一些清除程式碼。
5.servlet的生命週期
init( ),service( ),destroy( )是Servlet生命週期的方法。代表了Servlet從“出生”到“工作”再到“死亡 ”的過程。
1.init( ),當Servlet第一次被請求時,Servlet容器就會開始呼叫這個方法來初始化一個Servlet物件出來,但是這個方法在後續請求中不會在被Servlet容器呼叫,就像人只能“出生”一次一樣。我們可以利用init( )方法來執行相應的初始化工作。呼叫這個方法時,Servlet容器會傳入一個ServletConfig物件進來從而對Servlet物件進行初始化。
2.service( )方法,每當請求Servlet時,Servlet容器就會呼叫這個方法。就像人一樣,需要不停的接受老闆的指令並且“工作”。第一次請求時,Servlet容器會先呼叫init( )方法初始化一個Servlet物件出來,然後會呼叫它的service( )方法進行工作,但在後續的請求中,Servlet容器只會呼叫service方法了。
3.destory,當要銷燬Servlet時,Servlet容器就會呼叫這個方法,就如人一樣,到時期了就得死亡。在解除安裝應用程式或者關閉Servlet容器時,就會發生這種情況,一般在這個方法中會寫一些清除程式碼。
6.ServletRequset介面
Servlet容器對於接受到的每一個Http請求,都會建立一個ServletRequest物件,並把這個物件傳遞給Servlet的Sevice( )方法。其中,ServletRequest物件內封裝了關於這個請求的許多詳細資訊。
方法:
7.ServletResponse介面
ServletResponse介面表示一個Servlet響應,在呼叫Servlet的Service( )方法前,Servlet容器會先建立一個ServletResponse物件,並把它作為第二個引數傳給Service( )方法。ServletResponse隱藏了向瀏覽器傳送響應的複雜過程。
方法:
8.ServletContext物件
有了ServletContext物件,就可以共享從應用程式中的所有資料處訪問到的資訊,並且可以動態註冊Web物件。
方法:
9.解決Request的亂碼問題
post提交方式:
request.setCharacterEncoding("UTF-8");
get提交的方式:
parameter = newString(parameter.getbytes("iso8859-1"),"utf-8");
10.解決Response的亂碼問題
response.setContentType("text/html;charset=utf-8");
上面這行程式碼做了兩件事情:設定HttpServletResponse使用utf-8編碼,通知瀏覽器使用utf-8編碼。
11.會話跟蹤技術(cookie和session)
會話(Session)跟蹤是Web程式中常用的技術,用來跟蹤使用者的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器端記錄資訊確定使用者身份。
(1)什麼是cookie
可以理解為伺服器給客戶端們頒發一個通行證,每人一個,無論誰訪問都必須攜帶自己通行證。這樣伺服器就能從通行證上確認客戶身份了
(2)什麼是session
Session是另一種記錄客戶狀態的機制,不同的是Cookie儲存在客戶端瀏覽器中,而Session儲存在伺服器上。客戶端瀏覽器訪問伺服器的時候,伺服器把客戶端資訊以某種形式記錄在伺服器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查詢該客戶的狀態就可以了。Session相當於程式在伺服器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。
(3)cookie和session的區別
- cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。
- 安全性方面來說,session要比cookie安全。
- 儲存容量方面,單個cookie儲存的資料不能超過4K,Session物件沒有對儲存的資料量的限制,其中可以儲存更為複雜的資料型別。
- 生存週期不同,一個是IE啟動到IE關閉.(瀏覽器頁面一關 ,session就消失了),一個是預先設定的生存週期,或永久的儲存於本地的檔案。(cookie)
二、基於servlet+jdbc的登入案例
1.需求分析
(1)編寫login.html登入頁面,username & password兩個輸入框
(2)使用原生JDBC運算元據庫
(3)登入成功,跳轉到Success頁面,顯示“登陸成功。使用者名稱,歡迎您”
(4)登入失敗,跳轉到Fail頁面,顯示“登入失敗,使用者名稱或密碼錯誤”
2.準備以下檔案
(1)login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/servlet/loginServlet" method="post">
使用者名稱:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
<input type="submit" value="登入">
</form>
</body>
</html>
注意路徑,form表單裡的action屬性對應自己的
(2)jdbc.properties
url=jdbc:mysql:///servlet
user=root
password=root
driver=com.mysql.jdbc.Driver
這裡的servlet為我的資料庫
(3)相關jar包
連結:https://pan.baidu.com/s/1MHayI9JG3XcMqaUlzwUC_w
提取碼:c9hc
複製這段內容後開啟百度網盤手機App,操作更方便哦
(4)建立資料庫環境
CREATE DATABASE servlet;
USE servlet;
CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32) UNIQUE NOT NULL,
password VARCHAR(32) NOT NULL
);
資料庫建立好後,可以自己新增一兩行測試資料
3.建立新的javaEE專案
4.將login.html複製到web目錄下,將jdbc.properties複製到src下
5.匯入jar包
連結:https://pan.baidu.com/s/1VTTv4tF0Oxa_UXDoE3Sdxw
提取碼:3c92
複製這段內容後開啟百度網盤手機App,操作更方便哦
6.編寫Dao
public class UserDao {
/**
* 登入方法
*
* @param username
* @param password
* @return
*/
public boolean login(String username, String password) {
if (username == null || password == null) {
return false;
}
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//獲取連線
conn = JDBCUtils.getConnection();
//定義SQL
String sql = "select * from user where username = ? and password = ?";
//獲取執行SQL的物件
pstmt = conn.prepareStatement(sql);
//給問號賦值
pstmt.setString(1,username);
pstmt.setString(2,password);
//執行查詢,獲取結果集物件
rs = pstmt.executeQuery();
//判斷結果
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, pstmt, conn);
}
return false;
}
}
7.建立JDBC工具類
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/**
* jdbc.properties檔案的讀取
*/
static {
try {
Properties pro = new Properties();
//獲取src路徑下的檔案
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
pro.load(new FileReader(path));
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//註冊驅動
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 獲取連線
*
* @return
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
/**
* 釋放資源
*
* @param stmt
* @param conn
*/
public static void close(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
8.編寫LoginServlet類
(1)LoginServlet
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設定編碼
req.setCharacterEncoding("utf-8");
//獲取請求引數
String username = req.getParameter("username");
String password = req.getParameter("password");
//呼叫UserDao的login方法
boolean flag = new UserDao().login(username, password);
//判斷
if (flag) {
//儲存資料
req.setAttribute("username",username);
//轉發
req.getRequestDispatcher("/successServlet").forward(req,resp);
} else {
req.getRequestDispatcher("/failServlet").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
(2)SuccessServlet
@WebServlet("/successServlet")
public class SuccessServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取request域中共享的資料
String username = (String) request.getAttribute("username");
//設定編碼
response.setContentType("text/html;charset=utf-8");
//輸出
response.getWriter().write("登入成功!"+username+"歡迎你。");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
(3)FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設定編碼
response.setContentType("text/html;charset=utf-8");
//輸出
response.getWriter().write("登入失敗,使用者名稱或密碼錯誤");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
9.啟動Tomcat展示結果
\
相關文章
- Servlet基礎知識點整理Servlet
- 前端關於單點登入的知識前端
- Java基礎知識點梳理Java
- Python基礎知識點梳理Python
- 多執行緒基礎知識點梳理執行緒
- JVM面試知識點梳理JVM面試
- Angular常用知識點梳理Angular
- js基礎知識梳理JS
- kafka基礎知識梳理Kafka
- MongoDB基礎知識梳理MongoDB
- 【整理】JVM知識點大梳理JVM
- JS函式知識點梳理JS函式
- Flex 佈局知識點梳理Flex
- 雲原生時代|分散式系統設計知識圖譜(內含 22 個知識點)分散式
- 原生JS知識點整理JS
- 軟體測試知識儲備:關於「登入安全」的基礎知識,你瞭解多少?
- Dubbo基礎入門知識點
- Java入門基礎知識點Java
- 圖片上傳知識點梳理
- Redux 知識點梳理和實踐Redux
- Extjs相關知識點梳理JS
- Python教程分享之Python基礎知識點梳理Python
- 基礎知識梳理~資料庫資料庫
- 雲原生時代,分散式系統設計必備知識圖譜(內含22個知識點)分散式
- Python培訓教程之Python基礎知識點梳理Python
- 《面試補習》- JVM知識點大梳理面試JVM
- 一起來梳理JVM知識點JVM
- 關於umijs+dva+antDesign 一些知識點的梳理JS
- Python入門必知的知識點!Python基礎入門Python
- RxJava 知識梳理(3) RxJava2 基礎知識小結RxJava
- 超全面的Linux基礎知識的梳理Linux
- web知識梳理Web
- Mysql知識梳理MySql
- JavaWeb知識梳理JavaWeb
- webpack 知識梳理Web
- Java之JSP和Servlet基礎知識。JavaJSServlet
- 非常全面的 Android Bitmap 知識點梳理Android
- AcWing 進階課知識點模板梳理