資料下載鏈接
介紹
基于Servlet框架的管理系統?簡潔版?;
實現?登錄?、?注冊?、?增?、?刪?、?改?、?查?;
可繼續完善增加前端、校驗、其他功能等;
可作為?Servlet項目?開發練習基礎模型;
課程設計?、?畢業設計?開發基礎;
任何復雜的框架都是簡單的知識組合并延伸的,學好基礎知識才是最重要的;
此項目簡單,便于理解基本原理,為復雜的Servlet、SSH、SSM等復雜項目的開發打下基礎。
環境準備
開發平臺:Idea 2019
數據庫:MySQL 5.0.22
服務器:Tomcat 9.0.37
注意:需要安裝IDEA開發平臺、MySQL數據庫和Tomcat服務器,版本不一定完全一致,做好版本適應性配置即可。
項目結構
1.數據庫及Java代碼文件?
2.Jsp等前端代碼?
3.Tomcat服務器配置與運行
4.MySQL數據庫?
基本原理
1. 相關概念
Servlet是一門用于開發動態web網頁的技術,用于交互式地瀏覽和修改數據,生成動態Web內容。如今Java Web開發中已經很少單純用到Servlet去開發Web應用,更多是整合框架開發。實際上,大多框架都是基于基礎工具去封裝起來的,像Struts就是對servlet與filter的封裝,Hibernate對JDBC的封裝等等。所以,無論學習什么框架,首先深入理解基礎知識,從而對框架中出現的問題有一個理性的認識與解決。
2. 基本原理
2.1工作流程
-
Web Client 向Servlet容器(Tomcat)發出Http請求
-
Servlet容器接收Web Client的請求
-
Servlet容器創建一個HttpRequest對象,將Web Client請求的信息封裝到這個對象中。
-
Servlet容器創建一個HttpResponse對象
-
Servlet容器調用HttpServlet對象的service方法,把HttpRequest對象與HttpResponse對象作為參數傳給 HttpServlet 對象。
-
HttpServlet調用HttpRequest對象的有關方法,獲取Http請求信息。
-
HttpServlet調用HttpResponse對象的有關方法,生成響應數據。
-
Servlet容器把HttpServlet的響應結果傳給Web Client。
2.2處理請求流程
-
用戶點擊一個鏈接,指向了一個servlet而不是一個靜態頁面。
-
容器“看出”這個請求是一個Servlet,所以它創建了兩個對象HttpServletRequest和HttpServletResponse。
-
容器根據請求中的URL找到正確的Servlet,為這個請求創建或分配一個線程,并把請求和響應對象傳遞給這個Servlet線程。
-
容器調用Servlet的service()方法。根據請求的不同類型,service()方法會調用doGet()或doPost()方法。這里假設調用doGet()方法。
-
doGet()方法生成動態頁面,并把這個頁面“塞到”響應對象里,需要注意的是,容器還有響應對象的一個引用!
-
線程結束,容器把響應對象轉換為一個HTTP響應,并把它發回給客戶,然后刪除請求和響應對象。
2.3工作原理
? 1. 首先簡單解釋一下Servlet接收和響應客戶請求的過程,首先客戶發送一個請求,Servlet是調用service()方法對請求進行響應的,通過源代碼可見,service()方法中對請求的方式進行了匹配,選擇調用doGet,doPost等這些方法,然后再進入對應的方法中調用邏輯層的方法,實現對客戶的響應。在Servlet接口和GenericServlet中是沒有doGet()、doPost()等等這些方法的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個Servlet的時候,都必須實現doGet或doPost等這些方法。
? 2. 每一個自定義的Servlet都必須實現Servlet的接口,Servlet接口中定義了五個方法,其中比較重要的三個方法涉及到Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個通用的,不特定于任何協議的Servlet,它實現了Servlet接口。而HttpServlet繼承于GenericServlet,因此HttpServlet也實現了Servlet接口。所以我們定義Servlet的時候只需要繼承HttpServlet即可。
? 3. Servlet接口和GenericServlet是不特定于任何協議的,而HttpServlet是特定于HTTP協議的類,所以HttpServlet中實現了service()方法,并將請求ServletRequest、ServletResponse 強轉為HttpRequest 和 HttpResponse。
2.4Servlet生命周期
servlet程序是由web服務器調用,web服務器實現了對servlet生命周期的管理。當你的應用加載并使用一個Servlet時,從初始化到銷毀這個Servlet期間會發生一系列的事件,這些事件叫做Servlet的生命周期事件(或方法)。
Servlet 生命周期可以歸納為:
Servlet 加載--->實例化--->服務--->銷毀
Servlet生命周期定義了一個Servlet如何被加載、初始化,以及它怎樣接收請求、響應請求,提供服務。
1. 創建Servlet實例web容器負責加載Servlet,當web容器啟動時或者是在第一次使用這個Servlet時,容器會負責創建Servlet實例,但是用戶必須通過部署描述符(web.xml)指定Servlet的位置,也就是Servlet所在的類名稱,成功加載后,web容器會通過反射的方式對Servlet進行實例化。2. WEB容器調用Servlet的init()方法,對Servlet進行初始化在Servlet實例化之后,Servlet容器會調用init()方法,來初始化該對象,主要是為了讓Servlet對象在處理客戶請求前可以完成一些初始化的工作,例如,建立數據庫的連接,獲取配置信息等。對于每一個Servlet實例,init()方法只能被調用一次。init()方法有一個類型為ServletConfig的參數,Servlet容器通過這個參數向Servlet傳遞配置信息。Servlet使用ServletConfig對象從Web應用程序的配置信息中獲取以名-值對形式提供的初始化參數。另外,在Servlet中,還可以通過ServletConfig對象獲取描述Servlet運行環境的ServletContext對象,使用該對象,Servlet可以和它的Servlet容器進行通信。無論有多少客戶機訪問Servlet,都不會重復執行init()。3. Servlet初始化之后,將一直存在于容器中,service()響應客戶端請求① 如果客戶端發送GET請求,容器調用Servlet的doGet方法處理并響應請求② 如果客戶端發送POST請求,容器調用Servlet的doPost方法處理并響應請求③ 或者統一用service()方法處理來響應用戶請求service()是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調用,而且傳遞給這個方法一個“請求”(ServletRequest)對象和一個“響應”(ServletResponse)對象作為參數。在HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。要注意的是,在service()方法被容器調用之前,必須確保init()方法正確完成。容器會構造一個表示客戶端請求信息的請求對象(類型為ServletRequest)和一個用于對客戶端進行響應的響應對象(類型為ServletResponse)作為參數傳遞給service()方法。在service()方法中,Servlet對象通過ServletRequest對象得到客戶端的相關信息和請求信息,在對請求進行處理后,調用ServletResponse對象的方法設置響應信息。4. WEB容器決定銷毀Servlet時,先調用Servlet的destroy()方法,通常在關閉web應用之前銷毀Servletdestroy()僅執行一次,在服務器端停止且卸載Servlet時執行該方法。當容器檢測到一個Servlet對象應該從服務中被移除的時候,容器會調用該對象的destroy()方法,以便讓Servlet對象可以釋放它所使用的資源,保存數據到持久存儲設備中,例如,將內存中的數據保存到數據庫中,關閉數據庫的連接等。當需要釋放內存或者容器關閉時,容器就會調用Servlet對象的destroy()方法。在Servlet容器調用destroy()方法前,如果還有其他的線程正在service()方法中執行,容器會等待這些線程執行完畢或等待服務器設定的超時值到達。一旦Servlet對象的destroy()方法被調用,容器不會再把其他的請求發送給該對象。如果需要該Servlet再次為客戶端服務,容器將會重新產生一個Servlet對象來處理客戶端的請求。在destroy()方法調用之后,容器會釋放這個Servlet對象,在隨后的時間內,該對象會被Java的垃圾收集器所回收。注意①在正常情況下,Servlet只會初始化一次,而處理服務會調用多次,銷毀也只會調用一次;但是如果一個Servlet長時間不使用的話,也會被容器自動銷毀,而如果需要再次使用時會重新進行初始化的操作,即在特殊情況下初始化可能會進行多次,銷毀也可能進行多次。②在servlet實例創建之后,在servlet能為客戶請求提供服務之前,容器會在servlet實例上調用init()方法。如果你有初始化代碼,就應該覆蓋servlet類的init()方法,否則會調用GenericServlet的init()方法。而對應每個客戶請求(無論是誰,無論是不是同一個人,只針對請求),容器都會創建一對新的請求和響應對象,創建一個新的線程/棧。任何servlet類都不會有多個實例,除非一種特殊情況(SingleThreadModel)。③ servlet生命周期的4個周期總結如下: a. 實例化以及加載servlet,new的過程b. 初始化init(ServletConfig)。c. 處理請求,調用servlet的service,doget,dopost方法將Request和Response,作為參數傳遞。d. 退出服務,調用destory方法釋放資源。
頁面展示
1.登錄頁面
2.注冊頁面?
3.主頁?
4.展示頁面
5.新增頁面?
6.刪除頁面?
7.修改頁面?