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
域對象的功能
獲取應用初始化參數
獲取資源相關方法
網站訪問量統計案例
獲取類路徑資源