SerlvetConfig
在Serlvet的配置文件中,可以使用一個或多個<init-param><param-name></param-name><param-value></param-value>
</init-param>標簽為servlet配置一些初始化參數。
該類是init初始化的參數類,當servlet配置了初始化參數時,web容器在創建servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,並在調用init方法時將該對象作為參數傳遞給servlet,可以通過該對象獲得一些servlet的初始化參數信息。
常用方法
getInitParameter(name);通過name值獲得value值
getInitParameterNames();獲取參數name值的Enumeration的集合,再遍歷集合通過上面的方法獲取value值
在其他方法中獲取ServletConfig對象的方法,在類中創建ServletConfig對象引用作為成員變量,在init方法中對引用賦值,然后再在其他方法中調用,這一點GeneralServlet類已經在實現了,而且提供了訪問成員變量對象的方法getSerbletConfig(),所以自己就不用再寫這一過程了。
每個Serlvet程序都對應着一個Config文件,是相互獨立的。
Web應用對象SerlvetContext
每個Web應用程序都創建一個對用的ServletContext對象,代表當前web應用。
ServletConfig對象中維護了了ServletContext對象的引用,可以同過ServletConfig.getServletContext()方法或得該對象。由於一個web應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServlertContext對象來實現通訊,ServletContext對象通暢也被成為context域對象
常見應用
1.獲得整個web應用初始化參數
ServletConfig對象配置的參數只對對應的servlet有效,而ServletContext是整個web工程中的所有Servlet對象有效,他的配置是通過在web.xml配置<context-param>標簽完成的,而ServletConfig是在servlet的配置標簽內的<init-param>標簽配置的。
通過ServletConfig.getServletContext()方法或得該對象再通過getInitParameter(name)或得具體的參數。當然在GeneralServlet類中已經封裝了獲取該對象的方法,直接調用繼承的getServletContext()方法即可。
2,實現全局數據共享
將共享數據封裝在ServletContext對象中,通過setAttribute()方法。setAttribute(string name, string value):增加一個指定名稱和值的新屬性,或者把一個現有的屬性設定為指定的值。這個方法在Javascript中也常用。再通過getAttribute(name)方法獲取該數據,要注意該方法返回的是Object對象常需要進行類型轉換。
實例統計網站被訪問次數。
3,實現服務器的程序轉發功能
轉發:如果服務器端處理客戶端請求時,如果需要多個服務器程序同時連續進行處理,需要采用轉發操作。要注意與重定向的區別,轉發是在服務器內部完成的,只有一次請求與響應,而重定向則是在服務器與客戶端之間來回多次的請求與響應完成跳轉的。
通過ServletContext對象的getRequestDispatcher("")方法獲取轉發調度器對象並在參數中指定目的servlet程序對象的目錄,最后通過dispatcher調度器的forward(request,response)執行調度轉發。
4,讀取web工程資源文件
Servlet程序讀取資源文件的方式與java程序io流讀取資源文件是不同的,java程序讀取文件是沒有什么限制的,也可以使用相對路徑,而Servlet程序是運行在web服務器中的,他只能讀取web根目錄之內的資源文件,且必須使用絕對磁盤路徑。要區分開發環境與運行環境的區別。
string filename=getServletContext().getRealPath(filename);獲取絕對磁盤路徑,然后再通過io流讀取。
另外對於web-inf/classes目錄下的class文件,被類加載器加載,可以通過一類的動態加載反射獲取.class字節碼文件對象,Class c=HelloServlet.class; String filename=c.getResource("/文件名").getFile();查找帶有給定名稱的資源獲取絕對路徑然后再通過IO流讀取。這種方式在Java程序中也是可以使用的。
缺省Servlet
即為默認Servlet,該程序的訪問路徑是/,在web.xml中配置了DefaultServlet。他的功能是處理其他Servlet都不處理的請求,web服務器中的所有靜態資源其實都是通過缺省Servlet進行轉發的。tomcat內置有該缺省Servlet。
將用戶訪問資源返回的過程
1,獲取訪問目標資源路徑 String path=request.getRequestURI().substring(request.getContextPath().length()); 2.判斷文件是否存在並將資源寫入響應流。 String filename=getServletContext().getRealPath(path); File file=new File(filename); if(file.exists()){ InputStream in=new FileInputStream(file); OutputStream out=response.getOutputStream(); int b; while((b=in.read())!=-1){ out.write(b); } in.close(); out.close(); }else{ response.setStatus(404); }