如何使用ExternalContext类

使用ExternalContext类提供的方法可以获取ServletContext、 ServletRequest和ServletResponse对象,构造FacesContext实例时需要这些对象。除此之外, ExternalContext实例提供了包装器方法,可以使用这些方法获得原来需要从ServletContext、ServletRequest及 ServletResponse对象上调用一些方法获得的信息。
3.3.1  获取ServletContext、ServletRequest和ServletResponse对象
可使用下列方法获取servlet信息:
●       getContext 此方法可获取Web应用中与当前请求相关联的ServletContext对象。其签名如下:
public abstract Object getContext()
●      getRequest 此方法可获取代表当前正在处理的请求的ServletRequest对象。其签名如下:
public abstract Object getRequest()
●       getResponse 此方法可获取代表当前正在呈现的响应的ServletResponse对象。其签名如下:
public abstract Object getResponse()
这些方法都是返回一个java.lang.Object对象,不是servlet特有的类型,这样就可以使JSF实现独立于其运行的环境。比如,JSF既可用于Web容器,也可以用于其他容器,如portlet等。
3.3.2  获取ServletContext特性
getApplicationMap方法返回一个包含ServletContext对象里全部特性名/值对的Map对象。下面是此方法的签名:
public abstract java.util.Map getApplication()
作为一个例子,下面的代码可获取一个名叫databaseUtility的特性:
Object contextAttribute  =   null ;
FacesContext facesContext 
=  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
Map contextMap 
=  externalContext.getApplicationMap();
if  (contextMap != null )
contextAttribute 
=  contextMap.get( " databaseUtility " );
3.3.3  获取Session对象及其特性
通过ExternalContext对象可访问与当前请求相关联的Session对象。getSession方法可取回当前用户的 javax.servlet.http.HttpSession对象,如果当前用户没有相应的Session对象,此方法的行为由传入的参数决定:如果为 该方法传入了一个true值,它会创建一个Session对象;否则,它会返回null。下面是getSession方法的签名:
public abstract Object getSession(boolean create)
此方法其实是javax.servlet.http.HttpServletRequest接口中getSession方法的包装器。
getSessionMap方法返回一个包含与当前请求相关联的Session对象里所有特性名/值对的Map对象。下面是它的方法签名:
public abstract java.util.getSessionMap()
要获取Session对象里的特性,可调用Map类的get方法,传入要获取的特性名即可。文档中没有指明在当前请求没有相应Session对 象的情况下,此方法是返回null还是一个空的Map对象。所以在调用Map的get方法之前,需要先检查Map是否为null。下面的代码是获取 Session特性的例子:
Object sessionAttribute  =   null ;
FacesContext facesContext 
=  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
Map sessionMap 
=  externalContext.getSessionMap();
if  (sessionMap != null )
sessionAttribute 
=  sessionMap.get(key);
最后一行的key是一个包含特性名的字符串。
3.3.4  获取ServletContext对象的初始参数
getInitParameter方法是ServletContext对象的getInitParameter方法的包装器,用这个方法可以提取在部署描述符(web.xml文件)里用context-init元素指定的初始参数值。此方法的签名如下:
public abstract String getInitParameter(String parameterName)
举例来说,如果在部署描述符声明了如下context-param元素:
< context-param >
< param-name > contactPerson </ param-name >
< param-value > Scott Jobim </ param-value >
</ context-param >
下面代码中的字符串变量initParam的值会是Scott Jobim。
FacesContext facesContext  =  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
String initParam 
=  externalContext.getInitParameter( " contactPerson " );
getInitParameterMap方法返回一个包含ServletContext对象中全部初始参数的Map对象。其签名如下:
public abstract java.util.Map getInitParameterMap()
为了获取一个初始参数的值,使用Map对象的get方法,同时传递初始参数的名称。比如,下面的代码把初始参数databaseName的值输出到控制台。
 
3.3.5  获取Request对象的特性
getRequestMap方法返回一个包含当前Request对象中全部特性名/值对的Map对象。其方法签名如下:
public abstract java.util.Map getRequestMap()
作为一个例子,下面的代码可用来提取Request对象里的特性:
Object requestAttribute  =   null ;
FacesContext facesContext 
=  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
Map requestMap 
=  externalContext.getRequestMap();
if  (requestMap != null )
requestAttribute 
=  requestMap.get(key);
最后一行里的Key是一个包含要提取的属性名的字符串。
3.3.6  访问Request对象里的参数名和值
getRequestParameterMap、getRequestParameterNames和getRequestParameterValuesMap方法可用来访问Request对象里的参数名和值。
getRequestParameterMap返回一个包含Request对象里全部参数名/值对的Map对象。其签名如下:
public abstract java.util.Map getRequestParameterMap()
作为一个例子,下面的代码可用来提取名为id的请求参数的值:
String id  =   null ;
FacesContext facesContext 
=  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
Map requestParameterMap 
=  externalContext.getRequestParameterMap();
if  (requestParameterMap != null )
id 
=  (String) requestParameterMap.get( " id " );
getRequestParameterNames方法返回一个包含全部请求参数名的Iterator。此方法其实是 ServletRequest.getParameterNames方法的包装器。不同的是,ExternalContext类的 getRequestParameterNames返回一个Iterator,而不是java.util.Enumeration。此方法的签名如下:
public abstract java.util.Iterator getRequestParameterNames()
作为一个例子,下面的代码把所有的请求参数名/值对输出到控制台。
FacesContext facesContext  =  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
Map requestParameterMap 
=  externalContext.getRequestParameterMap();
Iterator parameterNames 
=  externalContext.getRequestParameterNames();
while  (parameterNames.hasNext())  {
String parameterName 
= (String) parameterNames.next();
String parameterValue 
=
(String) requestParameterMap.get(parameterName);
System.out.println(parameterName 
+ " : " + parameterValue);
}

getRequestParameterValuesMap方法返回一个包含Request对象里全部参数名/值对的Map对象。此方法与 getRequestParameterMap方法很相似,但getRequestParameterValuesMap可返回全部相同参数名的值。在此 方法返回的Map对象上调用get(key)方法,这一点等同于获取当前请求的ServletRequest并在其上调用 getParameterValues(key)。也就是说,Map对象返回的是一个字符串数组。 GetRequestParameterValuesMap方法的签名如下:
public abstract java.util.Map getRequestParameterValuesMap()
下面例子中的代码把请求参数id的全部值输出到控制台。
String[] id = null ;
FacesContext facesContext 
=
 FacesContext.getCurrentInstance();
ExternalContext externalContext 
=
 facesContext.getExternalContext();
Map requestParameterValuesMap 
=
 externalContext.getRequestParameterValuesMap();
if (requestParameterValuesMap!=null
{
id 
= (String[]) requestParameterValuesMap.get("id"
);
// print all values of id

for (int i=0; i<id.length; i++{
System.out.println(id[i]);
}

}

3.3.7  获取请求头的名和值
getRequestHeaderMap方法返回一个包含当前请求中全部头名/值对的Map对象。其方法签名如下:
public abstract java.util.Map getRequestHeaderMap()
举个例子来说,下面的代码提取host头的值:
String host  =   null ;
FacesContext facesContext 
=  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
Map headerMap 
=  externalContext.getRequestHeaderMap();
if  (headerMap != null {
host 
= (String) headerMap.get("host");
System.out.println(host);
}

注意:
报头的名称是不区分大小写的。比如,对getRequestHeaderMap返回的Map对象分别用host、Host和Host作为参数来调用get方法,其结果是一样的。
getRequestHeaderValuesMap方法与getRequestHeaderMap方法相似。但在getRequestHeader
ValuesMap方法返回的Map对象上调用get方法会得到一个字符串的数组。getRequestHeaderValuesMap方法的签名如下:
public abstract java.util.Map getRequestHeaderValuesMap()
在getRequestHeaderValuesMap方法返回的Map对象上调用get方法会返回一个java.util.Enumeration值。
下面的代码使用getRequestHeaderValuesMap方法来获取一个包含全部头名/值对的Map对象,然后在此Map对象上调用get方法以获取全部Accept-Encoding头的值,并将结果输出到控制台。
FacesContext facesContext =  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=
 facesContext.getExternalContext();
Map headerValuesMap 
=
 externalContext.getRequestHeaderValuesMap();
if (headerValuesMap!=null
{
Enumeration headers 
=

(Enumeration) headerValuesMap.get(
"Accept-Encoding");
while (headers.hasMoreElements()) 
{
String value 
=
 (String) headers.nextElement();
System.out.println(value);
}

}

3.3.8  获取Cookie
getRequestCookies方法是HttpServletRequest.getCookies方法的包装器,它返回一个javax.servlet.http.Cookie对象的数组,数组中是当前Request对象里的全部Cookie。此方法的签名如下:
public abstract Cookie[] getRequestCookies()
例如,下面的代码取得当前请求中的全部Cookie对象,然后在结果数组上循环,输出全部Cookie的名和值。
FacesContext facesContext  =  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
Cookie[] cookies 
=  externalContext.getRequestCookies();
for  ( int  i = 0 ; i < cookies.length; i ++ {
Cookie cookie 
= cookies[i];
String cookieName 
= cookie.getName();
String cookieValue 
= cookie.getValue();
System.out.println(cookieName 
+ " : " + cookieValue);
}

getRequestCookieMap方法返回一个包含当前请求中全部Cookie的、以Cookie的名称作为键的Map对象。在此Map 对象上调用get方法会返回一个javax.servlet.http.Cookie对象。GetRequestCookieMap方法的签名如下:
public abstract java.util.Map getRequestCookieMap()
例如,下面的代码取得名为password的Cookie对象并将其值输出到控制台。
FacesContext facesContext  =  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
Map cookieMap 
=  externalContext.getRequestCookieMap();
if  (cookieMap != null {
Cookie cookie 
= (Cookie) cookieMap.get("password");
if (cookie!=null)
System.out.println(
"Value:" + cookie.getValue());
}

注意:
Cookie名称区分大小写。
3.3.9  获取场所
getRequestLocale方法是ServletRequest.getLocale方法的包装器,它返回Request对象中的Locale对象。此方法的签名如下:
public abstract java.util.Locale getRequestLocale()
例如,下面的代码取回用户的场所并输出该场所的显示语言和显示国家。
FacesContext facesContext  =  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
Locale locale 
=  externalContext.getRequestLocale();
System.out.println(
" Language: "   +  locale.getDisplayLanguage());
System.out.println(
" Country: "   +  locale.getDisplayCountry());
3.3.10  获取上下文路径
getRequestContextPath是HttpServletRequest.getContextPath方法的包装器,它返回请求URI中指明请求上下文的上下文路径部分。其方法签名如下:
public abstract String getRequestContextPath()
下面的代码段把请求URI的上下文路径输出到控制台:
FacesContext facesContext  =  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
System.
out .println( " Context path: "   +
externalContext.getRequestContextPath());
对于URL http://localhost:8080/JSFCh03/faces/test.jsp来说,getRequestContextPath方法的返回值为/JSFCh03。
getRequestPathInfo方法是HttpServletRequest.getPathInfo方法的包装器,它返回当客户端进行 请求时与客户端发送的URL相关联的额外路径信息。这部分信息跟在servlet路径信息的后面,但在查询字符串之前。 getRequestPathInfo方法的签名如下:
public abstract String getRequestPathInfo()
例如,下面代码输出请求URL的路径信息。
FacesContext facesContext  =  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
System.
out .println( " Path info: "   +
externalContext.getRequestPathInfo());
对于URL http://localhost:8080/JSFCh03/faces/test.jsp而言,getRequestPathInfo方法的返回值为test.jsp。
3.3.11  获取资源路径
getResourcePaths方法是ServletContext类的getResourcePaths方法的包装器,它返回一个Set对 象,其中包含Web应用中最长子路径与传入的路径参数相匹配的资源路径。表示子目录的路径以“/”结束。返回的路径是相对于Web应用根路径的相对路径, 并以“/”开始。此方法的签名如下:
public abstract java.util.Set getResourcePaths(String path)
比如,考虑如下代码:
FacesContext facesContext  =  FacesContext.getCurrentInstance();
ExternalContext externalContext 
=  facesContext.getExternalContext();
Set resourcePaths 
=  externalContext.getResourcePaths( " / " );
Iterator iterator 
=  resourcePaths.iterator();
while  (iterator.hasNext())  {
String path 
= (String) iterator.next();
System.
out.println(path);
}

System.
out .println( " ---------------------------- " );
resourcePaths 
=  externalContext.getResourcePaths( " /WEB-INF " );
iterator 
=  resourcePaths.iterator();
while  (iterator.hasNext())  {
String path 
= (String) iterator.next();
System.
out.println(path);
}

这段代码两次调用了getResourcePaths方法,第一次传入“/”,第二次传入“/WEB-INF”。如果在一个目录结构如图3-2所示的Web应用里运行以上代码,则返回的第一个Set里包含如下路径:
/order.jsp
/index.jsp
/Styles.css
/images/
/details.jsp
/WEB-INF/
/checkOut.jsp
/browse.jsp
/shoppingCart.jsp
/search.jsp
/menu.jsp
第二个Set里包含如下路径:
/WEB-INF/faces-config.xml
/WEB-INF/web.xml
/WEB-INF/classes/
/WEB-INF/lib/
getResourceAsStream方法是ServletContext.getResourceAsStream的包装器,它返回指定路径中作为java.io.InputStream对象的资源。其方法签名如下:
public abstract java.io.InputStream getResourceAsStream(String path)
3.3.12  编码URL
encodeURL方法是HttpServletResponse.encodeURL方法的包装器,它编码给定的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)
3.3.13  分派请求
dispatchMessage方法可根据当前上下文分派请求。对servlet而言,它通过调用forward实现这一点;而对portlet而言,则是通过调用include方法实现这一点。此方法的签名如下:
public abstract void dispatchMessage(String requestURL)
throws java.io.IOException, FacesException
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值