是什么区别FacesContext
和ExternalContext
? 我什么时候可以使用一个或其他? 什么东西有一个什么有其他?
下面的示例是从书的JavaServer Faces第三版:
<h:commandButton ... actionListener="#{rushmore.handleMouseClick}" />
支持bean:
public void handleMouseClick(ActionEvent e) {
FacesContext context = FacesContext.getCurrentInstance();
String clientId = e.getComponent().getClientId(context);
Map<String, String> requestParams = context.getExternalContext().getRequestParameterMap();
// ...
}
为什么在请求参数ExternalContext
? 什么是clientId
? 它是由JSF生成的应用程序启动时?
仔细看看他们的javadoc,看看他们提供什么样的方法和究竟这些方法都做。
-
FacesContext
的javadoc -
ExternalContext
的javadoc
如果你看一下在javadoc中列出的方法更接近,你会发现, FacesContext
一般提供访问JSF特有的器物进一步绝不相关的“基础性” Servlet或Portlet API,用于其JSF是被设计成之上运行。 例如创建转换器,验证,组件,EL表达式,等等和获取有关视图根,支持的语言环境,等等和添加阶段监听器,系统事件侦听器,等等的信息。 这一切是特定于JSF API。
而且, ExternalContext
一般提供访问哪些JSF目前正在使用“在幕后”的Servlet或特定于portlet的假象。 例如,在Servlet容器中,运行时HTTP servlet请求 , HTTP servlet响应 , HTTP会话和servlet上下文和固有也他们所有的工件。 点击这些链接,你会看到,他们又将报价方法,其也被委派通过ExternalContext
,如getRequestParameterMap()
另见的Javadoc 。 是的,也点击该链接,你会看到,它明确提到的servlet请求:
Servlet的:这必须是该组经由可用的参数javax.servlet.ServletRequest
方法getParameter()
和getParameterNames()
没有什么可以由两种情况下提供。 所以就绝对没有理由喜欢一个或另一个。 只需使用适合你的需要进行的工作。
至于客户端ID,它确实是JSF生成的,但绝对不是在服务器的启动。 它只是在每个视图基础上每一个JSF组件生成。 在像输入部件的情况下<h:inputText>
,其产生一个HTML <input>
元素,它也成为name
属性,像这样
<input type="text" id="formId:inputId" name="formId:inputId" ... />
该formId:inputId
正是JSF客户端ID。 它变成了请求参数的名称。 命令按钮的HTML表示还具有一个name
,其与作为参数值的按钮的值最终成为请求参数的名称。