FacesContext和ExternalContext有什么区别

时间:2013-04-06 11:11:17

标签: jsf-2 facescontext externalcontext

FacesContextExternalContext之间有什么区别?我什么时候可以使用其中一个?那个是什么,另一个是什么?

以下示例来自JavaServer Faces第3版:

 <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生成?

1 个答案:

答案 0 :(得分:42)

仔细查看他们的javadoc,了解他们提供的方法以及这些方法究竟是做什么的。

如果仔细观察javadoc中列出的那些方法,您会注意到FacesContext通常提供对特定于JSF的工件的访问,这些工件与“底层”Servlet或Portlet API无关。 JSF被设计为在其上运行。例如。创建转换器,验证器,组件,EL表达式等,并获取有关视图根,支持的语言环境等的信息,并添加阶段侦听器,系统事件侦听器等。所有特定于JSF API的东西。

并且,ExternalContext通常提供对JSF当前正在使用的Servlet或Portlet特定工件的访问。例如,在Servlet容器上运行时,HTTP servlet requestHTTP servlet responseHTTP sessionServlet context以及它们的所有工件本身也是如此。点击这些链接,您会看到他们又提供了ExternalContext委派的方法,例如getRequestParameterMap()。另见the javadoc。是的,也点击该链接,您将看到它明确提到了servlet请求:

  

Servlet:这必须是通过javax.servlet.ServletRequest方法getParameter()getParameterNames()提供的参数集。

两个上下文可以提供 nothing 。所以绝对没有理由更喜欢这一个或另一个。只需使用正确的工作即可完成工作。

至于客户端ID,它确实是由JSF生成的,但绝对不是在服务器的启动上。它是基于每个视图为每个JSF组件生成的。对于生成HTML <h:inputText>元素的<input>等输入组件,它也会成为name属性,如此

<input type="text" id="formId:inputId" name="formId:inputId" ... />

formId:inputId正是JSF客户端ID。它成为请求参数名称。命令按钮的HTML表示也有一个name,最终作为请求参数名称,按钮的值作为参数值。