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學習資源”,“人工智能”等即可獲取學習資源。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章