- 浏览: 179540 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
cmm:
[img][/img][/url][url][/url][ur ...
JSF2.0简介:页面模版化(系列之四) -
parabellum_sky:
飞到大连,
ERROR 1045: Access denied for user: 'root@localhost' (Using password: YES) -
yuanliyin:
更换皮肤很不错!
动态改变RichFaces的皮肤 -
paomo30000:
请问为什么我在输入了http://localhost:8080 ...
在Eclipse 3.5中使用JSF 2.0开发Web应用环境配置及一个简单例子(系列之二) -
marshan:
<dependency> <groupI ...
动态改变RichFaces的皮肤
在Faces API中有两个类是要经常使用的. 一个是FacesContext 一个是ExternalContext.首先讲解如何使用FacesContext .
对每个JSF请求,FacesServlet对象都会为其获取一个javax.faces. context.
FacesContext类的实例。FacesServlet对象将下列3个取自Web容器的对象传给javax.faces.context.FacesContextFactory对象的getFacesContext方法,以此来做到这一点:
● javax.servlet.ServletContext
● javax.servlet.ServletRequest
● javax.servlet.ServletResponse
这意味着FacesContext的实例里包含了所有处理JSF请求所需的每个请求的状态信息。图3-1展示了FacesContext实例里封装的其他一些对象。
3.2.1 获取当前实例
一个经常用到的方法是静态的getCurrentInstance方法,它返回当前的FacesContext实例。此方法的签名如下:
public static FacesContext getCurrentInstance()
下面的代码是一个用此方法获取FacesContext当前实例的例子:
FacesContext facesContext = FacesContext.getCurrentInstance();
3.2.2 获取和修改组件树
FacesContext实例里最重要的内容是请求页面的组件树。组件树是由javax.faces.tree.Tree类来表示的(本章后面的“使用Tree类”一节会讨论)。FacesContext实例的tree属性就是Tree对象。
要获取或修改Tree对象,可使用tree属性的读取方法和赋值方法:
public abstract Tree getTree()
public abstract void setTree(Tree tree)
3.2.3 添加和获取消息
在 请求处理生命周期里,可能会遇到错误。比如,当验证器执行输入验证时,因为用户输入了不正确的值,验证可能失败;当组件试图把输入值转换为绑定到组件的模 型对象所需的类型时,也可能会失败。所有消息都必须存放到FacesContext实例里以备后面进行处理。比如,您可能希望在页面里显示错误消息,从而 为用户更正错误提供帮助。
错误消息是由javax.faces.application.Message接口(第11章再详细讨论)来表示的,您可以通过使用FacesContext类的addMessage方法向FacesContext实例里添加Message对象。这个方法的签名如下:
public abstract void addMessage(UIComponent component, Message message)
如果component不为空,新加入的message就关联到component上。否则,它就不与任何特定组件的实例相关。
举例来说,验证器在验证组件值失败时可调用FacesContext的addMessage方法,传入值无效的组件及一个包含特定错误消息的Message对象。
所有添加到FacesContext实例的Message对象都被加入到一个集合里。可通过调用getMessages方法的两个重载方法之一来获取加入的Message对象:
public abstract Iterator getMessages()
public abstract Iterator getMessages(UIComponent component)
第一种形式的调用在一个Iterator里返回所有Message对象,而第二种形式的调用则仅返回与给定UIComponent相关联的Message对象。
3.2.4 添加和获取请求处理事件
UIComponent 可以生成FacesEvent对象。比如,当单击一个UICommand组件时,它会生成一个ActionEvent对象(ActionEvent类是 FacesEvent类的子类)。这个FacesEvent对象需要在FacesContext实例里保存起来,以备请求处理生命周期里的下一步处理事件 时所用。
可通过使用FacesContext类的addFacesEvent方法向FacesContext实例添加FacesEvent对象。此方法的签名如下:
public abstract void addFacesEvent(FacesEvent event)
要提取先前添加的FacesEvent对象,可调用getFacesEvents方法,其签名如下:
public abstract Iterator getFacesEvents()
此方法返回FacesEvent时的顺序与其在队列中的顺序一致。
3.2.5 向Response对象里写入信息
为 了向Response对象里写入信息,FacesContext类提供了两个属性,一个是 javax.faces.Context.ResponseStream类型,另一个是 javax.faces.context.ResponseWriter类型。ResponseStream类型的对象用于输出二进制数据,而 ResponseWriter类型的对象则用于输出字符。这些属性的读取方法和赋值方法如下:
public abstract ResponseStream getResponseStream()
public abstract void setResponseStream(ResponseStream responseStream)
public abstract ResponseWriter getResponseWriter()
public abstract void setResponseWriter(ResponseWriter responseWriter)
3.2.6 获取和设置地区
第11章将会讨论到,JSF支持国际化和本地化。这意味着您可以根据用户的地区决定发送什么样的回应信息。locale属性里存放了当前处理中所用的Locale对象。
初始状况下,locale属性的值和网络浏览器里指定的地区是一样的,但可以修改这个值,从而发送输出所使用的地区将独立于浏览器所使用的地区。此属性的读取方法和赋值方法如下:
public abstract Locale getLocale()
public abstract void setLocale(Locale locale)
3.2.7 操作请求处理生命周期
FacesContext类还提供了两个方法与请求处理生命周期进行交互:
● 在当前阶段的处理完成后,调用renderResponse方法通知JSF实现把控制权转到呈现响应阶段。也就是说,处于当前阶段和呈现响应阶段之间的所有其他阶段都不再执行。
● 调用responseComplete方法,告诉JSF实现此次请求的HTTP响应已经完成(比如在使用了HTTP重定向的情况下)。因此,当前阶段完成后,必须中止请求处理生命周期的处理。
这些方法的签名如下:
public abstract void renderResponse()
public abstract void responseComplete()
3.2.8 获取其他请求状态信息
其他每个请求的状态信息封装在ExternalContext对象里,可以使用getExternalContext方法获取该对象:
public abstract ExternalContext getExternalContext()
现在讲解ExternalContext。
使 用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
对每个JSF请求,FacesServlet对象都会为其获取一个javax.faces. context.
FacesContext类的实例。FacesServlet对象将下列3个取自Web容器的对象传给javax.faces.context.FacesContextFactory对象的getFacesContext方法,以此来做到这一点:
● javax.servlet.ServletContext
● javax.servlet.ServletRequest
● javax.servlet.ServletResponse
这意味着FacesContext的实例里包含了所有处理JSF请求所需的每个请求的状态信息。图3-1展示了FacesContext实例里封装的其他一些对象。
3.2.1 获取当前实例
一个经常用到的方法是静态的getCurrentInstance方法,它返回当前的FacesContext实例。此方法的签名如下:
public static FacesContext getCurrentInstance()
下面的代码是一个用此方法获取FacesContext当前实例的例子:
FacesContext facesContext = FacesContext.getCurrentInstance();
3.2.2 获取和修改组件树
FacesContext实例里最重要的内容是请求页面的组件树。组件树是由javax.faces.tree.Tree类来表示的(本章后面的“使用Tree类”一节会讨论)。FacesContext实例的tree属性就是Tree对象。
要获取或修改Tree对象,可使用tree属性的读取方法和赋值方法:
public abstract Tree getTree()
public abstract void setTree(Tree tree)
3.2.3 添加和获取消息
在 请求处理生命周期里,可能会遇到错误。比如,当验证器执行输入验证时,因为用户输入了不正确的值,验证可能失败;当组件试图把输入值转换为绑定到组件的模 型对象所需的类型时,也可能会失败。所有消息都必须存放到FacesContext实例里以备后面进行处理。比如,您可能希望在页面里显示错误消息,从而 为用户更正错误提供帮助。
错误消息是由javax.faces.application.Message接口(第11章再详细讨论)来表示的,您可以通过使用FacesContext类的addMessage方法向FacesContext实例里添加Message对象。这个方法的签名如下:
public abstract void addMessage(UIComponent component, Message message)
如果component不为空,新加入的message就关联到component上。否则,它就不与任何特定组件的实例相关。
举例来说,验证器在验证组件值失败时可调用FacesContext的addMessage方法,传入值无效的组件及一个包含特定错误消息的Message对象。
所有添加到FacesContext实例的Message对象都被加入到一个集合里。可通过调用getMessages方法的两个重载方法之一来获取加入的Message对象:
public abstract Iterator getMessages()
public abstract Iterator getMessages(UIComponent component)
第一种形式的调用在一个Iterator里返回所有Message对象,而第二种形式的调用则仅返回与给定UIComponent相关联的Message对象。
3.2.4 添加和获取请求处理事件
UIComponent 可以生成FacesEvent对象。比如,当单击一个UICommand组件时,它会生成一个ActionEvent对象(ActionEvent类是 FacesEvent类的子类)。这个FacesEvent对象需要在FacesContext实例里保存起来,以备请求处理生命周期里的下一步处理事件 时所用。
可通过使用FacesContext类的addFacesEvent方法向FacesContext实例添加FacesEvent对象。此方法的签名如下:
public abstract void addFacesEvent(FacesEvent event)
要提取先前添加的FacesEvent对象,可调用getFacesEvents方法,其签名如下:
public abstract Iterator getFacesEvents()
此方法返回FacesEvent时的顺序与其在队列中的顺序一致。
3.2.5 向Response对象里写入信息
为 了向Response对象里写入信息,FacesContext类提供了两个属性,一个是 javax.faces.Context.ResponseStream类型,另一个是 javax.faces.context.ResponseWriter类型。ResponseStream类型的对象用于输出二进制数据,而 ResponseWriter类型的对象则用于输出字符。这些属性的读取方法和赋值方法如下:
public abstract ResponseStream getResponseStream()
public abstract void setResponseStream(ResponseStream responseStream)
public abstract ResponseWriter getResponseWriter()
public abstract void setResponseWriter(ResponseWriter responseWriter)
3.2.6 获取和设置地区
第11章将会讨论到,JSF支持国际化和本地化。这意味着您可以根据用户的地区决定发送什么样的回应信息。locale属性里存放了当前处理中所用的Locale对象。
初始状况下,locale属性的值和网络浏览器里指定的地区是一样的,但可以修改这个值,从而发送输出所使用的地区将独立于浏览器所使用的地区。此属性的读取方法和赋值方法如下:
public abstract Locale getLocale()
public abstract void setLocale(Locale locale)
3.2.7 操作请求处理生命周期
FacesContext类还提供了两个方法与请求处理生命周期进行交互:
● 在当前阶段的处理完成后,调用renderResponse方法通知JSF实现把控制权转到呈现响应阶段。也就是说,处于当前阶段和呈现响应阶段之间的所有其他阶段都不再执行。
● 调用responseComplete方法,告诉JSF实现此次请求的HTTP响应已经完成(比如在使用了HTTP重定向的情况下)。因此,当前阶段完成后,必须中止请求处理生命周期的处理。
这些方法的签名如下:
public abstract void renderResponse()
public abstract void responseComplete()
3.2.8 获取其他请求状态信息
其他每个请求的状态信息封装在ExternalContext对象里,可以使用getExternalContext方法获取该对象:
public abstract ExternalContext getExternalContext()
现在讲解ExternalContext。
使 用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
发表评论
-
JSF2.0中的实例测试(一)
2009-10-24 13:27 1709<img src="#{resource['i ... -
Java Server Faces 2.0重要新功能以及相关改进简介
2009-10-24 03:19 1161JSF 2.0的最终规范也已经发布了有近一个月了,在近期试 ... -
methodbinding methodexpression valueexpression
2009-10-17 16:20 10971. create MethodBinding Metho ... -
valueexpression的用法
2009-09-16 19:52 1645在1.2之前,可以向下面一样使用ValueBinding:Va ... -
托管 Bean 页面传值的使用方法和技巧
2009-09-04 11:00 1002最近开始学习JSF基础,发现比较重要的一点,就是如何用编程方式 ... -
JSF 动态创建组件
2009-09-03 21:26 1940JSF 的组件和组件树的概念非常好,可以完全通过JAVA代码实 ... -
JSF 2.0简介:Ajax对页面的增加与删除操作例子(系列之六)
2009-08-06 03:00 2763上一篇我们初步接触了一下JSF2.0的Ajax模型,为了适应A ... -
JSF 2.0简介:初识Ajax,一个简单的例子(系列之五)
2009-08-06 03:00 4635从本期介绍开始,我们来看看JSF 2.0对Ajax的支持,一 ... -
JSF2.0简介:页面模版化(系列之四)
2009-08-06 02:59 3313JSF已经出了很多年了,自从提出就带来了一些新的思想,但 ... -
JSF2.0中自定义组件模型例子(系列之三)
2009-08-06 02:58 3138在本篇介绍中,我们开始接触JSF2.0纳为标准的最重要的特性之 ... -
在Eclipse 3.5中使用JSF 2.0开发Web应用环境配置及一个简单例子(系列之二)
2009-08-06 02:56 6841这里假设你对eclipse的开发环境已经比较熟悉 ... -
Javaserver Faces 2.0重要新功能以及相关改进简介(系列之一)
2009-08-06 02:55 1766JSF 2.0的最终规范也已经发布了有近一个月了,在近期试用 ... -
Java Server Faces Events And Listeners (JSF中的事件与监听器)
2009-07-26 22:44 1508JSF的一个核心就是事件与监听。JSF事件分为以下几种: 1、 ... -
Response的sendRedirect实现JSF内的URL重定向
2009-07-18 15:41 1949●导入Servlet包 import javax.servle ...
相关推荐
在实际开发中,为了确保项目顺利运行,开发者需要将`jsf-api-2.0.3.jar` 和其他必要的JSF库添加到项目的`WEB-INF/lib`目录下,或者使用构建工具(如Maven或Gradle)进行依赖管理。同时,还需要配置Tomcat服务器,使...
5. **FacesContext**: 是JSF框架的核心上下文对象,它存储了请求处理过程中的所有信息,包括用户请求、响应、组件树等。 6. **Lifecycle**: JSF有自己的一套生命周期,包括初始化、恢复视图、应用请求值、处理事件...
在 Faces API 中,FacesContext 和 ExternalContext 是两个经常使用的类,本文将详细介绍 FacesContext 的编程接口和使用方法。 FacesContext 的实例是在 FacesServlet 对象中创建的,每个 JSF 请求都会获取一个 ...
在JSF框架中,Faces API是核心接口和类的集合,它提供了与用户交互、处理请求和响应、管理组件状态以及处理事件的能力。通过Faces API,开发者可以轻松地实现页面导航、数据绑定、验证以及转换等功能。 1. **组件...
JSF API还包含了用于渲染组件的`javax.faces.render.RenderKit`和处理用户输入的`javax.faces.validator`包。 **JSF IMPL** JSF IMPL是JSF API的具体实现,它提供了API接口背后的功能。这个实现包括了JSF的生命周期...
在使用`jsf-api.jar`时,开发者需要将其加入到项目的类路径中,以便能够编译和运行包含JSF代码的应用程序。同时,结合Facelets或JSP作为视图层技术,可以创建用户友好的Web界面。此外,还可以与其他JavaEE技术如EJB...
**FacesContext** 是JSF中的核心上下文对象,它在请求处理期间提供对框架服务的访问,如获取请求参数、导航控制和错误处理。开发者通过FacesContext可以获取到关于当前请求和响应的信息,以及与之相关的组件树。 **...
这些组件通过JSF API中的`javax.faces.component.UIComponent`类进行抽象,支持自定义扩展和属性绑定。组件可以嵌套,形成复杂的用户界面结构。 2. **生命周期** JSF应用遵循一套预定义的生命周期,包括六步:恢复...
- `javax.faces.context.FacesContext`: 保存请求处理期间的所有上下文信息,是JSF生命周期中的关键对象。 - `javax.faces.convert.Converter`: 负责将用户输入的数据转换为模型对象的类型。 - `javax.faces.event....
开发者在编写JSF应用程序时,主要会引用这个API,它定义了诸如FacesContext、UIComponent、ValueExpression等核心组件和接口。通过这些API,开发者可以创建自定义组件,处理事件,以及与模型和视图进行交互。 2. **...
在JavaServer Faces (JSF)框架中,`ExternalContext`是一个关键接口,它提供了一种在JSF组件层和底层Servlet API之间通信的桥梁。这个接口允许开发者访问Servlet相关的对象,如`ServletContext`、`ServletRequest`和...
**JSF(JavaServer Faces)API详解** JSF(JavaServer Faces)是Java平台上的一个用于构建用户界面的MVC(Model-View-Controller)框架。这个框架的主要目的是简化Web应用开发,提供一种声明式的方式来处理用户交互...
JSF API是该框架的核心部分,提供了丰富的接口和类,帮助开发者创建、管理以及处理用户界面组件。这篇文档将深入探讨JSF API,帮助你更好地理解和应用这个强大的工具。 **1. JSF概述** JSF的设计目标是简化Web开发...
在这个"jsf-完整的标签和API"的压缩包中,我们可以深入学习和理解JSF的各种标签及其API,同时还能通过小项目源代码进行实践操作。 **JSF标签** 是JSF中的重要组成部分,它们类似于HTML标签,但提供了更丰富的功能和...
当开发者在项目中使用JSF并尝试导入`javax.faces.*`类时,如果编译器报红提示找不到相应的类,这通常意味着缺少了`jsf-api.jar`和`jsf-impl.jar`这两个必要的jar包。为了解决这个问题,你需要将这两个jar文件添加到...
1. **FacesContext**:这是JSF应用程序的核心对象,它在请求处理期间提供上下文信息,如请求、响应、用户会话和应用程序范围的数据。 2. **UIComponent**:这是所有JSF组件的基类,代表了用户界面的一部分,可以是...
这个API包“jsf1.2_04api”包含了JSF 1.2版本的类库和接口,供开发者在项目中引用和使用。 JSF的核心组件包括: 1. **Facelets**:JSF 1.2引入了Facelets作为默认的视图定义语言,替代了原来的JSP。Facelets是一种...
5. **FacesContext**:它是JSF框架中的核心上下文对象,为所有组件和应用逻辑提供上下文信息,如请求、响应、用户会话等。 6. **Managed Beans**:JSF鼓励使用Managed Beans作为业务逻辑层,它们是JavaBeans的轻量...
《JSF2 API和JBoss Seam入门》是一本面向初学者和中级开发者的图书,旨在帮助读者快速掌握JavaServer Faces(JSF)2.0 API和JBoss Seam框架的使用。JSF是一种Java EE标准的用户界面组件模型,用于构建Web应用程序。...