30

FacesContext和 和有什么不一样ExternalContext?我什么时候可以使用其中一种?一个有什么,另一个有什么?

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

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

4

1 回答 1

44

仔细查看他们的 javadocs 以了解他们提供的方法以及这些方法的具体作用。

如果您仔细查看 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" ... />

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

于 2013-04-06T22:23:15.523 回答