Servlet的HelloWorld
- 創建一個Servlet接口的實現類
public class HelloServlet implements Servlet
- 在web.xml文件中配置和映射這個Servlet
<!--配置和映射Servlet-->
<servlet>
<!--Servlet註冊的名字-->
<Servlet-name>helloServlet</servlet-name>
<!--Servlet的全類名-->
<servlet-class>com.atguigu.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--需要和某一個Servlet節點的servlet-name子節點的文本節點一致-->
<Servlet-name>helloServlet</servlet-name>
<!--映射具體的訪問路徑:/代表當前web的根目錄-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Servlet容器:運行Servlet.JSP.Filter等的軟件環境可以創建Servlet,並調用Servlet的相關生命週期方法.
JSP/Filter/Listener/Tag…
Servlet生命週期的方法
1).構造器:第一次請求Servlet時,創建Servlet的實例,這說明Servlet
是單例模式.
2).init方法:只被調用一次,在創建好實例後立即調用.
用於初始化當前的Servlet
3).service被多次調用,每次請求都會調用service方法,實際用於響應請求的
4).destroy
只被調用一次,在當前Servlet所在的web應用被卸載前調用,用於釋放當前Servlet所佔用的資源
load-on-startup參數
1)配置在Servlet節點中:
<servlet>
<!--Servlet註冊的名字-->
<Servlet-name>secondServlet</servlet-name>
<!--Servlet的全類名-->
<servlet-class>com.atguigu.SecondServlet</servlet-class>
<!--指定Servlet被創建的時機-->
<load-on-startup>2</load-on-startup>
</servlet>
2).load-on-startup:可以指定Servlet被創建的時機.若爲負數,則第一次請求時或
被創建,若爲0或正數,則在Servlet容器加載時創建實例,且數值越小,越早被創建.
Servlet容器響應客戶請求的過程
①servlet引擎檢查是否已經裝載並創建了該Servlet的實例對象.如果是,則直接
執行第④步,否則,執行第②步.
②裝載並創建該Servlet的一個實例對象:調用該Servlet的構造器
③調用Servlet實例對象的init()方法
④創建一個用於封裝請求的ServletRequest對象和一個代表響應消息的ServletResponse
對象,然後調用Servlet的service()方法並將請求和響應對象作爲參數傳遞進去
⑤web應用程序被停止或重新啓動之前,Servlet引擎將卸載Servlet,並在卸載之前調用Servlet的
destroy()方法.
Servlet的註冊與執行
.Servlet程序必須通過Servlet容器來啓動運行,並且存儲目錄有特殊要求
,需要存儲在
<servlet-mapping>
<servlet-name>AnyName</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AnyName</servlet-name>
<url-pattern>/action/*</url-pattern>
</servlet-mapping>
既帶斜槓又帶擴展名不合法
7.
封裝了Servlet的配置信息,並且可以獲取ServletContext對象
配置Servlet的初始化參數
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>1230</param-value>
</init-param>
2).獲取
初始化參數:
getInitParameter(String name): 獲取指定參數名的初始化參數
getInitParameterNames():獲取指定配置的名字組成的Enumeration
String user = servletConfig.getInitParameter(“user”);
System.out.println(“user:”+user);
Enumration<String> names = servletConfig.getInitParameterNames();
while(names.hasMoreElements())
{
String name = names.nextElement();
String value = servletConfig.getInitParameter(name);
System.out.println("^^"+name+":"+value);
}
3).獲取Servlet的配置名稱(用的很少)
String servletName = servletConfig.getServletName();
System.out.println(servletName);
8.getServletContext()(非常關鍵)
Servlet引擎爲每一個web應用程序都創建一個對應的ServletContext對象
ServletContext對象被包含在ServletConfig對象中,調用ServletConfig.getServletContext方法可以返回ServletContext對象的引用.
1).可以由ServletConfig獲取
2).該對象代表當前web應用,可以認爲ServletContext是當前web應用的一個大管家,可以從中獲取到當前web應用的各個方面的信息
①獲取當前web的初始化參數
class GenericServlet
1).是一個Servlet,是Servlet接口和ServletConfig接口的一個實現類。但是一個抽象類,其中 的service方法爲抽象的
2).如果新建的Servlet程序直接繼承GenericServlet會使開發更簡潔
3).具體實現
在GenericServlet 中一個ServletConfig類型的成員變量,在initial(ServletConfig)方法中對其進行調用,子類可以直接覆蓋init()在其中實現對Servlet的初始化
4).不建議直接覆蓋init(servletConfig),因爲如果忘記編寫super(ServletConfig),而還是用了ServletConfig接口的方法,則會出現空指針異常。
5).新建的initial(){}並非Servlet的生命週期方法,而init(ServletConfig)是生命週期方法