推荐-JSF-Faces-API中的FacesContext和ExternalContext

上传人:每**** 文档编号:48388611 上传时间:2022-01-04 格式:DOC 页数:11 大小:52.50KB
收藏 版权申诉 举报 下载
推荐-JSF-Faces-API中的FacesContext和ExternalContext_第1页
第1页 / 共11页
推荐-JSF-Faces-API中的FacesContext和ExternalContext_第2页
第2页 / 共11页
推荐-JSF-Faces-API中的FacesContext和ExternalContext_第3页
第3页 / 共11页
资源描述:

《推荐-JSF-Faces-API中的FacesContext和ExternalContext》由会员分享,可在线阅读,更多相关《推荐-JSF-Faces-API中的FacesContext和ExternalContext(11页珍藏版)》请在装配图网上搜索。

1、第1章 JSF Faces API中的FacesContext和ExternalContext关键字: facescontext和externalcontext 推荐精选在Faces API中有两个类是要经常使用的. 一个是FacesContext 一个是ExternalContext.首先讲解如何使用FacesContext . 对每个JSF请求,FacesServlet对象都会为其获取一个javax.faces. context. FacesContext类的实例。FacesServlet对象将下列3个取自Web容器的对象传给javax.faces.context.FacesContext

2、Factory对象的getFacesContext方法,以此来做到这一点: javax.servlet.ServletContext javax.servlet.ServletRequest javax.servlet.ServletResponse 这意味着FacesContext的实例里包含了所有处理JSF请求所需的每个请求的状态信息。图3-1展示了FacesContext实例里封装的其他一些对象。 3.2.1 获取当前实例 一个经常用到的方法是静态的getCurrentInstance方法,它返回当前的FacesContext实例。此方法的签名如下: public static Face

3、sContext getCurrentInstance() 下面的代码是一个用此方法获取FacesContext当前实例的例子: FacesContext facesContext = FacesContext.getCurrentInstance(); 3.2.2 获取和修改组件树 FacesContext实例里最重要的内容是请求页面的组件树。组件树是由javax.faces.tree.Tree类来表示的(本章后面的“使用Tree类”一节会讨论)。FacesContext实例的tree属性就是Tree对象。 要获取或修改Tree对象,可使用tree属性的读取方法和赋值方法: public a

4、bstract Tree getTree() public abstract void setTree(Tree tree) 3.2.3 添加和获取消息 在 请求处理生命周期里,可能会遇到错误。比如,当验证器执行输入验证时,因为用户输入了不正确的值,验证可能失败;当组件试图把输入值转换为绑定到组件的模 型对象所需的类型时,也可能会失败。所有消息都必须存放到FacesContext实例里以备后面进行处理。比如,您可能希望在页面里显示错误消息,从而 为用户更正错误提供帮助。 错误消息是由javax.faces.application.Message接口(第11章再详细讨论)来表示的,您可以通过使用

5、FacesContext类的addMessage方法向FacesContext实例里添加Message对象。这个方法的签名如下: public abstract void addMessage(UIComponent component, Message message) 如果component不为空,新加入的message就关联到component上。否则,它就不与任何特定组件的实例相关。 举例来说,验证器在验证组件值失败时可调用FacesContext的addMessage方法,传入值无效的组件及一个包含特定错误消息的Message对象。 所有添加到FacesContext实例的Messa

6、ge对象都被加入到一个集合里。可通过调用getMessages方法的两个重载方法之一来获取加入的Message对象: public abstract Iterator getMessages() public abstract Iterator getMessages(UIComponent component) 第一种形式的调用在一个Iterator里返回所有Message对象,而第二种形式的调用则仅返回与给定UIComponent相关联的Message对象。 3.2.4 添加和获取请求处理事件 UIComponent 可以生成FacesEvent对象。比如,当单击一个UICommand组件

7、时,它会生成一个ActionEvent对象(ActionEvent类是 FacesEvent类的子类)。这个FacesEvent对象需要在FacesContext实例里保存起来,以备请求处理生命周期里的下一步处理事件 时所用。 可通过使用FacesContext类的addFacesEvent方法向FacesContext实例添加FacesEvent对象。此方法的签名如下: public abstract void addFacesEvent(FacesEvent event) 要提取先前添加的FacesEvent对象,可调用getFacesEvents方法,其签名如下: public abst

8、ract Iterator getFacesEvents() 此方法返回FacesEvent时的顺序与其在队列中的顺序一致。 3.2.5 向Response对象里写入信息 为 了向Response对象里写入信息,FacesContext类提供了两个属性,一个是 javax.faces.Context.ResponseStream类型,另一个是 javax.faces.context.ResponseWriter类型。ResponseStream类型的对象用于输出二进制数据,而 ResponseWriter类型的对象则用于输出字符。这些属性的读取方法和赋值方法如下: public abstrac

9、t ResponseStream getResponseStream() public abstract void setResponseStream(ResponseStream responseStream) public abstract ResponseWriter getResponseWriter() public abstract void setResponseWriter(ResponseWriter responseWriter) 3.2.6 获取和设置地区 第11章将会讨论到,JSF支持国际化和本地化。这意味着您可以根据用户的地区决定发送什么样的回应信息。locale属性

10、里存放了当前处理中所用的Locale对象。 初始状况下,locale属性的值和网络浏览器里指定的地区是一样的,但可以修改这个值,从而发送输出所使用的地区将独立于浏览器所使用的地区。此属性的读取方法和赋值方法如下: public abstract Locale getLocale() public abstract void setLocale(Locale locale) 3.2.7 操作请求处理生命周期 FacesContext类还提供了两个方法与请求处理生命周期进行交互: 在当前阶段的处理完成后,调用renderResponse方法通知JSF实现把控制权转到呈现响应阶段。也就是说,处于当前

11、阶段和呈现响应阶段之间的所有其他阶段都不再执行。 调用responseComplete方法,告诉JSF实现此次请求的HTTP响应已经完成(比如在使用了HTTP重定向的情况下)。因此,当前阶段完成后,必须中止请求处理生命周期的处理。 这些方法的签名如下: public abstract void renderResponse() public abstract void responseComplete() 3.2.8 获取其他请求状态信息 其他每个请求的状态信息封装在ExternalContext对象里,可以使用getExternalContext方法获取该对象: public abstrac

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

13、equest和ServletResponse对象 可使用下列方法获取servlet信息: getContext 此方法可获取Web应用中与当前请求相关联的ServletContext对象。其签名如下: public abstract Object getContext() getRequest 此方法可获取代表当前正在处理的请求的ServletRequest对象。其签名如下: public abstract Object getRequest() getResponse 此方法可获取代表当前正在呈现的响应的ServletResponse对象。其签名如下: public abstract Obj

14、ect getResponse() 这些方法都是返回一个java.lang.Object对象,不是servlet特有的类型,这样就可以使JSF实现独立于其运行的环境。比如,JSF既可用于Web容器,也可以用于其他容器,如portlet等。 3.3.2 获取ServletContext特性 getApplicationMap方法返回一个包含ServletContext对象里全部特性名/值对的Map对象。下面是此方法的签名: public abstract java.util.Map getApplication() 作为一个例子,下面的代码可获取一个名叫databaseUtility的特性: O

15、bject contextAttribute = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map contextMap = externalContext.getApplicationMap(); if (contextMap!=null) contextAttribute = contextMap.get(databaseUtility); 3.3.3 获取S

16、ession对象及其特性 通 过ExternalContext对象可访问与当前请求相关联的Session对象。getSession方法可取回当前用户的 javax.servlet.http.HttpSession对象,如果当前用户没有相应的Session对象,此方法的行为由传入的参数决定:如果为 该方法传入了一个true值,它会创建一个Session对象;否则,它会返回null。下面是getSession方法的签名: public abstract Object getSession(boolean create) 此方法其实是javax.servlet.http.HttpServletReq

17、uest接口中getSession方法的包装器。 getSessionMap方法返回一个包含与当前请求相关联的Session对象里所有特性名/值对的Map对象。下面是它的方法签名: public abstract java.util.getSessionMap() 要 获取Session对象里的特性,可调用Map类的get方法,传入要获取的特性名即可。文档中没有指明在当前请求没有相应Session对象的情况下, 此方法是返回null还是一个空的Map对象。所以在调用Map的get方法之前,需要先检查Map是否为null。下面的代码是获取Session特性 的例子: Object session

18、Attribute = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map sessionMap = externalContext.getSessionMap(); if (sessionMap!=null) sessionAttribute = sessionMap.get(key); 最后一行的key是一个包含特性名的字符串。 3.3.4 获取ServletC

19、ontext对象的初始参数 getInitParameter方法是ServletContext对象的getInitParameter方法的包装器,用这个方法可以提取在部署描述符(web.xml文件)里用context-init元素指定的初始参数值。此方法的签名如下: public abstract String getInitParameter(String parameterName) 举例来说,如果在部署描述符声明了如下context-init元素: contactPerson Scott Jobim 下面代码中的字符串变量initParam的值会是Scott Jobim。 FacesCo

20、ntext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); String initParam = externalContext.getInitParameter(contactPerson); getInitParameterMap方法返回一个包含ServletContext对象中全部初始参数的Map对象。其签名如下: public abstract java.util.Map getInitParame

21、terMap() 为了获取一个初始参数的值,使用Map对象的get方法,同时传递初始参数的名称。比如,下面的代码把初始参数databaseName的值输出到控制台。 FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map paramMap = externalContext.getInitParameterMap(); if (paramMap!=null) System.out.

22、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(); ExternalConte

23、xt externalContext = facesContext.getExternalContext(); Map requestMap = externalContext.getRequestMap(); if (requestMap!=null) requestAttribute = requestMap.get(key); 最后一行里的Key是一个包含要提取的属性名的字符串。 3.3.6 访问Request对象里的参数名和值 getRequestParameterMap、getRequestParameterNames和getRequestParameterValuesMap方法可用

24、来访问Request对象里的参数名和值。 getRequestParameterMap返回一个包含Request对象里全部参数名/值对的Map对象。其签名如下: public abstract java.util.Map getRequestParameterMap() 作为一个例子,下面的代码可用来提取名为id的请求参数的值: String id = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExt

25、ernalContext(); Map requestParameterMap = externalContext.getRequestParameterMap(); if (requestParameterMap!=null) id = (String) requestParameterMap.get(id); getRequestParameterNames 方法返回一个包含全部请求参数名的Iterator。此方法其实是ServletRequest.getParameterNames方法的包装器。不同 的是,ExternalContext类的getRequestParameterNames

26、返回一个Iterator,而不是 java.util.Enumeration。此方法的签名如下: public abstract java.util.Iterator getRequestParameterNames() 作为一个例子,下面的代码把所有的请求参数名/值对输出到控制台。 FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map requestParameterMap =

27、 externalContext.getRequestParameterMap(); Iterator parameterNames = externalContext.getRequestParameterNames(); while (parameterNames.hasNext() String parameterName = (String) parameterNames.next(); String parameterValue = (String) requestParameterMap.get(parameterName); System.out.println(paramete

28、rName + : + parameterValue); getRequestParameterValuesMap 方法返回一个包含Request对象里全部参数名/值对的Map对象。此方法与getRequestParameterMap方法很相似,但 getRequestParameterValuesMap可返回全部相同参数名的值。在此方法返回的Map对象上调用get(key)方法,这一点等同 于获取当前请求的ServletRequest并在其上调用getParameterValues(key)。也就是说,Map对象返回的是一个字符串数 组。GetRequestParameterValuesMa

29、p方法的签名如下: public abstract java.util.Map getRequestParameterValuesMap() 下面例子中的代码把请求参数id的全部值输出到控制台。 String id = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map requestParameterValuesMap = externalContext.getR

30、equestParameterValuesMap(); if (requestParameterValuesMap!=null) id = (String) requestParameterValuesMap.get(id); / print all values of id for (int i=0; iid.length; i+) System.out.println(idi); 3.3.7 获取请求头的名和值 getRequestHeaderMap方法返回一个包含当前请求中全部头名/值对的Map对象。其方法签名如下: public abstract java.util.Map getRe

31、questHeaderMap() 举个例子来说,下面的代码提取host头的值: String host = null; FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); Map headerMap = externalContext.getRequestHeaderMap(); if (headerMap!=null) host = (String) headerMap.get(ho

32、st); System.out.println(host); 注意: 报头的名称是不区分大小写的。比如,对getRequestHeaderMap返回的Map对象分别用host、Host和Host作为参数来调用get方法,其结果是一样的。 getRequestHeaderValuesMap方法与getRequestHeaderMap方法相似。但在getRequestHeader ValuesMap方法返回的Map对象上调用get方法会得到一个字符串的数组。getRequestHeaderValuesMap方法的签名如下: public abstract java.util.Map getRequ

33、estHeaderValuesMap() 在getRequestHeaderValuesMap方法返回的Map对象上调用get方法会返回一个java.util.Enumeration值。 下面的代码使用getRequestHeaderValuesMap方法来获取一个包含全部头名/值对的Map对象,然后在此Map对象上调用get方法以获取全部Accept-Encoding头的值,并将结果输出到控制台。 FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = f

34、acesContext.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

35、(value); 3.3.8 获取Cookie getRequestCookies方法是HttpServletRequest.getCookies方法的包装器,它返回一个javax.servlet.http.Cookie对象的数组,数组中是当前Request对象里的全部Cookie。此方法的签名如下: public abstract Cookie getRequestCookies() 例如,下面的代码取得当前请求中的全部Cookie对象,然后在结果数组上循环,输出全部Cookie的名和值。 FacesContext facesContext = FacesContext.getCurrent

36、Instance(); ExternalContext externalContext = facesContext.getExternalContext(); Cookie cookies = externalContext.getRequestCookies(); for (int i=0; icookies.length; i+) Cookie cookie = cookiesi; String cookieName = cookie.getName(); String cookieValue = cookie.getValue(); System.out.println(cookieN

37、ame + : + cookieValue); getRequestCookieMap 方法返回一个包含当前请求中全部Cookie的、以Cookie的名称作为键的Map对象。在此Map对象上调用get方法会返回一个 javax.servlet.http.Cookie对象。GetRequestCookieMap方法的签名如下: public abstract java.util.Map getRequestCookieMap() 例如,下面的代码取得名为password的Cookie对象并将其值输出到控制台。 FacesContext facesContext = FacesContext.ge

38、tCurrentInstance(); 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

39、.3.9 获取场所 getRequestLocale方法是ServletRequest.getLocale方法的包装器,它返回Request对象中的Locale对象。此方法的签名如下: public abstract java.util.Locale getRequestLocale() 例如,下面的代码取回用户的场所并输出该场所的显示语言和显示国家。 FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalC

40、ontext(); Locale locale = externalContext.getRequestLocale(); System.out.println(Language: + locale.getDisplayLanguage(); System.out.println(Country: + locale.getDisplayCountry(); 3.3.10 获取上下文路径 getRequestContextPath是HttpServletRequest.getContextPath方法的包装器,它返回请求URI中指明请求上下文的上下文路径部分。其方法签名如下: public ab

41、stract String getRequestContextPath() 下面的代码段把请求URI的上下文路径输出到控制台: FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); System.out.println(Context path: + externalContext.getRequestContextPath(); 对于URL http:/localhost:8080/J

42、SFCh03/faces/test.jsp来说,getRequestContextPath方法的返回值为/JSFCh03。 getRequestPathInfo 方法是HttpServletRequest.getPathInfo方法的包装器,它返回当客户端进行请求时与客户端发送的URL相关联的额外路径信 息。这部分信息跟在servlet路径信息的后面,但在查询字符串之前。getRequestPathInfo方法的签名如下: public abstract String getRequestPathInfo() 例如,下面代码输出请求URL的路径信息。 FacesContext facesCon

43、text = 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 方

44、法是ServletContext类的getResourcePaths方法的包装器,它返回一个Set对象,其中包含Web应用中最长子路径与传入的 路径参数相匹配的资源路径。表示子目录的路径以“/”结束。返回的路径是相对于Web应用根路径的相对路径,并以“/”开始。此方法的签名如下: public abstract java.util.Set getResourcePaths(String path) 比如,考虑如下代码: FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalC

45、ontext = 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.getRes

46、ourcePaths(/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/ /det

47、ails.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对象的资源。

48、其方法签名如下: 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方法很

49、有用。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 (注:可编辑下载,若有不当之处,请指正,谢谢!) 推荐精选

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!