基於servlet+原生dbc的登入案例(含servlet知識點梳理)

生命線與髮際線發表於2020-12-25


前言

為什麼寫這篇文章:我的一篇學習筆記,同時分享給大家,互幫互助共同進步。
適宜人群: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展示結果

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述\

相關文章