轉載於傳智播客教程.
今天內容
1.Servlet(重點)
2.ServletCofig(次重點)
3.ServletContext(重點)
-----------------------------------------------------------------
1.servlet
servlet是什麼?它的作用是什麼?
servlet是一門開發動態web資源的技術.
servlet它叫服務器端小應用程序。
它可以理解服務器端的一個資源,它可以進行請求與響應的處理.
servlet技術怎樣使用?
sun公司在api中提供了Servlet接口
我們開發Servlet可以有三種方式.
1.實現 javax.servlet.Servlet接口
2.繼承 javax.servlet.GenericServlet
3.繼承 javax.servlet.http.HttpServlet
對於我們開發一個servlet它步驟有兩個.
1.實現或繼承 Servlet接口或 GenericSerlvet,HttpServlet。
2.在web.xml文件對Servlet進行配置.
<servlet>
<servlet-name>任意起的一個名稱,一般會使用servlet的類名</servlet-name>
<servlet-class>servlet的全名 就是包名.類名.</servlet-class>
</servlet>
<serlvet-mapping>
<servlet-name>要與上面的servlet-name的值一樣</servlet-name>
<url-pattern>/名稱</url-pattern>
</servlet-mapping>
------------------------------------------------------
關於請求方式 get與post
在瀏覽器上直接輸入url----get請求.
超鏈接方式也是 get請求.
如果想要以post方式提交,只能通過表單,設置method=post.
--------------------------------------------------------------------------
問題1:我們提交請求時,爲什麼get請求就會調用doGet方法,post請求,會調用doPost方法?
問題2:爲什麼我們重寫時,只重寫了無參數的init方法,不需要重寫有參數的init?
研究servlet的生命週期(******************************)
在我們Servlet接口中定義了三個方法.
init(ServletConfig config)
service()
destroy();
問題1解決:
是因爲在HttpServlet的service方法中,它進行了重寫,重寫後分根據請求方式不同,調用不同的方法.
String method=request.getMethod();
if("get".equals(method)){
doGet();
}else if("post".equals(method)){
doPost();
}
問題2解決:
在GenericServlet 中定義了一個無參數init方法,重寫Servlet接口中的init(ServletConfig config)方法.
當servlet對象創建後會調用有參數的init方法。在有參數的init方法中又調用了無參數的init方法。
對於我們來說,我們只需要重寫無參數的init就可以。
--------------------------------------------------------------------------------------------------------
關於servlet的自動加載.
正常情況下,servlet是第一次被訪問時,會創建servlet實例。並初始化,也就是調用init方法。
我們可以通過對servlet進行配置,讓servlet可以隨着服務器的啓動而自動創建與初始化.
只需要在web.xml文件中在配置servlet時,加上<load-on-startup>
servlet跟隨服務器啓動的作用是什麼?
根據特點來分析,當前servlet的init方法是服務器啓動了,init方法就被調用了,
那麼我們就可以將一些需要提前加載的信息在servlet的init方法中定義。
------------------------------------------------------------------------------------------------------------
關於url-pattern的寫法.
url-pattern它的作用是什麼?
它的值要與瀏覽器輸入的地址相匹配,通過url-pattern可以查找到servlet-name,在通過serlvet-name可以查找到
對應servlet類.
它的寫法有兩種:
1.完全匹配 要求以/開始,名稱與url一致.
2.使用通配符 *
1.目錄匹配 以/開始,以*結束.
2.擴展名匹配. 不能以/開始,以*.xxx對束
最經典錯誤 /*.do
優先級: 完全匹配>目錄匹配>擴展名匹配
--------------------------------------------------------------------------------
關於訪問servlet時的路徑問題(客戶端訪問服務器端資源路徑問題):******************
訪問一個servlet它的路徑有兩種寫法,一種是絕對路徑,一種是相對路徑.
絕對路徑:<br>
1.帶協議的絕對路徑<br>
<a href="http://localhost/day09/demo2">demo2 servlet</a><br>
2.不帶協議的絕對路徑<br>
<a href="/day09/demo2">demo2 servlet</a>
在開發中,帶協議的絕對路徑一般應用於訪問站外資源。
而不帶協議的絕對路徑我們一般是在站內訪問時使用的,也是推薦使用的。
******相對路徑
相對路徑:<br>
<a href="./demo2">demo2 servlet</a>
對於當前路徑下的資源我們一般寫成:
<a href="demo2">demo2 servlet</a>
分析:
訪問admin.html的路徑是: http://localhost/day09/admin.html
訪問demo2Servlet的路徑是:http://localhost/day09/demo2
通過上面的路徑分析,發現admin.html與demo2是同級別,那麼它們相對關係就是當前路徑下的某某...
如果將admin.html放置在main目錄下.
訪問admin.html的路徑是: http://localhost/day09/main/admin.html
訪問demo2Servlet的路徑是:http://localhost/day09/demo2
那麼相對路徑就需要改變。
<a href="../demo2">demo2 servlet</a>
總結:
我們在開發中建議使用不帶協議的絕對路徑.
它的寫法是 /虛擬目錄名稱/資源路徑
根據以上的分析,說明在客戶端的 /代表的是就相當於服務器根目錄.
---------------------------------------------------------------------
ServletCofnig
它是什麼?它有什麼用?它是由誰創建的?
ServletConfig是Servlet的一個配置對象.
每一個servlet都有一個對應的ServletCofnig。
ServletConfig是由web服務器創建的,它通過Servlet的init方法傳遞到了
Sevlet中.
ServletCofnig作用:(它是servlet的一個配置對象)
1.可以獲取Servlet的名稱 getServletName();---web.xml文件中的<servlet-name>的值.
2.可以獲取初始化參數
getInitParameter(String name); 根據name獲取value
getIniteParameterNames(); 獲取所有的name值,它返回的是一個Enumeration.
對於Enumeration它相當於是一個Iterator。
Iterator hasNext() next()
Enumeration hasMoreElement() nextElement();
3.可以獲取ServletContext對象。
通過代碼去測試一下這些操作
問題:我們在Servlet中怎樣獲取ServletConfig對象
我們要查看怎樣獲取ServletConfig對象,
我們現在知道,ServletConfig對象是由服務器創建,通過Servlet的init方法傳遞到Servlet中.
在Servlet類中通過this.getServletConfig()就獲取了ServletConfig對象.
問題:什麼是初始化參數?
我們在每一個Servlet的配置中,都可以通過
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
進行配置,這個就是servlet的初始化參數
問題:初始化參數的作用?
我們可以將一些servlet運行時需要加載常量定義在初始化參數中,當我們需要使用時,
可以直接通過ServletConfig獲取到這些值。
ServletConfig總結:
1.每一個Servlet都有自己的ServletConfig對象.
2.ServletCofnig對象是由服務器創建,通過Servlet的init方法傳遞到Servlet中。
3.ServletConfig對象代表的是Servlet的配置對象,可以通過它獲取Servlet的名稱與相關初始化參數。
4.在Servlet中要獲取ServletConfig對象,只需要直接調用getServletConfig()就可以。
5.可以通過ServletConfig獲取ServletContext對象.
-----------------------------------------------------------------------------------------------------------
ServletContext對象**************************************************************
它是一個全局的web容器對象.它代表的就是當前工程。
類的成員變量:
這個類的每一個對象都具有這個成員變量.
類的靜態變量
當前類的所有對象都使用同一個靜態變量。
ServletContext代表一個web應用,在這個web應用中所有Servlet使用的就是這一個。
每一個Servlet都有ServletConfig。
因爲在一個web應用中就一個ServletContext,所有的servlet使用的是同一個ServletContext,
那麼我們這些servlet就可以通過serlvetContext去實現通信。
ServletContext對象它是一個容器對象。(大家將其想像成是一個map集合)
我們將這種功能的對象叫做域對象(上下文對象)
----------------------------------------------------------------------
獲取WEB應用的全局初始化參數
通過ServletContext對象實現數據共享
案例--- 統計站點訪問次數
利用ServletContext對象讀取資源文件
要完成以上的操作,出現的問題:
1.問題:我們在servlet中怎樣獲取ServletContext對象,它是由誰創建的?
ServletContext對象是由服務器創建,它代表web應用.
要想獲取我們可以通過ServletConfig對象去獲取.
this.getServletConfig().getServletContext();
this.getServletContext();這種方式底層也是通過ServletConfig獲取的.
2.ServletContext的功能有什麼
1.可以完成Servlet與Servlet之間的通信.
setAttribute(String name,Object value)
getAttribute(String name);
removeAttribute(String name);
2.可以設置全局初始化參數.
1.在web.xml文件中可設置全局初始化參數
<context-param>
<param-name>global</param-name>
<param-value>this is message</param-value>
</context-param>
2.怎樣獲取全局初始化參數
getInitParameter(String name);
getInitParameterNames();
設置全局初始化參數在開發中有什麼用?
例子:我們在全局初始化參數中可以設置一個變量來描述整個web應用的字符編碼.
我們在任意的一個servlet中都可以獲取到這個字符編碼。
全局初始化參數它是針對於web工程共享的信息。
3.獲取Mime類型.
String getMimeType(String name)
我們在講文件下載時會使用到.
4.在ServletContext中有一些獲取路徑操作.
getRealPath(String path); 它返回的是一個String
例如:context.getRealPath("/"); 獲取的是當前web應用在磁盤上的絕對路徑.
E:\apache-tomcat-7.0.26\webapps\day09\
getResource(String source); 它返回的是一個URL
例如:context.getResource("/");
返回的是 /localhost/day09
getResourceAsStream(String path) 它返回的是一個InputStream
例如:context.getResourceAsStream("/a.txt");
得到一個指向了WebRoot下的a.txt文件的一個輸入流。
以後操作中應用比較多的是1,與4.
-----------------------------------------------------------------------------------
利用ServletContext對象讀取資源文件---關於路徑問題
在web應用中如果要讀取資源文件,我們需要得到文件的絕對磁盤路徑。
context.getRealPath("/"); 這時得到的就是tomcat/webapps/工程名/ 路徑。
得到文件位置只需要在/後面加上相關的路徑就可以.
注意:src下的內容會被部署到classes中。而沒有在src或WebRoot下的內容不會被部署到tomcat中.
------------------------------------------------------
關於classpath問題.
javaProject工程 java源文件被編譯後會被放置在bin目錄.
java web project工程 java源文件編譯後會被放置在classes目錄.
我們管bin或classes這樣的可以保存class文件的目錄叫 classpath路徑.
在java中,我們要想獲取classpath路徑可以通過任意一個類的字符碼對象獲取.
String path=類.class.getResource("/2.txt").getPath()
這時我們就得到了classes目錄下的2.txt文件的絕對磁盤路徑。
-----------------------------------------------------------------
總結:
getRealPath() 它可以得到tomcat下的web應用中的文件的絕對磁盤路徑。
類.class.getResource().getPath();是獲取classpath路徑。就是我們的bin或classes目錄路徑。
----------------------------------------------------------