servlet資源路徑載入詳解(3),servlet詳解

來源:互聯網
上載者:User

servlet資源路徑載入詳解(3),servlet詳解

1.對於servlet的讀取資源檔,要考慮工程檔案路徑和tomcat伺服器的部署後的檔案,所以一定要弄清楚負載檔案路徑位置,同時要考慮採用哪種方式:
一般有三種方式:

(1).採用傳統方式即jdk中提供的InputStream is = new FileInputStream("config.properties");

(2).採用ServletContext對象載入

(3).採用類載入器的方式

2.用代碼檢驗

package cn.wwh.www.web.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 *類的作用:研究在servlet中讀取的資料,載入的檔案路勁的含義
 *
 *
 *@author 一葉扁舟
 *@version 1.0
 *@建立時間: 2014-7-28   上午11:24:05
 */
public class DealFilePath extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
 * 採用傳統的方式負載檔案,例如載入的檔案的路徑為FileInputStream("config.properties"),此時代表的
 * 路徑的位置是在tomcat伺服器的bin目錄下的一個檔案config.properties
 * 如果載入的路徑是src/config.properties,則表示這個檔案實在
 * tomcat伺服器下的一個檔案夾src中檔案config.properties,對於傳統方式(即jdk中)都是相對與bin目錄而言
 * 
 */
/*InputStream is = new FileInputStream("config.properties");
Properties prop =  new  Properties();
prop.load(is);
System.out.println("name:"+prop.getProperty("age"));
*/

/**
*用這種方式載入的檔案,“/”表示的是Summer_Exercise6這個目錄
*即這種負載檔案的路徑是相對於tomcat中webapps目錄下的工程檔案名稱而言
* 1.context.getResourceAsStream("/config2/config.properties")的
* 全路徑是webapps/Summer_Exercise6/config2/config.properties
* 2.context.getResourceAsStream("/config.properties")的全路徑是:
* webapps/Summer_Exercise6/config.properties
* 3.如果想載入工程中src目錄下的檔案如config1/config.properties檔案
* 應該這樣寫:/WEB-INF/classes/config1/config.properties
* 此時“/”仍然代表的檔案路徑是Summer_Exercise6
*/
/*ServletContext context = this.getServletContext();
InputStream is = context.getResourceAsStream("/config2/config.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println("name:"+prop.getProperty("name"));*/

ServletContext context = this.getServletContext();
InputStream is = context.getResourceAsStream("/WEB-INF/classes/config1/config.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println("name1:"+prop.getProperty("name"));

/**
*採用類載入器的處理時,"/"表示的是當前工程名下的src目錄,即/WEB-INF/classes/
*cl.getResourceAsStream("/config1/config.properties")的全路徑是:
*Summer_Exercise6/WEB-INF/classes/config1/config.properties
*/

// 返回當前位元組碼對象
Class clazz = this.getClass();
// 取得類載入對象
ClassLoader cl = clazz.getClassLoader();
// 通過類載入器載入資源檔
is = cl.getResourceAsStream("/config1/config.properties");
prop = new Properties();
prop.load(is);
System.out.println("name2:"+prop.getProperty("name"));
}
}


3.目錄結構圖:

(1)工程目錄圖;


(2).tomcat伺服器的目錄結構圖;

4.對以上總結:

(1)如果以傳統方式讀取資源檔(txt/xml/properties),是相對於web伺服器的bin/目錄而言
  (2)如果以ServletContext方式讀取資源檔(txt/xml/properties),是相對於web伺服器的當前web應用目錄而言此時/表示:當前web應用,即Summer_Exercise6
  (3)類載入器只能載入IDE工具下src目錄下的資源檔,其它目錄無法載入此時/表示:/WEB-INF/classes/目錄

  (4)ServletContext和類載入器的區別:
    ServletContext方式:
1)資源的檔案的位置任意
        2)負載檔案時,只會以流的方式讀取,不會一次性載入全部
        3)/表示當前web應用,即Summer_Exercise6
    類載入器方式:
1)資源檔的位置只能放置類路徑下,即IDE工具的src目錄下
        2)負載檔案時,會一次性載入全部檔案
        3)/表示當前/WEB-INF/classes/

注意:

 1>物理硬碟路徑使用\[window系統]
     2>網路路徑使用/
     3> 如果/表示用戶端路徑的話,表示tomcat/webapps/目錄




怎調用Servlet來處理

< description>*:為Servlet指定一個文本描述。< display-name>*:為Servlet提供一個簡短的名字被某些工具顯示。< icon>*:為Servlet指定一個表徵圖,在圖形管理工具中表示該Servlet。< servlet-name>:Servlet的名字,唯一性。< servlet-class>or< jsp-file>:< servlet-class>為Servlet的完整路徑。< jsp-file>指定web應用程式中的jsp檔案完整路徑以/開始對一個jsp檔案做URL映射。< init-param>*:定義Servlet初始化參數。< description>*:初始化參數文本描述。< pararm-name>:初始化參數的名字。< param-value>:初始化參數的值。< load-on-startup>?:WEB應用程式被啟動時,Servlet被載入的順序。內容為一個整型值。負數或沒有設定這個元素表示Servlet容器將在用戶端請求這個Servlet的時候載入它正數或o表示WEB應用程式被啟動時按數值大小由小到大初始化Servlet。如果同時包含< jsp-file>元素和< load-on-startup>,則jsp檔案也被先行編譯並載入。< run-as>?:動作項目的角色< descripttion>:文本描述。< role-name>:指定動作項目的角色名稱字。< security-role-ref>*:聲明在組件或部署的組件的代碼中的資訊安全角色引用。< description>*:資訊安全角色文本描述。< role-name>:使用的資訊安全角色的名字。< role-line>?:指定到一個資訊安全角色的引用。二,< servlet-mapping>元素及其子項目,在servlet和url之間定義一個映射。< servlet-name>:Servlet的名字,唯一性和一致性。與< servlet>元素中聲明的名字一致。< url-pattern>:指定相對於Servlet的URL的路徑。該路徑相對於web應用程式內容相關的根路徑。三,載入Servlet的過程容器的Context對象對請求路徑(URL)做出處理,去掉請求URL的上下文路徑後,按路徑映射規則和Servlet映射路徑(< url-pattern>)做匹配,如果匹配成功,則調用Servlet處理請求。匹配規則:請求URL精確匹配,如果成功則調用Servlet處理請求。匹配最長的路徑首碼,以/為路徑分隔字元,按路徑樹逐級匹配,選擇最長相符的Servlet來處理。如果前面都沒有匹配成功,則容器會讓WEB應用程式來調用Servlet處理請求。如果沒有定義預設Servlet,容器將向用戶端發送404(請求資源不存在)錯誤資訊。Scala語言中的Scala Servlet敘述Servlet API的討論介紹Servlet容器與ContextServlet源檔案到Class的過程詳解Listener監聽Http Session
 
servlet找不到路徑的問題

那麼你不需要手動設定classpath,按如下步驟:
1.在eclipse中設定好jdk路徑。
2.在elipse中設定好tomcat路徑。
3.建立項目的時候,切記是建立web project,這樣會將j2ee的包自動匯入到項目中去
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.