分享
 
 
 

如何使用ExternalContext类

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

使用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-init元素:

<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的值输出到控制台。

FacesContext facesContext = FacesContext.getCurrentInstance();

ExternalContext externalContext = facesContext.getExternalContext();

Map paramMap = externalContext.getInitParameterMap();

if (paramMap!=null) {

System.out.println(paramMap.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/

图3-2 测试getResourcesPath的目录结构

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有