是爲動態web開發提供的一種技術,至關對http協議,請求的數據,響應的數據作了封裝。
不屬於j2SE,須要看j2EE的文檔,servlet只是其中一種技術。
1.實現servlet的接口(須要tomcat的lib中servlet-api.jar包的支持) 2.配置項目中web.xml的servlet的映射,部署到web服務器中
service():請求一個servlet,服務器會自動調用這個方法。
servlet的生命週期通常是從第一次訪問開始建立到服務器關閉。
實際項目目錄:html
而是在response中,而後tomcat將response的數據寫給客戶端瀏覽器。java
response.getOutputStream().write("test servlet demo".getBytes());
右擊選擇refactor->rename(或者快捷鍵alt+shift+r),修改變量名這能夠用這個快捷鍵,會將關聯的也會改變,但xml中關聯的不會改變,好比修改
servlet的名字,web.xml中的名字須要手動去更改。
若是新的項目和已有的項目原來是重名的,只是改變項目文件夾的名字是不夠的。還須要修改映射的路徑。web
對於test2_web項目名字確實已經改變,eclipse能夠經過修改配置屬性修改映射。數據庫
可是其contex即映射並沒被修改仍是映射原來的web項目apache
修改成:windows
並且能夠泛指但只能是「*.某某」或「/*」;分別表示以某某結尾或者任何訪問都執行該servlet。api
首先選擇匹配最高的,對於直接以*開頭的優先級最低(沒有斜槓)。瀏覽器
對於web訪問,首先都是去查找servlet配置:即便是訪問靜態html頁面tomcat
好比:1.html時候,實際是執行缺省的servlet(這個servlet指向的項目中的靜態網頁),只是這個被默認配置在tomcat的conf/web.xml中配置,而後它會去找同名的靜態頁面。安全
若是在項目WEB-INF/web.xml配置這個缺省的「/」路徑,那麼就只會執行本身配置的servlet。而且項目下的那些靜態頁面都不能訪問到了。(所以通常不會在項目中再如此配置)
servlet的init方法只執行一次,
每次訪問,service方法執行一次,
而且每次生成新的request和response對象(只是這兩個對象生命週期極短,不用考慮多個對象佔用系統空間)。
多個這樣servlet配置,load-on-startup的參數正數,數值越小優先級越高,即建立在前。(struts框架就是一個服務器啓動建立的特殊servlet)
在servlet的配置當中,<load-on-startup>5</load-on-startup>的含義是:標記容器是否在啓動的時候就加載這個servlet。當值爲0或者大於0時,表示容器在應用啓動時就加載這個servlet;當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才加載。正數的值越小,啓動該servlet的優先級越高。
(補充:對於共享對象方法內部的局部變量是線程安全。
servlet曾提供實現singleThreadModel(servlet2.4過期)標記接口(接口裏沒有任何東西。如:序列號接口,克隆接口)的方式,
原理是:當原來的servlet響應沒有完成,又有新的訪問,tomcat會建立一個新的servlet來處理,這會存在一個問題,就是兩次的結果會是同樣。
單個參數獲取
多個參數獲取:
1.字符集類型 2.鏈接數據庫類型 3.數據庫密碼 4.指定配置文件。
獲取servletContex的方式:從類中獲取,或者從config獲取
不一樣servlet讀寫的例子:
寫入contex:
讀:
獲取:
能夠用於配置共享的數據鏈接須要的參數,適用於多個servlet來訪問。
經常使用於將servlet處理的結果轉發給jsp作好佈局後返回瀏覽器。
(補充:經常使用的配置有xml和properties。對於存在關係配置用xml,如父子或兄弟關係)
利用讀取資源文件的方式加載配置:
注意兩個東西:
1.放在src(src目錄只是eclipse爲顯示而存在的,項目文件並不會存在)目錄中的db.properties,eclipse會自動複製放在WEB-INF/classes/中,獲取路徑注意! (放在eclipse的webContent目錄中的db.properties實際就是項目的目錄下即:/db.properties) 2.對於properties文件流,有專門的properties對象來加載和獲取配置。
特別注意一個問題:
1.若是用文件流讀取:new file("/WEB-INF")的/表明的路徑並非項目的根目錄!而是啓動該項目應用程序的路徑,能夠是eclipse也多是tomcat的安裝路徑
File file = new File(""); System.out.println(file.getAbsolutePath());//路徑是相對eclipse安裝路徑的(絕對路徑:F:\eclipse-jee-juno-win32\eclipse)
new Properties().load(new FileInputStream(file));
而且java項目和web經過文件流讀取的相對路徑也是不一樣的!
2.若是要用文件流的方式讀取:能夠經過下面方法得到項目的絕對路徑再用:
String realPath = getServletContext().getRealPath("WEB-INF/classes/db.proterties"); System.out.println(realPath);//E:\apache-tomcat-6.0.48-windows-x86\apache-tomcat-6.0.48\webapps\test_web new Properties().load(new FileInputStream(realPath));
這種方式一個好處是可以直接得到文件所在的具體路徑,若是要作上傳下載頗有用。前面那種方式只能讀取配置中的信息。
1.補充:非web項目讀取配置:
(db.properties在src目錄下)
從java項目中獲取配置文件的方式:(經過類加載器的方式)
void f(){
InputStream resource = TestOut.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties2 = new Properties(); properties2.load(resource);
}
(服務器不重啓)這種方式的一個弊端是資源文件只會加載一次(加載器加載文件首先判斷文件名字是否已經加載),那麼修改配置文件調用上面的代碼讀取到的仍是原來的配置內容。
能夠先經過加載器得到具體的路徑,而後經過文件讀取得到:
void getProperties() throws IOException, FileNotFoundException { String path = TestOut.class.getClassLoader().getResource("db.properties").getPath();//獲得文件路徑 Properties properties2 = new Properties(); properties2.load(new FileInputStream(path)); }
2.補充: 配置讀取亂碼的問題。java流讀取properties輸出亂碼的問題
主要是由於程序默認流讀取是用iso-8859-1