JavaWeb學習筆記--day09--Servlet

Servlet概述

	*什麼是Servlet
		*Servlet是JavaWeb的三大組件之一,他輸入動態資源。Servlet的作用是處理請求,服務器會把收到的請求交給Servlet來處理,在Servlet中通常需要:
			*接受請求數據
			*處理請求
			*完成響應
	*實現Servlet的三種方式
		*實現javax.servlet.Servlet接口
		*繼承javax.servlet.GenericServlet類,與所有協議相關
		*繼承javax.servlet.http.HttpServlet類,與HTTP協議相關
		通常我們會去繼承HttpServlet類來完成我的們Servlet,但學習Servlet還要從javax.servlet.Servlet接口開始學習
		Servlet.java
		public interface Servlet{
			public void init(ServletConfig config) throws ServletException;
			//獲取Servlet的配置信息
			public ServletConfig getServletConfig();
			public void service(ServletRequest req,ServletResponse res)
				thorws ServletException,IOException;
			//獲取Servlet的信息,一般沒用
			public String getServletInfo();
			public void destory();
		}//五個方法

瀏覽器訪問Servlet路徑
要使瀏覽器與Servlet聯繫起來,需要配置web.xml文件
在這裏插入圖片描述
生命週期方法
void init(ServletConfig):出生之後(1次),第一次在瀏覽器被訪問
void service(ServletRequest request,ServletResponse response):每次處理請求時會被調用
void destory():臨死之前(1次),釋放非內存資源,儘可能不在這裏釋放資源。關閉服務器。
特性
單例,一個類只有一個對象;當然可能會存在多個Servlet
線程是不安全的。
Servlet類由我們來寫,但對象由服務器來創建,由服務器來調用相應方法

ServletConfig接口介紹
一個ServletConfig對象,對應一段web.xml中Servlet的配置信息servlet
在這裏插入圖片描述
API:
Sting getServletName(),獲取的是servlet-name中的內容;
ServletContext getServletContext():獲取Servlet上下文對象
String getInitParameter(Sting name):通過名稱獲取指定初始化參數的值,getInitParameter(“p1”);
Enumeration getInitParameterNames():獲取所有初始化參數的名稱,Enumeration是一個集合

GenericServlet

自己編寫一個AServlet模擬GenericServlet
public class AServlet implements Servlet {
	/*
	 *模擬GenericServlet 
	 */
	private ServletConfig servletConfig;
	//需要就寫,不需要就不寫
	@Override
	public void destroy() {
		System.out.println("我要死額");
	}
	/*
	 * 請放心,這個方法一定會在init()方法之後被調用
	 */
	@Override
	public ServletConfig getServletConfig() {
		return servletConfig;
	}
	//沒有用的東西,實現與否都可以
	@Override
	public String getServletInfo() {
		return "我是一個servlet";
	}
	//生命週期方法,由tomcat調用一次。
	//是這些方法中第一個被調用的,他會在構造器創建後第一個被調用。
	@Override
	public void init(ServletConfig servletConfig) throws ServletException {
		//把tomcat傳遞的ServeltConfig賦值給本類的一個成員
		this.servletConfig=servletConfig;
		init();//調用用戶可能初始化的函數 init
	}
	
	/*
	 * 這個方法是本類自己定義的,不是Servlet本身的方法
	 */
	public void init() {
		//這裏寫用戶自己想做的初始化
	}
	@Override
	public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
		System.out.println("每次處理請求都會被調用");
	}
	
	public ServletContext getServletContext() {
		return servletConfig.getServletContext();
	}
	
	public String getServletName() {
		return servletConfig.getServletName();
	}
	
	public String getInitParameter(String name) {
		return servletConfig.getInitParameter(name);
	}
}

編寫一個AServlet的子類BServlet

public class BServlet extends AServlet{

	@Override
	//public void init(ServletConfig servletConfig) throws ServletException {
	public void init() {
		// TODO Auto-generated method stub
		System.out.println("初始化");
		/*
		 * 這個會覆蓋AServlet裏的init方法,導致下面方法空指針異常
		 * 解決方法:在AServlet中重新定義一個init()方法
		 * 這裏重寫無參init方法,服務器調用有參init。不由tomcat調用,不是生命週期方法
		 */
	}

	@Override
	public void service(ServletRequest servletRequest, ServletResponse servletResponse)
			throws ServletException, IOException {
		String value = getInitParameter("p1");
	}
	
}

GenericServlet子類CServelt

public class CServlet extends GenericServlet {
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("哈哈哈 初始化");
	}
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("Hello World");
	}
	private void destory() {
		// TODO Auto-generated method stub
		System.out.println("destory()");
	}
}

HttpServlet

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

Servlet細節

**Servlet與線程安全**
	因爲同一個類型的Servlet只有一個實例對象,那麼就有可能會出現一個Servlet同時處理多個請求。所以線程是不安全的,但也說明Servlet的工作效率很高
	所以
		輕易不要再Servlet中創建成員,創建局部變量即可
		可以創建無狀態成員。沒有成員只有一些方法的類
		可以創建有狀態的成員,但狀態必須爲只讀的。有隻有get方法的成員的類

**讓服務器啓動時就創建Servlet**

在這裏插入圖片描述
url-pattern
充當過濾器的作用,現在已經有過濾器了,所以這個不常用了
在這裏插入圖片描述

web.xml文件的"繼承"

在這裏插入圖片描述
jsp是由Tomcat的JspServlet處理的,詳見tomcat裏的web.xml
web中的servlet-class內容通過反射得到類

ServletContext

**ServletContext概述**

在這裏插入圖片描述
獲取ServletContext
在這裏插入圖片描述
域對象的功能
在這裏插入圖片描述
獲取應用初始化參數
在這裏插入圖片描述
獲取資源相關方法
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

網站訪問量統計案例

在這裏插入圖片描述
獲取類路徑資源
在這裏插入圖片描述

在這裏插入圖片描述

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