JSF如何使用ExternalContext

开发 后端
本文介绍JSF如何使用ExternalContext,使用ExternalContext类提供的方法可以获取ServletContext、ServletRequest和ServletResponse对象,构造FacesContext实例时需要这些对象。

使用ExternalContext类提供的方法可以获取ServletContext、ServletRequest和ServletResponse 对象,构造FacesContext实例时需要这些对象。除此之外,ExternalContext实例提供了包装器方法,可以使用这些方法获得原来需要从ServletContext、ServletRequest及ServletResponse对象上调用一些方法获得的信息。

获取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等。

获取ServletContext特性getApplicationMap方法返回一个包含ServletContext对象里全部特性名/值对的Map 对象。下面是此方法的签名:public abstract java.util.Map getApplication()作为一个例子,下面的代码可获取一个名叫databaseUtility的特性:

  1. Object contextAttribute = null;    
  2. FacesContext facesContext = FacesContext.getCurrentInstance();    
  3. ExternalContext externalContext = facesContext.getExternalContext();    
  4. Map contextMap = externalContext.getApplicationMap();    
  5. if (contextMap!=null)contextAttribute = contextMap.get("databaseUtility");   

获取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是一个包含特性名的字符串。

获取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"));}

获取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是一个包含要提取的属性名的字符串。

访问Request对象里的参数名和值getRequestParameterMap、getRequestParameterNames和 getRequestParameterValuesMap方法可用来访问Request对象里的参数名和值。 getRequestParameterMap返回一个包含Request对象里全部参数名/值对的Map对象。其签名如下:public abstract java.util.Map getRequestParameterMap()作为一个例子,下面的代码可用来提取名为id的请求参数的值:

  1. String id = null;    
  2. FacesContext facesContext = FacesContext.getCurrentInstance();    
  3. ExternalContext externalContext = facesContext.getExternalContext();    
  4. Map requestParameterMap = externalContext.getRequestParameterMap();    
  5. if (requestParameterMap!=null)    
  6. id = (String) requestParameterMap.get("id");  

getRequestParameterNames方法返回一个包含全部请求参数名的Iterator。此方法其实是 ServletRequest.getParameterNames方法的包装器。不同的是,ExternalContext类的 getRequestParameterNames返回一个Iterator,而不是java.util.Enumeration。此方法的签名如下:
public abstract java.util.Iterator getRequestParameterNames()
作为一个例子,下面的代码把所有的请求参数名/值对输出到控制台。

  1. FacesContext facesContext = FacesContext.getCurrentInstance();    
  2. ExternalContext externalContext = facesContext.getExternalContext();    
  3. Map requestParameterMap = externalContext.getRequestParameterMap();    
  4. Iterator parameterNames = externalContext.getRequestParameterNames();    
  5.  while (parameterNames.hasNext()) {    
  6.     String parameterName = (String) parameterNames.next();    
  7.     String parameterValue =(String) requestParameterMap.get(parameterName);    
  8.     System.out.println(parameterName + " : " + parameterValue);    
  9.  }   

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

  1. String[] id = null;    
  2. FacesContext facesContext = FacesContext.getCurrentInstance();    
  3. ExternalContext externalContext = facesContext.getExternalContext();    
  4. Map requestParameterValuesMap = externalContext.getRequestParameterValuesMap();    
  5. if (requestParameterValuesMap!=null) {    
  6.     id = (String[]) requestParameterValuesMap.get("id");// print all values of id    
  7.     for (int i=0; i<id.length; i++) {    
  8.        System.out.println(id[i]);    
  9.     }    
  10. }   

获取请求头的名和值getRequestHeaderMap方法返回一个包含当前请求中全部头名/值对的Map对象。其方法签名如下:
public abstract java.util.Map getRequestHeaderMap()
举个例子来说,下面的代码提取host头的值:

  1. String host = null;    
  2. FacesContext facesContext = FacesContext.getCurrentInstance();    
  3. ExternalContext externalContext = facesContext.getExternalContext();    
  4.  Map headerMap = externalContext.getRequestHeaderMap();    
  5. if (headerMap!=null) {    
  6.      host = (String) headerMap.get("host");    
  7.      System.out.println(host);    
  8. }   

注意:报头的名称是不区分大小写的。比如,对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头的值,并将结果输出到控制台。

  1. FacesContext facesContext = FacesContext.getCurrentInstance();    
  2. ExternalContext externalContext = facesContext.getExternalContext();    
  3. Map headerValuesMap = externalContext.getRequestHeaderValuesMap();    
  4. if (headerValuesMap!=null) {    
  5.      Enumeration headers =(Enumeration) headerValuesMap.get("Accept-Encoding");    
  6.      while (headers.hasMoreElements()) {    
  7.         String value = (String) headers.nextElement();    
  8.         System.out.println(value);    
  9.     }    
  10. }   

 

【编辑推荐】

  1. 使JSF支持带有HTMLMessage
  2. 利用JSF和Hibernate构建Web应用
  3. 比较JSF、Spring MVC、Stripes、Struts 2、Tapestry、Wicket
  4. JSF能否拯救WEB
  5. 各种JSF框架比较
责任编辑:佚名 来源: JavaEye
相关推荐

2009-06-24 13:06:41

JSF组件Facelets

2009-06-26 13:48:57

G4JSFGWTJSF

2012-02-24 15:25:45

ibmdw

2009-06-29 14:19:50

2009-06-24 17:34:58

使用JSF的经验

2009-06-23 11:35:44

JSF的Naviati

2009-06-24 09:19:56

JSF标记JSTL标记

2009-09-23 17:56:45

JSF入门

2009-06-22 16:24:33

JSF框架中使用的设计

2009-06-25 11:11:25

控制JSF切入点

2009-06-24 17:21:23

JSF框架设计模式

2009-06-12 18:35:33

JSF f:loadB

2009-06-26 14:06:08

JSF基础框架

2009-06-23 16:22:23

JSF能否

2009-06-29 14:30:27

JSF技术

2009-06-23 13:55:17

JSF标签

2009-06-22 14:13:08

JSF入门

2009-06-23 13:01:04

JSF应用

2009-06-24 14:25:13

JSF整体架构

2009-06-26 10:54:24

JSF技术
点赞
收藏

51CTO技术栈公众号