16,使用ServletConfig
ServletConfig相當於個別Servlet的設置信息代表對象,這意味着可以從ServletConfig中取得Servlet設置信息。
ServletConfig定義了getInitParameter(),getInitParameterNames()方法,可以取得設置Servlet時的初始參數。
使用註解設置個別Servlet的初始參數,可以在@WebServlet中使用@WebInitParam設置initParams屬性。
@WebServlet(name="ServletConfigDemo",urlPatterns={"/conf"},
initParams={
@WebInitParam(name="PARAM1",value="VALUE1"),
@WebInitParam(name="PARAM2",value="VALUE2")
}
)
public class ServletConfigDemo extends HttpServlet{
private String PARAM1;
private String PARAM2;
public void init() throws ServletException{
PARAM1=getServletConfig().getInitParameter("PARAM1");
PARAM2=getServletConfig().getINitParameter("PARAM2");
}
}
由於ServletConfig必須在Web容器將Servlet實例化後,調用有參數的init()方法再將之傳入,是與Web應用程序資源相關的對象,所以在繼承HttpServlet後,
通常會重新定義無參數的init方法以進行Servlet初始參數的取得。
Servlet初始參數通常作爲常數設置,可以將一些Servlet程序默認值使用註解設置爲初始參數,之後若想變更那些信息,可以創建web.xml進行設置,
以覆蓋註解設置,而不用修改源代碼,重新編譯,部署的操作。
17,使用ServletContext
ServletContext接口定義了運行Servlet的應用程序環境的一些行爲與觀點,可以使用ServletContext實現對象來取得所請求資源的URL,設置與存儲屬性,
應用程序初始參數,甚至動態設置Servlet實例。通過ServletConfig的getServletContext()方法可以取得ServletContext對象。以下爲需要注意的幾個方法:
(1)getRequestDispatcher()
取得RequestDispatcher實例。使用時路徑的指定必須以"/"作爲開頭,這個斜槓代表應用程序環境根目錄。
context.getRequestDispatcher("/pages/some.jsp").forward(request,response);
以"/"作爲開頭有時稱爲環境相對路徑,沒有"/"作爲開頭則稱爲請求相對路徑。實際上HttpServletREquest的getRequestDispatcher()方法在實現時,
若是環境相對路徑,則直接委託給ServetContext的getRequestDispatcher();若是請求相對路徑,則轉換爲環境相對路徑,在委託給ServletContext的getRequestDispatcher()來取得RequestDispatcher。
(2) getResourcePaths()
如果想要知道Web應用程序的某個目錄中有哪些文件,則可以使用getResourcePath()方法;
such as: for(String avatar:getServletContext().getResourcePaths("/")){}
(3)getResourceAsStream()
如過想在Web應用程序中讀取某個文件的內容,則可以使用getResourceAsStream()方法,使用時指定路徑必須以"/"作爲開頭,表示相對於應用程序環境根目錄,
運行結果返回InputStream實例,接着運用其讀取文件內容。
當使用java.io下的與文件讀取相關的類時,必須注意,使用相對路徑指定時,此時路徑不是相對於Web應用程序根目錄,而是相對於啓動Web容器時的命令執行
目錄,這是許多初學者都會由的誤解。以Tomcat爲例,若在Servlet中執行以下語句:
out.println(new File("filename").getAbsolutePath());
其會顯示filename是位於Tomcat目錄下的bin目錄中。
每個Web容器都會由一個相對應的ServletContext,由於ServletContext以Servlet名稱作爲開頭,容易被誤認爲僅是單一Servlet的代表對象。
In fact,當整個Web應用程序加載Web容器之後,容器會生成一個ServletContext作爲整個應用程序的代表,並設置給ServletConfig。