ServletConfig對象
什么是ServletConfig對象
ServletConfig對象,叫Servlet配置對象。主要用於加載配置文件的初始化參數。
創建時機
ServletConfig對象在servlet對象創建之后,調用init方法之前創建,該Config對象隨着init方法傳入到servlet中。
常用方法
java.lang.String getInitParameter(java.lang.String name) 根據名稱獲取參數值
java.util.Enumeration getInitParameterNames() 得到所有參數
ServletContext getServletContext() 獲取servlet上下文對象
ava.lang.String getServletName() 得到servlet名稱
問題:SevletConfig中的初始化參數不能被其他Servlet共享!!
下面來演示一下這些方法的使用:
我們先在servlet的配置文件web.xml配置servlet的初始化參數,然后運用上面的方法得到這些數據!
配置文件:
<servlet> <servlet-name>testpath</servlet-name> <servlet-class>com.vmaxtam.dotest.testpath</servlet-class> <init-param> --這個標簽寫在要設置的servlet內 <param-name>color</param-name> -屬性名 <param-value>red</param-value> -屬性值 </init-param> </servlet>
下面我們就在相應的servlet內得到配置好的數據吧!
ServletConfig servletConfig = getServletConfig();
String color = servletConfig.getInitParameter("color");
這樣就能得到配置好的數據了!還有更簡單的方法:
先說明一下:首先HttpServlet繼承自GenericServlet類,而GenericServlet類又繼承自Servlet接口,Servlet接口有方法getServletConfig() ,所以HttpServlet肯定有方法getServletConfig()。而GenericServlet類又實現了ServletConfig 接口,也就是他肯定實現了ServletConfig接口中的所有方法,所以以上代碼我們還可以這樣寫:
String color = getInitParameter("color");
其它方法也差不多,這里不做示范~~~
ServletContext對象
什么是ServletContext對象
我們知道一個Web應用里面可以有多個servlet,如果現在有一份數據需要傳給所有的servlet使用,那么我們就可以使用ServletContext對象了。
ServletContext對象叫servlet上下文對象。該對象在一個web應用中只會創建一個對象,代表當前web應用的環境。在當前的web應用中所有servlet都共享一個ServletContext對象。
ServletContext對象創建的時機
由ServletContext對象的特性我們可以推斷出它被創建的時機:每當一個web應用被加載,那么一個ServletContext對象就被創建了,然后web應用里的servlet就可以同使用它了!
那么,我們如何在servlet里得到這個已經創建的對象呢?
得到ServletContext對象
開發者十分巧妙的將ServletContext對象放入在了該web應用里的每一個servlet中的ServletConfig對象里!
在一個servlet被創建時,會調用它的構造方法,隨后就會調用init()方法對它初始化,而在初始化的過程中,就把ServletContext對象放入到ServletConfig對象中了!那么這個servlet得到ServletContext對象對象就十分方便了,只需要用一句代碼!
ServletContext servletContext = this.getServletContext();
ServletContext對象的常用方法
得到了ServletContext對象,我們就要想:這個對象有什么用呢!?以下介紹一下它的常用的方法。
主要有五種用法:
一)得到web應用的上下文路徑:
java.lang.String getContextPath()
二)獲取web應用的全局參數 :
java.lang.String getInitParameter(java.lang.String name)
java.util.Enumeration getInitParameterNames()
三)域對象相關的方法:
java.lang.Object getAttribute(java.lang.String name)
void setAttribute(java.lang.String name, java.lang.Object object)
void removeAttribute(java.lang.String name)
四)用於轉發:
RequestDispatcher getRequestDispatcher(java.lang.String path)
五)web應用加載資源文件方法:
java.lang.String getRealPath(java.lang.String path)
java.io.InputStream getResourceAsStream(java.lang.String path)
下面示范一下使用這些方法:
一)得到web應用的上下文路徑
通過request來調用該方法
String path = request.getContextPath();
System.out.println(path);
輸出結果:
/TestArea
web應用的路徑 是 tomcat服務器中web應用的名稱,而不是ecplise中的項目名稱。
request.getContextPath(); 為了方便獲取上下文路徑。推薦使用該方法。
二)獲取web應用的全局參數
先在web應用對應的web.xml中設置全局參數: 全局參數的標簽寫咋<web-app>標簽內
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!-- 全局參數 --> <context-param> <param-name>AAA</param-name> <param-value>AAA's value</param-value> </context-param> <context-param> <param-name>BBB</param-name> <param-value>BBB's value</param-value> </context-param>
然后在servlet內得到這個參數:
//1.得到ServletContext對象 ServletContext context = this.getServletContext(); //2.獲取全局參數 System.out.println(context.getInitParameter("AAA")); Enumeration<String> enums = context.getInitParameterNames(); while(enums.hasMoreElements()){ String paramName = enums.nextElement(); String paramValue = context.getInitParameter(paramName); System.out.println(paramName+"="+paramValue); }
注意: 所有的servlet都可以獲取全局參數!!!
三)域對象相關的方法
什么是域對象?
域對象:保存數據 和 獲取數據,用於在不同資源之間共享數據。
那么我們現在嘗試把第一個servlet的數據傳到 另一個servlet里吧!
方法一:利用跳轉,從servlet1跳轉到servlet2時,把數據寫在跳轉uri里
response.sendRedirect("/servlet2?id=867");
方法二:利用域對象方法
setAttribute(name,Object): 保存數據方法.name名稱,object數據
getAttribute(name) 獲取數據。name是保存數據時的名稱
removeAtrribute(name): 清除數據。
servlet1寫上:
ServletContext context = this.getServletContext(); context.setAttribute("id", 123);
然后servlet2獲得它吧!
ServletContext context = this.getServletContext(); String id = context.getAttribute("id");
四)用於轉發
RequestDispatcher getRequestDispatcher(java.lang.String path)
在servlet中跳轉資源:重定向 / 轉發
重定向:
1)地址欄會發送改變,變成重定向到的地址
2)重定向可以跳轉到web應該內,其他web應用,甚至站外的應用。
3)調用者和被調用者處於兩次不同的請求。不能通過request域對象來共享數據。
轉發:
1)地址欄不會發送改變。
2)轉發不能轉發到應用外的資源,不能轉發到站外資源;只能轉發到當前web應用下的資源。
3)調用者和被調用者處於同一次請求,可以通過request域對象共享數據。
資源:
1)內部資源:web應用內的資源
2)應用外的資源: 其他web應用下的資源
3)其他站點的資源
web應用加載資源文件方法
先了解一下web應用運行時的目錄:
相對路徑是指java命令的運行目錄。
java項目:ecplise工具把java命令運行的目錄設置到web應用的根目錄。
web項目: java命令運行的目錄在tomcat/bin目錄下。
有時候我們需要web應用加載一些圖片,音樂,視頻等,就需要獲得他們的路徑然后使用,可以用以下方法獲得:
java.lang.String getRealPath(java.lang.String path) --得到資源的絕對路徑
java.io.InputStream getResourceAsStream(java.lang.String path)--得到資源的的一個輸入流