使用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 |