FacesContext和ExternalContext有什么区别

vma*_*ric 29 facescontext jsf-2 externalcontext

FacesContext和之间有什么区别ExternalContext?我什么时候可以使用其中一个?什么有一个什么有另一个?

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

 <h:commandButton ... actionListener="#{rushmore.handleMouseClick}" />
Run Code Online (Sandbox Code Playgroud)

支持豆:

public void handleMouseClick(ActionEvent e) {
    FacesContext context = FacesContext.getCurrentInstance();
    String clientId = e.getComponent().getClientId(context);
    Map<String, String> requestParams = context.getExternalContext().getRequestParameterMap();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

为什么请求参数在ExternalContext?什么是clientId?它是在应用程序启动时由JSF生成的吗?

Bal*_*usC 43

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

如果仔细观察javadoc中列出的那些方法,您会发现FacesContext通常提供对特定于JSF的工件的访问,这些工件与JSF设计为运行的"底层"Servlet或Portlet API无关.在之上.例如,创建转换器,验证器,组件,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" ... />
Run Code Online (Sandbox Code Playgroud)

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