FacesContext
和ExternalContext
之间有什么区别?我什么时候可以使用其中一个?那个是什么,另一个是什么?
以下示例来自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生成?
答案 0 :(得分:42)
仔细查看他们的javadoc,了解他们提供的方法以及这些方法究竟是做什么的。
如果仔细观察javadoc中列出的那些方法,您会注意到FacesContext
通常提供对特定于JSF的工件的访问,这些工件与“底层”Servlet或Portlet API无关。 JSF被设计为在其上运行。例如。创建转换器,验证器,组件,EL表达式等,并获取有关视图根,支持的语言环境等的信息,并添加阶段侦听器,系统事件侦听器等。所有特定于JSF API的东西。
并且,ExternalContext
通常提供对JSF当前正在使用的Servlet或Portlet特定工件的访问。例如,在Servlet容器上运行时,HTTP servlet request,HTTP servlet response,HTTP session和Servlet 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
,最终作为请求参数名称,按钮的值作为参数值。