是什么FacesContext中和的ExternalContext之间的区别(What is the

2019-08-20 00:50发布

是什么区别FacesContextExternalContext ? 我什么时候可以使用一个或其他? 什么东西有一个什么有其他?

下面的示例是从书的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生成的应用程序启动时?

Answer 1:

仔细看看他们的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 ,其与作为参数值的按钮的值最终成为请求参数的名称。



文章来源: What is the difference between FacesContext and ExternalContext