Servlet入門詳細教程(你不得不知道的Servlet知識點)


“人生如一杯茶,不會苦一輩子,但要苦一陣子。”
你好,我是夢陽辰!和我一起學習起來吧!

01.JavaEE概述

Java EE實質上是sun(oracle)公司為我們提供的強大的類庫。

Java SE實質就是sun(oracle)公司提供的一套基礎的類庫。

Java EE是 J2EE的一個新的名稱,之所以改名,目的還是讓大家清楚J2EE只是Java企業應用.隨着WEB和EJB容器概念誕生,使得軟件應用業開始擔心SUN的伙伴們是否還在Java平台上不斷推出翻新的標准框架,致使軟件應用業的業務核心組件架構無所適從,從一直以來是否需要EJB的討論聲中說明了這種彷徨。

在2004年底中國軟件技術大會Ioc微容器(也就是Jdon框架的實現原理)演講中指出:我們需要一個跨J2SE/WEB/EJB的微容器,保護我們的業務核心組件(中間件),以延續它的生命力,而不是依賴J2SE/J2EE版本.此次J2EE改名為Java EE,實際也反映出業界這種共同心聲。

Java EE的核心是EJB3.0, 其提供了更兼便捷的企業級的應用框架。
1.什么是JavaSE?
Java的標准版本
sun公司為java程序員提供的一套基礎類庫。這套基礎類庫包括基礎語法、面向對象、異常、IO、集合、反射、線程
目前JavaSE由Oracle公司維護。

2.什么是API?包括什么?
應用程序接口
API包括:源碼、字節碼、幫助文檔

3.JavaSE的src、字節碼、幫助文檔在哪里?
JAVA_HOME\src.zip
JRE_HOME\lib\rt.jar
幫助文檔,官網。

4.什么是JavaEE?
Java企業版
SUN公司為Java程序員准備另一套龐大的類庫,幫助程序員完成企業級項目開發。
JavaEE規范是一個比較大的規范,JavaEE包括13個子規范(每一個子規范下其實還有其他的子規范)

JavaEE5規范下的子規范:
Servlet2.5
JDBC

JavaEE6規范下的子規范。
Servlet3.0

Tomcat服務器,其中Tomcat6實現了Servlet2.5規范,Tomcat實現了Servlet3.0規范。

5.JavaEE的源碼、字節碼、幫助文檔在哪里?

02.系統架構分析

系統架構分類
C/S
B/S
什么是C/S呢?
各種app。
優點:大部分數據都以集成到客戶端軟件中,只需要從服務器上傳送少量數據即可。速度快。

升級麻煩。

什么是B/S呢?
客戶端為瀏覽器。不需要安裝特定的客戶端。升級方便。
缺點:速度慢,體驗差。
以后主要的研究方向。

BS架構訪問過程

注意:Servlet接口由程序員實現,服務器來調用。

在這里插入圖片描述
Servlet:是兩個英語單詞的合並,Serv表示服務器端,let表示小程序。
在這里插入圖片描述

03.Servelt

Java Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數據庫或應用程序之間的中間層。

使用 Servlet,您可以收集來自網頁表單的用戶輸入,呈現來自數據庫或者其他源的記錄,還可以動態創建網頁。

知識引入:
1.Sun公司制定的JavaEE規范:Servlet規范
Servlet接口是Servlet規范中核心接口

接口注意:調用這是誰?實現者是誰?

public interface Servlet{//Servlet接口 void service(); } 

2.JavaWeb程序員
JavaWeb編寫服務器端小java程序的時候,不能隨意編寫,必須實現Servlet接口。

public class DeleteServlet implements Servlet{ public void service(){ System.out.println("連接數據庫,成功..."); } } 

3.Tomcat服務器調用(自動調用)
WebServer Web服務器 ,Web Container
Web容器面向Servlet接口調用。

模擬Tomcat服務器
在這里插入圖片描述
Tomcat服務器負責調用。2

作為Web程序員我們只要實現Servlet接口,並配置號.xml文件即可。

04.開發第一個帶有Servlet的webapp(重點)

1.一個webapp只有一個web.xml文件。
web.xml文件主要配置請求路徑和Servlet類名之間的綁定關系。

web.xml文件在Tomcat服務器啟動階段被解析。解析失敗會導致webapp啟動失敗。web.xml文件中的標簽不能隨意編寫。
在這里插入圖片描述
在項目目錄下必須有一個WEB-INF文件夾。並且在WEB-INF文件夾下必須有classes文件夾,lib文件夾和web.xml配置文件。

.class文件放在classes文件夾下。
實例:
編寫Java程序,將編譯生成的class文件放在classes目錄下。
在這里插入圖片描述
在這里插入圖片描述
配置web.xml


注意對於xml配置文件的<url-pattern>中的路徑不需要添加項目名。 但是對於Hello.html的文件的超鏈接需要在前面添加項目名,因為超鏈接可能 會轉到其他項目中,也可能轉到其他網站,所以需要在其前面添加項目名稱。 

在這里插入圖片描述

05.在Servlet中編寫JDBC連接數據庫(重點)

java代碼:(其它類似)

package Part1; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class MengYangChenWorkers implements Servlet { @Override public void destroy() { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } @Override public void init(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub } @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); out.print("<html>"); out.print("<head>"); out.print("<title>員工信息</title>"); out.print("</head>"); out.print("<body>"); out.print("<h2 align='center'>員工列表</h2>"); out.print("<hr width='60%'>"); out.print("<table border='1' align='center' width='50%'>"); out.print("<tr align='center'>"); out.print("<th>編號</th>"); out.print("<th>姓名</th>"); out.print("<th>性別</th>"); out.print("<th>部門</th>"); out.print("<th>生日</th>"); out.print("</tr>"); //JDBC Connection conn=null; PreparedStatement ps =null; ResultSet rs= null; try { Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/newdata","root","0910"); String sql="select num,name,sex,classnum,birthday from t_student"; ps=conn.prepareStatement(sql); rs=ps.executeQuery(); while(rs.next()) { String num=rs.getString("num"); String name=rs.getString("name"); String sex=rs.getString("sex"); String classnum=rs.getString("classnum"); String birthday=rs.getString("birthday"); out.print("<tr align='center'>"); out.print("<th>"+num+"</th>"); out.print("<th>"+name+"</th>"); out.print("<th>"+sex+"</th>"); out.print("<th>"+classnum+"</th>"); out.print("<th>"+birthday+"</th>"); out.print("</tr>"); } }catch(Exception e) { e.printStackTrace(); }finally { if(rs!=null) try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(ps!=null) try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(conn!=null) try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } out.print("</table>"); out.print("</body>"); out.print("</html>"); } } 

在eclipse中Ctrl+ shift +O可以快速導包。Ctrl+O提示類中所有的方法,用於快速查找。
在這里插入圖片描述

06.Servlet的生命周期

1.什么是生命周期
表示一個java對象從最初被創建到最終被銷毀,經歷的所有過程。

2.Servlet對象的生命周期是誰來管理的?程序員可以干涉嗎?
Servlet對象的生命周期,javaweb程序員是無權干涉的,包括該Servlet對象的相關方法的調用,javaweb程序員也是無權干涉的。Servlet對象從最初的創建,方法的調用,以及對象的銷毀,整個過程,是由WEB容器來管理的。
WEB Container管理Servlet對象的生命周期。

3.若希望在web服務器啟動階段實例話Servlet的對象需要進行特殊的設置。

4.從執行結果看:單實例多線程執行。多線程共享一個對象。
所有過程都是由web容器完成的,我們只需要編寫方法。

5.描述Servlet的生命周期。(重點)
1.用戶在瀏覽器地址欄上輸入url:http://localhost/ServletTimes/TestLifeCycle

2.web容器截取請求路徑/ServletTimes/TestLifeCycle

3.web容器在容器上下文中找請求路徑/ServletTimes/TestLifeCycle對應的Servlet對象。

4.若沒有找到對應的Servlet對象。

  • 4.1.通過web.xml文件中相關的配置信息,得到請求路徑/TestLifeCycle對應得Servlet完整類名。

  • 4.2.通過反射機制,調用Servlet類的無參數構造方法完成Servlet對象的實例化。

  • 4.3.web容器調用Servlet對象的init方法完成初始化操作。

  • 4.4.web容器調用Servlet對象的service方法提供服務。

5.若找到對應的Servlet對象。

  • 5.1.web容器直接調用Servlet對象的service方法提供服務。

6.web容器關閉的時候/webapp重新部署的時候/該Servlet對象長時間沒有用戶再次訪問的時候,web容器會將該Servlet對象銷毀,在銷毀對象前,web容器會調用Servler對象的destroy方法,完成銷毀之前的准備。

總結:
Servlet類的構造方法只執行一次。
Servlet對象的init方法只執行一次。
Servlet對象的service方法,只要用戶請求一次,則執行一次。
Servlet對象的destroy方法只執行一次。

注意:init方法執行的時候,Servlet對象已經被創建好了。destroy方法執行的時候Servler對象還沒有被銷毀,即將被銷毀。

Servlet對象是單實例,但是不符合單例模式,只能稱為偽單例,真單例的構造方法是私有化的,Tomcat服務器是至此多線程的。所以Servler對象在單實例多線程的環境下運行的。如果Servlet對象中有實例變量,並且實例變量涉及到修改操作,那么這個Servlet對象一定會存在線程安全問題,不建議在Servlet對象中使用實例變量,盡量使用局部變量。

6.如果希望在web服務器啟動階段實例化Servlet對象,需要在web.xml文件中進行相關的配置。

<servlet> <servlet-name>TestLifeCycle</servlet-name> <servlet-class>Part1.HelloServlet</servlet-class> <load-on-startup>1</load-on-startup>//這個為添加項 </servlet> 

load-on-startup中1的含義:表示優先級,當有多個類時,將按照這里的優先級,創建對象。自然數越小優先級越高。
例如:當有兩個類時。

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <welcome-file-list> <welcome-file>Welcome.html</welcome-file> </welcome-file-list> <servlet> <servlet-name>TestLifeCycle</servlet-name> <servlet-class>Part1.HelloServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>TestLifeCycle</servlet-name> <url-pattern>/Test</url-pattern> </servlet-mapping> <servlet> <servlet-name>Cycle</servlet-name> <servlet-class>Part1.WelcomeServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Cycle</servlet-name> <url-pattern>/Tef</url-pattern> </servlet-mapping> </web-app> 

7.Servlet對象實例化之后,這個Servlet對象被存儲到哪里?
大多數WEB容器都是將該Servlet對象以及對應的url-pattern存儲到Map集合中了。

在WEB容器中有這樣一個Map集合。
Map<Stirng,Servlet>集合

key      value
--------------------------- /login LoginServlet對象引用 /delete DeleteServlet對象引用 /save SaveServlet對象引用 

8.服務器在啟動的時候就會解析webapp的web.xml文件,做了什么?

將web.xml文件中的url-pattern和對應的Servlet完整類名存儲到Map集合中。

在WEB集合中有這樣一個Map集合(沒找到的時候)
Map<String,String>集合

key   value
---------------- /login Part1.LoginServlet /delete Part1.DeleteServlet 

9.Servlet接口中的這些方法中編寫什么代碼?什么時候使用這些方法。
9.1 無參構造方法【不考慮構造方法】
9.2 init方法
以上兩個方法執行事件幾乎相同,執行次數都是1,構造方法執行的時候對象正在創建,init方法執行的時候對象已經創建。
若系統要求在對象創建時刻執行一段特殊的程序,這段程序盡量寫到init方法中。

9.3 service方法。
這個方法是必然要重寫的,因為這個方法需要完成業務邏輯的處理,請求的處理,以及完成響應。

9.4 destrory方法。
這個方法也是SUN公司為javaweb程序員提供的一個特殊的時刻,這個特殊的時刻被稱為對象銷毀時刻。若希望在銷毀時可執行一段特殊的代碼,需要將這段代碼編寫到destroy方法,自動被容器調用。

回顧:
類加載時刻執行程序,代碼寫到哪里?
編寫到靜態代碼塊中。

結論:sun公司為我們程序員提供了很多個不同的時刻。若在這個特殊時刻執行特殊的程序,這些程序是有位置編寫的。

07.UML

1.什么是UML?
統一建模語言(Unified Modeling Language,UML)是一種為面向對象系統的產品進行說明、可視化和編制文檔的一種標准語言,是非專利的第三代建模和規約語言。UML是面向對象設計的建模工具,獨立於任何具體程序設計語言。

UML是一個獨立的學科。

UML屬於軟件工程學

2.UML建模工具?
StarUML
Rational Rose…

3.UML圖有哪些?
類圖:描述類的信息以及類與類之間的關系。
在這里插入圖片描述
時序圖:描述一個程序的執行過程。
在這里插入圖片描述
在這里插入圖片描述
狀態圖:描述一個對象的生命周期。

用例圖:站在系統用戶的角度分析系統中存在哪些功能。

在這里插入圖片描述
在這里插入圖片描述

08.javax.servlet.ServletConfig接口

1.Apache Tomcat服務器實現了Servlet規范,Tomcat服務器專門寫了一個ServletConfig接口的實現類。

實現類的完整類名是:org.apache.catalina.core.StandardWrapperFacade【了解即可】

2.javaweb程序員在編寫的時候,一直是面向ServletConfig接口去完成調用,不需要關心具體的實現類。

webapp放到Tomcat服務器中,ServletConfig的實現類是:org.apache.catalina.core.StandardWrapperFacade

webapp放到另一個服務器中(如JBOSS):ServletConfig的實現類可能是另外一個類名了。

3.Tomcat服務器是一個實現了Servlet規范和JSP規范的容器。

4.ServletConfig接口有哪些常用的方法。

//1.通過初始化參數的name獲取 String getInitParameter(String name) //2.獲取所有初始化參數的name Enumeration<String> getInitParameterNames() //3.獲取ServletContext【Servlet上下文】對象 ServletContext getServletContext() //4.獲取<servlet-name>servletname</servlet-name> String getServletName() 

對應的代碼實現:

package Part1; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class HelloServletConfigA implements Servlet { private ServletConfig config; @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub //將局部變量賦值給實例變量,使得其他方法中也可以使用config this.config=config; System.out.println("AServlet's ServletConfig="+config.toString()); } @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //獲取ServletConfig ServletConfig config=getServletConfig(); //1.通過初始化參數的name獲取value /* * String driver=config.getInitParameter("driver"); String * url=config.getInitParameter("url"); String * user=config.getInitParameter("user"); String * passcode=config.getInitParameter("passcode"); */ //2.獲取所有初始化參數的name /* * Enumeration<String> names=config.getInitParameterNames(); * while(names.hasMoreElements()) { * String name=names.nextElement(); * String value=config.getInitParameter(name); * out.print(name+"="+value); * out.print("<br>"); } */ //3.獲取ServletContext【Servlet上下文】對象 ServletContext application =config.getServletContext(); out.print(application.toString()); //4.獲取servlet Name /* * String servletName=config.getServletName(); * out.print("<servlet-name>"+servletName+"</servlet-name>"); */ /* * out.print(driver); out.print("<br>"); out.print(url); out.print("<br>"); * out.print(user); out.print("<br>"); out.print(passcode); */ } @Override public void destroy() { // TODO Auto-generated method stub } //這個方法供子類使用,在子類中若想獲取ServletConfig,可以調用這個方法 @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return config; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } } 

5.ServletConfig到底是什么?
ServletConfig是一個Servlet對象的配置信息對象,ServletConfig對象中封裝了一個Servlet對象的配置信息。
Servlet對象的配置信息在web.xml文件中。

一個Servlet對象對應一個ServletConfig對象,100個Servlet對象對應100個ServletConfig對象。

7.將init方法中的ServletConfig參數移動到service方法中,因為我們程序員主要編寫的方法是service方法,在service方法中我們可能需要使用Sevletconfig接口。

7.1在init方法中完成:局部變量config賦值給實例變量config

7.2實現getServletConfig方法,提供公開的get方法目的是供子類使用。

09.javax.servlet.ServletContext接口

1.javax.servlet.ServletContext接口,Servlet規范。

2.Tomcat服務器對ServletContext接口的實現類的完整類名:org.apache.catalina.core.ApplicationContextFacade

javaweb程序員還是只需要面向ServletContext接口調用方法即可,不需要關心Tomcata具體的實現。

3.ServletContext到底是什么?什么時候被創建?什么時候被銷毀?創建幾個?
ServletContext被翻譯為:Servlet上下文【Context一般翻譯為上下文】

一個webapp只有一個ServletContext對象

一個webapp只有一個web.xml文件,web.xml文件服務器啟動階段被解析。

ServletContext在服務器啟動階段被實例化。

ServletContex在服務器關閉的時候會被銷毀。

ServletContext對應的是web.xml文件,是web.xml文件的代表。

ServletContext是所有Servlet對象四周環境的代表。【在同一個webapp中,所有的Servlet對象共享一個四周環境對象,該對象就是Servletcontext】

所有的用戶若想共享同一個數據,可以將這個數據放到ServletContext對象中。

一般放到ServletContext對象中的數據是不建議修改操作的。因為ServletContext是多線程共享的一個對象,修改的時候會存在線程安全問題。

4.ServletContext接口中有哪些常用方法?

//從ServletContext范圍中獲取數據(Object value=map.get(key);) Object getAttribute(String name) //移除ServletContext范圍的數據(map.remove(key);) void removeAttribute(String name) //向ServletContext范圍中添加數據value(map.put(key,value)) void setAttribute(String name,Object object) String getInitParameter(String name) Enumeration getInitParameterNames() String gerRealPath(String path) 

5.Servlet,ServletConfig,ServletContext之間的關系。
一個Servlet對應一個ServletConfig,100個Servlet對應100個ServletConfig

所有的Servlet共享一個ServletContext對象。

6.ServletContext范圍可以完成快用戶傳遞數據。

總結:
所有編寫過的路徑:
1.超鏈接

<a href="/webappname/xxx"></a> 

2.web.xml中的url-pattern

<url-pattern></url-pattern> 

3.form表單的action屬性

<form action="/webappname/xxx"></form> 

4.application.getRealPath(path);

10.歡迎頁面和HTTP狀態碼

1.歡迎頁面怎么設置?
假設在WebContent目錄下創建index.html,想讓index.html作為整個webapp的歡迎也頁面。應該做這樣的設置。

在web.xml文件的開始

 <welcome-file-list> <welcome-file>Welcome.html</welcome-file> </welcome-file-list> 

設置歡迎頁面的目的
為了訪問更方便,為了提高用戶的體驗。

2.歡迎頁面可以設置多個
如果上一個資源找不到或者不存在,會往下查找。越往上優先級越高。

3.歡迎頁面設置的時候,路徑不需要以“/”開始。

<welcome-file>index.html</welcome-file> 

要求在webapp的根目錄下,必須有一個文件,叫做index.html

<welcome-file>html/welcome.html</welcome-file> 

要求在webapp的根目錄下,必須有一個文件夾html,該文件夾必須有一個文件叫做welcome.html

4.一個webapp的歡迎頁面不一定是一個HTML資源,可以是任何一種類型的web資源,歡迎頁面可以是Servlet.

5.歡迎頁面包括全局配置和局部配置。
全局配置:catalina_home/conf/web.xml
局部配置 :CATALINA_HOME/webapps/webapp/WEB-INF/web.xml

注意:就近原則
若一個頁面的名稱是:index.html,index.htm,index.jsp,這些都是默認的歡迎頁面,在全局配置中配置過了。

在webapp中常見的錯誤代碼:
404 Not Found【資源未找到:請求的資源路徑寫錯了】
500 Server Inner Error【服務器內部錯誤,這種情況一般都是java程序出現異常】

404和500是HTTP協議狀態碼。

以上的這些狀態號是W3C制定的,所有瀏覽器和服務器都必須遵守。

正常響應的HTTP協議狀態碼:200【ok】。

可以設置錯誤提示頁面(讓交互性更好):
在web.xml中編輯:

<error-page> <error-code>404</error-code> <location>/error/error.html<location> <error-page> <error-page> <error-code>404</error-code> <location>/error/error.html<location> <error-page> 

路徑總結:
第一類:以/開始,加webapp名稱。
第二類:以/開始,不加webapp名稱。
除以上兩類之外,歡迎頁面設置比較特殊,不以/開始,不加webapp的名字。

成功不是將來才有的,而是從決定去做的那一刻起,持續累積而成。你好,我是夢陽辰!期待下次的相遇!

 

關注公眾號【輕松玩編程】回復關鍵字“電子書”,“計算機資源”,“Java從入門到進階”,”JavaScript教程“,“算法”,“Python學習資源”,“人工智能”等即可獲取學習資源。

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM