FacesContext 和ExternalContext 有什么区别

问题描述 投票:0回答:1

FacesContext
ExternalContext
有什么区别?我什么时候可以使用其中一种或另一种?其中之一是什么,另一个又是什么?

以下示例来自《JavaServer Faces 第三版》一书:

 <h:commandButton ... actionListener="#{rushmore.handleMouseClick}" />

支撑豆:

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

jsf facescontext externalcontext
1个回答
46
投票

仔细查看他们的 javadoc,看看他们提供了哪些方法以及这些方法到底做了什么。

如果您仔细查看 javadoc 中列出的那些方法,您会注意到

FacesContext
通常提供对特定于 JSF 的工件的访问,这些工件与 JSF 所针对的“底层”Servlet 或 Portlet API 没有任何关系。被设计为在之上运行。例如。创建转换器、验证器、组件、EL 表达式等,并获取有关视图根、支持的语言环境等的信息,以及添加阶段侦听器、系统事件侦听器等。特定于 JSF API 的所有内容。

并且,

ExternalContext
通常提供对 Servlet 或 Portlet 特定工件的访问,JSF 目前正在“幕后”使用这些工件。例如,当在 Servlet 容器上运行时,HTTP Servlet 请求HTTP Servlet 响应HTTP 会话Servlet 上下文 以及本质上还有它们的所有工件。单击这些链接,您将看到它们依次提供也由
ExternalContext
委托的方法,例如
getRequestParameterMap()
。另请参阅javadoc。是的,也单击该链接,您会看到它明确提到了 servlet 请求:

Jakarta Servlet:这必须是通过

jakarta.servlet.ServletRequest
方法
getParameter()
getParameterNames()
可用的参数集。

both 上下文无法提供任何东西。因此,绝对没有理由选择其中之一。只需使用适合您需要执行的工作的产品即可。

至于客户端ID,它确实是由JSF生成的,但绝对不是在服务器启动时生成的。它只是在每个视图的基础上为每个 JSF 组件生成的。对于像

<h:inputText>

 这样的输入组件,它会生成 HTML 
<input>
 元素,它也会变成 
name
 属性,就像这样

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

formId:inputId

 正是 JSF 客户端 ID。它成为请求参数名称。命令按钮的 HTML 表示形式还有一个 
name
,它最终作为请求参数名称,按钮的值作为参数值。这样 JSF 就知道提交了哪些输入值以及按下了哪个命令按钮/链接。

© www.soinside.com 2019 - 2024. All rights reserved.