熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

如何使用ExternalContext類

2013-11-13 15:52:23  來源: Oracle 

  使用ExternalContext類提供的方法可以獲取ServletContext ServletRequest和ServletResponse對象構造FacesContext實例時需要這些對象除此之外 ExternalContext實例提供了包裝器方法可以使用這些方法獲得原來需要從ServletContextServletRequest及 ServletResponse對象上調用一些方法獲得的信息

    獲取ServletContextServletRequest和ServletResponse對象
可使用下列方法獲取servlet信息
●       getContext 此方法可獲取Web應用中與當前請求相關聯的ServletContext對象其簽名如下
public abstract Object getContext()
●      getRequest 此方法可獲取代表當前正在處理的請求的ServletRequest對象其簽名如下
public abstract Object getRequest()
●       getResponse 此方法可獲取代表當前正在呈現的響應的ServletResponse對象其簽名如下
public abstract Object getResponse()
這些方法都是返回一個javalangObject對象不是servlet特有的類型這樣就可以使JSF實現獨立於其運行的環境比如JSF既可用於Web容器也可以用於其他容器如portlet等

    獲取ServletContext特性
getApplicationMap方法返回一個包含ServletContext對象裡全部特性名/值對的Map對象下面是此方法的簽名
public abstract javautilMap getApplication()
作為一個例子下面的代碼可獲取一個名叫databaseUtility的特性
Object contextAttribute = null;
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Map contextMap = externalContextgetApplicationMap();
if (contextMap!=null)
contextAttribute = contextMapget(databaseUtility);

    獲取Session對象及其特性
通過ExternalContext對象可訪問與當前請求相關聯的Session對象getSession方法可取回當前用戶的 javaxservlethttpHttpSession對象如果當前用戶沒有相應的Session對象此方法的行為由傳入的參數決定如果為 該方法傳入了一個true值它會創建一個Session對象否則它會返回null下面是getSession方法的簽名
public abstract Object getSession(boolean create)
此方法其實是javaxservlethttpHttpServletRequest接口中getSession方法的包裝器
getSessionMap方法返回一個包含與當前請求相關聯的Session對象裡所有特性名/值對的Map對象下面是它的方法簽名
public abstract javautilgetSessionMap()
要獲取Session對象裡的特性可調用Map類的get方法傳入要獲取的特性名即可文檔中沒有指明在當前請求沒有相應Session對 象的情況下此方法是返回null還是一個空的Map對象所以在調用Map的get方法之前需要先檢查Map是否為null下面的代碼是獲取 Session特性的例子
Object sessionAttribute = null;
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Map sessionMap = externalContextgetSessionMap();
if (sessionMap!=null)
sessionAttribute = sessionMapget(key);
最後一行的key是一個包含特性名的字符串

    獲取ServletContext對象的初始參數
getInitParameter方法是ServletContext對象的getInitParameter方法的包裝器用這個方法可以提取在部署描述符(webxml文件)裡用contextinit元素指定的初始參數值此方法的簽名如下
public abstract String getInitParameter(String parameterName)
舉例來說如果在部署描述符聲明了如下contextinit元素
<contextparam>
<paramname>contactPerson</paramname>
<paramvalue>Scott Jobim</paramvalue>
</contextparam>
下面代碼中的字符串變量initParam的值會是Scott Jobim
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
String initParam = externalContextgetInitParameter(contactPerson);
getInitParameterMap方法返回一個包含ServletContext對象中全部初始參數的Map對象其簽名如下
public abstract javautilMap getInitParameterMap()
為了獲取一個初始參數的值使用Map對象的get方法同時傳遞初始參數的名稱比如下面的代碼把初始參數databaseName的值輸出到控制台
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Map paramMap = externalContextgetInitParameterMap();
if (paramMap!=null) {
Systemoutprintln(paramMapget(databaseName));
}

    獲取Request對象的特性
getRequestMap方法返回一個包含當前Request對象中全部特性名/值對的Map對象其方法簽名如下
public abstract javautilMap getRequestMap()
作為一個例子下面的代碼可用來提取Request對象裡的特性
Object requestAttribute = null;
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Map requestMap = externalContextgetRequestMap();
if (requestMap!=null)
requestAttribute = requestMapget(key);
最後一行裡的Key是一個包含要提取的屬性名的字符串

    訪問Request對象裡的參數名和值
getRequestParameterMapgetRequestParameterNames和getRequestParameterValuesMap方法可用來訪問Request對象裡的參數名和值
getRequestParameterMap返回一個包含Request對象裡全部參數名/值對的Map對象其簽名如下
public abstract javautilMap getRequestParameterMap()
作為一個例子下面的代碼可用來提取名為id的請求參數的值
String id = null;
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Map requestParameterMap = externalContextgetRequestParameterMap();
if (requestParameterMap!=null)
id = (String) requestParameterMapget(id);
getRequestParameterNames方法返回一個包含全部請求參數名的Iterator此方法其實是 ServletRequestgetParameterNames方法的包裝器不同的是ExternalContext類的 getRequestParameterNames返回一個Iterator而不是javautilEnumeration此方法的簽名如下
public abstract javautilIterator getRequestParameterNames()
作為一個例子下面的代碼把所有的請求參數名/值對輸出到控制台
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Map requestParameterMap = externalContextgetRequestParameterMap();
Iterator parameterNames = externalContextgetRequestParameterNames();
while (parameterNameshasNext()) {
String parameterName = (String) parameterNamesnext();
String parameterValue =
(String) requestParameterMapget(parameterName);
Systemoutprintln(parameterName + : + parameterValue);
}
getRequestParameterValuesMap方法返回一個包含Request對象裡全部參數名/值對的Map對象此方法與 getRequestParameterMap方法很相似但getRequestParameterValuesMap可返回全部相同參數名的值在此 方法返回的Map對象上調用get(key)方法這一點等同於獲取當前請求的ServletRequest並在其上調用 getParameterValues(key)也就是說Map對象返回的是一個字符串數組 GetRequestParameterValuesMap方法的簽名如下
public abstract javautilMap getRequestParameterValuesMap()
下面例子中的代碼把請求參數id的全部值輸出到控制台
String[] id = null;
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Map requestParameterValuesMap = externalContextgetRequestParameterValuesMap();
if (requestParameterValuesMap!=null) {
id = (String[]) requestParameterValuesMapget(id);
// print all values of id
for (int i=; i<idlength; i++) {
Systemoutprintln(id[i]);
}
}

    獲取請求頭的名和值
getRequestHeaderMap方法返回一個包含當前請求中全部頭名/值對的Map對象其方法簽名如下
public abstract javautilMap getRequestHeaderMap()
舉個例子來說下面的代碼提取host頭的值
String host = null;
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Map headerMap = externalContextgetRequestHeaderMap();
if (headerMap!=null) {
host = (String) headerMapget(host);
Systemoutprintln(host);
}

  注意
報頭的名稱是不區分大小寫的比如對getRequestHeaderMap返回的Map對象分別用hostHost和Host作為參數來調用get方法其結果是一樣的
getRequestHeaderValuesMap方法與getRequestHeaderMap方法相似但在getRequestHeader
ValuesMap方法返回的Map對象上調用get方法會得到一個字符串的數組getRequestHeaderValuesMap方法的簽名如下
public abstract javautilMap getRequestHeaderValuesMap()
在getRequestHeaderValuesMap方法返回的Map對象上調用get方法會返回一個javautilEnumeration值
下面的代碼使用getRequestHeaderValuesMap方法來獲取一個包含全部頭名/值對的Map對象然後在此Map對象上調用get方法以獲取全部AcceptEncoding頭的值並將結果輸出到控制台
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Map headerValuesMap = externalContextgetRequestHeaderValuesMap();
if (headerValuesMap!=null) {
Enumeration headers =
(Enumeration) headerValuesMapget(AcceptEncoding);
while (headershasMoreElements()) {
String value = (String) headersnextElement();
Systemoutprintln(value);
}
}

    獲取Cookie
getRequestCookies方法是HttpServletRequestgetCookies方法的包裝器它返回一個javaxservlethttpCookie對象的數組數組中是當前Request對象裡的全部Cookie此方法的簽名如下
public abstract Cookie[] getRequestCookies()
例如下面的代碼取得當前請求中的全部Cookie對象然後在結果數組上循環輸出全部Cookie的名和值
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Cookie[] cookies = externalContextgetRequestCookies();
for (int i=; i<cookieslength; i++) {
Cookie cookie = cookies[i];
String cookieName = cookiegetName();
String cookieValue = cookiegetValue();
Systemoutprintln(cookieName + : + cookieValue);
}
getRequestCookieMap方法返回一個包含當前請求中全部Cookie的以Cookie的名稱作為鍵的Map對象在此Map 對象上調用get方法會返回一個javaxservlethttpCookie對象GetRequestCookieMap方法的簽名如下
public abstract javautilMap getRequestCookieMap()
例如下面的代碼取得名為password的Cookie對象並將其值輸出到控制台
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Map cookieMap = externalContextgetRequestCookieMap();
if (cookieMap!=null) {
Cookie cookie = (Cookie) cookieMapget(password);
if (cookie!=null)
Systemoutprintln(Value: + cookiegetValue());
}
注意
Cookie名稱區分大小寫

    獲取場所
getRequestLocale方法是ServletRequestgetLocale方法的包裝器它返回Request對象中的Locale對象此方法的簽名如下
public abstract javautilLocale getRequestLocale()
例如下面的代碼取回用戶的場所並輸出該場所的顯示語言和顯示國家
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Locale locale = externalContextgetRequestLocale();
Systemoutprintln(Language: + localegetDisplayLanguage());
Systemoutprintln(Country: + localegetDisplayCountry());

    獲取上下文路徑
getRequestContextPath是HttpServletRequestgetContextPath方法的包裝器它返回請求URI中指明請求上下文的上下文路徑部分其方法簽名如下
public abstract String getRequestContextPath()
下面的代碼段把請求URI的上下文路徑輸出到控制台
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Systemoutprintln(Context path: +
externalContextgetRequestContextPath());
對於URL 來說getRequestContextPath方法的返回值為/JSFCh
getRequestPathInfo方法是HttpServletRequestgetPathInfo方法的包裝器它返回當客戶端進行 請求時與客戶端發送的URL相關聯的額外路徑信息這部分信息跟在servlet路徑信息的後面但在查詢字符串之前 getRequestPathInfo方法的簽名如下
public abstract String getRequestPathInfo()
例如下面代碼輸出請求URL的路徑信息
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Systemoutprintln(Path info: +
externalContextgetRequestPathInfo());
對於URL 而言getRequestPathInfo方法的返回值為testjsp

    獲取資源路徑
getResourcePaths方法是ServletContext類的getResourcePaths方法的包裝器它返回一個Set對 象其中包含Web應用中最長子路徑與傳入的路徑參數相匹配的資源路徑表示子目錄的路徑以/結束返回的路徑是相對於Web應用根路徑的相對路徑 並以/開始此方法的簽名如下
public abstract javautilSet getResourcePaths(String path)
比如考慮如下代碼
FacesContext facesContext = FacesContextgetCurrentInstance();
ExternalContext externalContext = facesContextgetExternalContext();
Set resourcePaths = externalContextgetResourcePaths(/);
Iterator iterator = erator();
while (iteratorhasNext()) {
String path = (String) iteratornext();
Systemoutprintln(path);
}
Systemoutprintln();
resourcePaths = externalContextgetResourcePaths(/WEBINF);
iterator = erator();
while (iteratorhasNext()) {
String path = (String) iteratornext();
Systemoutprintln(path);
}
這段代碼兩次調用了getResourcePaths方法第一次傳入/第二次傳入/WEBINF如果在一個目錄結構如圖所示的Web應用裡運行以上代碼則返回的第一個Set裡包含如下路徑
/orderjsp
/indexjsp
/Stylescss
/images/
/detailsjsp
/WEBINF/
/checkOutjsp
/browsejsp
/shoppingCartjsp
/searchjsp
/menujsp
第二個Set裡包含如下路徑
/WEBINF/facesconfigxml
/WEBINF/webxml
/WEBINF/classes/
/WEBINF/lib/
  測試getResourcesPath的目錄結構
getResourceAsStream方法是ServletContextgetResourceAsStream的包裝器它返回指定路徑中作為javaioInputStream對象的資源其方法簽名如下
public abstract javaioInputStream getResourceAsStream(String path)

    編碼URL
encodeURL方法是HttpServletResponseencodeURL方法的包裝器它編碼給定的URL其方法是加入會話的ID信息或者如果不需要這個步驟則直接將給定的URL原封不動地返回其方法簽名如下
public abstract String encodeURL(String url)
在portlet中使用JSF時encodeActionURL和encodeResourceURL方法很有用encodeActionURL迫使URL作為參數傳遞造成動作在入口/portlet中起作用這個方法的簽名如下
public abstract String encodeResourceURL(String sb)
encodeResourceURL方法迫使URL作為參數傳遞引用資源以在入口/portlet中起作用該方法造成URL需要根據包括的特定入口進行重定向實際上它簡單地返回一個絕對URL下面是encodeResourceURL方法的簽名
public abstract String encodeResourceURL(String sb)

    分派請求
dispatchMessage方法可根據當前上下文分派請求對servlet而言它通過調用forward實現這一點而對portlet而言則是通過調用include方法實現這一點此方法的簽名如下
public abstract void dispatchMessage(String requestURL)
throws javaioIOException FacesException


From:http://tw.wingwit.com/Article/program/Oracle/201311/17433.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.