jsp(6)(一)servlet的生命週期,經常使用重寫方法,模糊路徑映射,線程安全,ServletConfig ,ServletContex,配置加載,非web配置加載

servlet:

是爲動態web開發提供的一種技術,至關對http協議,請求的數據,響應的數據作了封裝。

不屬於j2SE,須要看j2EE的文檔,servlet只是其中一種技術。

1.實現一個servlet的步驟: 

1.實現servlet的接口(須要tomcat的lib中servlet-api.jar包的支持)
2.配置項目中web.xml的servlet的映射,部署到web服務器中

2.servlet提供一些生命週期的方法,tomcat會自動調用這些方法,去繼承httpServlet實現這些方法就能夠。

service():請求一個servlet,服務器會自動調用這個方法。

servlet的生命週期通常是從第一次訪問開始建立到服務器關閉。

3.eclipse 部署項目:jsp(6)(二)(eclipse默認虛擬路徑的問題)

4.一個簡單的例子:eclipse建立一些虛擬文件夾

實際項目目錄:html

5.實現httpServlet的doGet和doPost方法就能夠了。

6.注意:response獲取輸出流寫數據並不是就將數據寫給瀏覽器

而是在response中,而後tomcat將response的數據寫給客戶端瀏覽器。java

response.getOutputStream().write("test servlet demo".getBytes());

8.在eclipse中若是要修改類名通常用重構:

右擊選擇refactor->rename(或者快捷鍵alt+shift+r),修改變量名這能夠用這個快捷鍵,會將關聯的也會改變,但xml中關聯的不會改變,好比修改

servlet的名字,web.xml中的名字須要手動去更改。

9.web項目複製的時候特別注意一個問題,

若是新的項目和已有的項目原來是重名的,只是改變項目文件夾的名字是不夠的。還須要修改映射的路徑web

對於test2_web項目名字確實已經改變,eclipse能夠經過修改配置屬性修改映射。數據庫

可是其contex即映射並沒被修改仍是映射原來的web項目apache

修改成:windows

 10.servlet訪問是經過url映射訪問的,而且能夠設置多個地址指向一個servlet:

並且能夠泛指但只能是「*.某某」或「/*」;分別表示以某某結尾或者任何訪問都執行該servlet。api

10.1關於多個匹配衝突,優先選擇的問題:

首先選擇匹配最高的,對於直接以*開頭的優先級最低(沒有斜槓)。瀏覽器

 10.2對於找不到路徑的訪問該執行哪一個servlet的配置是「/」(通常不使用)

 

對於web訪問,首先都是去查找servlet配置:即便是訪問靜態html頁面tomcat

好比:1.html時候,實際是執行缺省的servlet(這個servlet指向的項目中的靜態網頁),只是這個被默認配置在tomcat的conf/web.xml中配置,而後它會去找同名的靜態頁面。安全

若是在項目WEB-INF/web.xml配置這個缺省的「/」路徑,那麼就只會執行本身配置的servlet。而且項目下的那些靜態頁面都不能訪問到了。(所以通常不會在項目中再如此配置

11.修改web.xml配置不須要重啓服務器,會自動重新加載web.xml。由於conf/Contex.xml的配置:

12.修改項目文件內容不須要重啓服務器是由於爲conf/server.xml的配置:

13.servet是由servlet引擎(可當作是由tomcat服務器)來調度控制的。

14.默認servlet對象只會建立一個對象實例,在第一次訪問的時候建立,在服務器關閉時候才銷燬。

 servlet的init方法只執行一次,
每次訪問,service方法執行一次,
而且每次生成新的request和response對象(只是這兩個對象生命週期極短,不用考慮多個對象佔用系統空間)。

15.servlet能夠配置參數使得servlet在服務器啓動時候建立。

多個這樣servlet配置,load-on-startup的參數正數,數值越小優先級越高,即建立在前。(struts框架就是一個服務器啓動建立的特殊servlet)

在servlet的配置當中,<load-on-startup>5</load-on-startup>的含義是:標記容器是否在啓動的時候就加載這個servlet。當值爲0或者大於0時,表示容器在應用啓動時就加載這個servlet;當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才加載。正數的值越小,啓動該servlet的優先級越高。
View Code

16.servlet線程安全問題:

(補充:對於共享對象方法內部的局部變量是線程安全。

16.1.當須要保證i的數據線程安全問題:以下

缺點:雖然數據安全了,可是其餘訪問都將被阻塞。

servlet曾提供實現singleThreadModel(servlet2.4過期)標記接口(接口裏沒有任何東西。如:序列號接口,克隆接口)的方式,

原理是:當原來的servlet響應沒有完成,又有新的訪問,tomcat會建立一個新的servlet來處理,這會存在一個問題,就是兩次的結果會是同樣。

17.將初始化數據封裝成servletConfig對象:

單個參數獲取

多個參數獲取:

 17.1.應用場景:初始化參數能夠有以下做用:(struts使用這種方式得到其指定文件的配置)

1.字符集類型

2.鏈接數據庫類型

3.數據庫密碼

4.指定配置文件。

 18.表明web應用的對象servletContex。在tomcat啓動時候就建立了。

獲取servletContex的方式:從類中獲取,或者從config獲取

18.1.servletContex能夠servlet之間共享數據。範圍是整個應用程序,均可以訪問。

不一樣servlet讀寫的例子:

寫入contex:

讀:

 18.2.還能夠用配置xml的方式爲全部servlet配置共享參數(一樣也能夠是多個參數)

    獲取:

    能夠用於配置共享的數據鏈接須要的參數,適用於多個servlet來訪問。

18.3.轉發:請求服務器,服務器會將另外一個頁面轉發給客戶(重定向是要瀏覽器去再請求一個頁面)

         經常使用於將servlet處理的結果轉發給jsp作好佈局後返回瀏覽器。

18.4.用來獲取配置,

(補充:經常使用的配置有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

相關文章
相關標籤/搜索