使用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]);
}
}