Servlet生命周期
init() :進(jìn)行初始化工作
service():提供服務(wù)響應(yīng)請(qǐng)求
destory():Servlet被銷毀的時(shí)候調(diào)用
調(diào)用順序:構(gòu)造器->init()->service()->destory()
Servlet第一次訪問時(shí),首先調(diào)用構(gòu)造函數(shù),再init(),再service(),再destory();
第二次訪問時(shí),只有service()會(huì)被調(diào)用,其他方法不再被調(diào)用
destory(),調(diào)用情況:
- 服務(wù)器正常關(guān)閉
- 服務(wù)器重啟
總結(jié):
- 實(shí)際開發(fā)中直接繼承HttpServlet
- 實(shí)際開發(fā)中只需覆蓋doGet和doPost方法
- 如果需要初始化,直接覆蓋init()方法,無需覆蓋init(config),因?yàn)閕nit(Config)調(diào)用了init()方法
- 當(dāng)doGet和doPost代碼邏輯相同時(shí)系瓢,可以相互調(diào)用溶浴,簡(jiǎn)化編程
注意事項(xiàng):
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<!--表示Servlet跟隨服務(wù)器啟動(dòng)而初始化,通常用來加載配置文件-->
<!--中間的數(shù)值代表優(yōu)先級(jí),取值范圍從0-9,0代表最高優(yōu)先級(jí)-->
<load-on-startup></load-on-startup>
</servlet>
Url-pattern的三種方式
- 完全路徑匹配
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/servlet/abc/</url-pattern>
</servlet-mapping>
- 目錄匹配,例如:/* /abc/*
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/servlet/abc/*</url-pattern>
</servlet-mapping>
- 擴(kuò)展名匹配
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/servlet/abc/</url-pattern>
<url-pattern>*.do</url-pattern>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
優(yōu)先級(jí):完全路徑匹配>目錄匹配>擴(kuò)展名匹配
相對(duì)路徑與絕對(duì)路徑
相對(duì)路徑:相對(duì)當(dāng)前文件的路徑,例如:HelloServlet ./HelloServlet ../HelloServlet
- 例如http://localhost/test/aa.html頁面提交一個(gè)form表單,action="HelloServlet",那么直接將url最后地址換成相對(duì)路徑,我們的完整請(qǐng)求路徑為: http://localhost/test/HelloServlet
- ./代表當(dāng)前目錄,用于相對(duì)路徑,但是可以省略
- ../代表上一級(jí)目錄
- / 代表根目錄
絕對(duì)路徑:以/開始, /訪問服務(wù)器根目錄,例如/test/HelloServlet
ServletConfig獲得局部初始化參數(shù),ServletContext()獲得全局初始化參數(shù)
配置方法:
在web.xml文件中的<servlet>標(biāo)簽內(nèi)添加<init-param>標(biāo)簽,為Servlet配置初始化參數(shù)
<servlet>
<servlet-name>CServlet</servlet-name>
<servlet-class>org.luoluo.CServlet</servlet-class>
<init-param>
<!--name代表名字,value代表值-->
<param-name>dd</param-name>
<param-value>DDDD</param-value>
</init-param>
</servlet>
public class CServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通過getServletConfig來獲取config對(duì)象,然后通過getInitParameter獲取對(duì)應(yīng)的值,getInitParameterNames來獲取對(duì)應(yīng)的key值
ServletConfig config = getServletConfig();
String value =config.getInitParameter("dd");
Enumeration<String> en = config.getInitParameterNames();
while (en.hasMoreElements()) {
System.out.println(en.nextElement());
}
}
}
全局初始化參數(shù)的設(shè)置:在web.xml中進(jìn)行配置
<context-param>
<param-name>aa</param-name>
<param-value>AA</param-value>
</context-param>
在servlet中,通過getServletContext()這個(gè)方法來調(diào)用全局的參數(shù)信息
重定向與轉(zhuǎn)發(fā)
- 轉(zhuǎn)發(fā) : 如果服務(wù)器在處理客戶請(qǐng)求的時(shí)候,需要多個(gè)服務(wù)器程序進(jìn)行同時(shí)處理,這時(shí)候就需要使用轉(zhuǎn)發(fā).
- 重定向 : 服務(wù)器收到請(qǐng)求后,通知客戶端需要訪問下一個(gè)目標(biāo)程序進(jìn)行后續(xù)處理
轉(zhuǎn)發(fā)和重定向的區(qū)別
- 轉(zhuǎn)發(fā)產(chǎn)生一次請(qǐng)求一次響應(yīng),重定向產(chǎn)生兩次請(qǐng)求兩次響應(yīng),因此轉(zhuǎn)發(fā)性能更高
- 轉(zhuǎn)發(fā)會(huì)客戶端來講是透明的(無感),重定向?qū)蛻舳藖碇v是可察覺的
- 轉(zhuǎn)發(fā)時(shí),瀏覽器地址欄的路徑不會(huì)發(fā)生改變
- 重定向時(shí),瀏覽器地址欄的路徑會(huì)發(fā)生改變
轉(zhuǎn)發(fā)方法:
getRequestDispatcher("/").forward(request,response);//"/"代表當(dāng)前路徑
重定向方法:
sendRedirect();//里面要寫絕對(duì)路徑
TomCat項(xiàng)目部署路徑的問題:
在一個(gè)項(xiàng)目中,只有src和WEB-INF目錄下的內(nèi)容會(huì)被加載到TomCat中,而且必須使用絕對(duì)磁盤路徑(帶有盤符的路徑)讀取
方法一:通過ServletContext.getRealPath(String path)
獲取Web應(yīng)用中的資源的絕對(duì)磁盤路徑,獲取的是WEB-INF在tomcat中的磁盤絕對(duì)路徑
在WebContnet中的文件可以直接"/文件名"來訪問,但是在src目錄下的文件,需要訪問classes字節(jié)碼中的文件,即文件名要寫為"/WEB-INF/classes/(文件名)"來獲取文件
getServletContext().getRealPath("/WEB-INF/classes/b.txt");//訪問WEB-INF
getServletContext().getRealPath("a.txt");//直接訪問的是WebContnet中的文件
方法二:通過字節(jié)碼來獲取src目錄下的文件
Class clazz = AServlet.class;
//fileName所獲取到的位置也是src的文件路徑,即字節(jié)碼文件的路徑
String fileName = clazz.getResource("/c.txt").getFile();
課后問題:
-
通過字節(jié)碼文件來讀取文件,是否與相對(duì)應(yīng)的字節(jié)碼文件的位置有關(guān)?
答:這個(gè)路徑是和getRealpath是一樣的效果,所得到的路徑都是WEB-INF下的路徑,并且與字節(jié)碼文件GServlet的位置無關(guān)
-
同getRealPath()來獲取src目錄文件時(shí),能不能通過"/classes/a.txt"來訪問?
答:getRealPath()所定位到的文件夾是直接是web下的文件夾的內(nèi)容,如果需要指定src下的文件內(nèi)容的話是需要在getRealPath()里面加上/WEB-INF/classes的