0

在许多情况下,您希望将 HTML-Controls 或 Facelets 添加到您的网站,但是当您调用某个操作时,访问它们真的很容易吗?

我有以下命令链接来执行操作

<h:commandLink action="#{MyBean.save}" value="">
    <f:verbatim><input type="button" value="Save"/></f:verbatim>
    <f:param name="id" value="#{MyBean.id}"/>
</h:commandLink>

Param 用于保存 QueryString 状态,因此我的应用程序不会崩溃。

现在,假设您有一个<input type="text" /><h:inputText value="hello" />现在这些组件是让您的网站启动和运行的基础,特别是如果您正在创建一些动态。

但是,如果控件没有绑定到任何东西,或者如果您有一个可以使用 JavaScript 添加元素的列表框,那么当您执行 commandLink 或 commandButton 时如何访问这些?您是否必须将控件绑定到您的 Bean,或者是否可以通过另一种方式访问​​此 FaceContext 以检索列表框、输入文本或您想要的任何其他内容的值?

4

2 回答 2

2

很难将 JSF 呈现的页面视为一大堆 HTML 和 JavaScript(我认为这是问题的核心)。您不能将任意表单控件添加到客户端上的应用程序并期望 JSF 框架解释它们。JSF 使用预定义的组件,因此组件必须知道如何解释来自请求的额外数据。因为这一切都以由 servlet 解释的 HTML 形式结束,所以从客户端发送的数据仍将在参数映射中结束 - 但是,这些值不会通过 JSF 生命周期,因此不会从验证中受益/数据绑定/等

JSF 控件树看起来很像任何其他小部件树(如 Swing 或 SWT):

UIViewRoot
         |_HtmlForm
                  |_HtmlInputText
                  |_HtmlCommandButton

JSF 控件基本上是这样工作的:

  • UIComponent实例封装值(最初从 JSP/Facelet 填充);示例:HtmlInputTextarea
  • 当页面被渲染时,生命周期会查找组件的Renderer实现;将Renderer标记写入输出
  • 当表单发布时,相同的渲染器会查看传入的参数映射以获取它识别的键值,并最终(在转换和验证之后)将新值推送到UIComponent(这可能反过来将其推送到模型的值绑定)

以列表框的具体示例为例-这是一个棘手的例子。JSF 提供了一个HtmlSelectManyListbox,它最终成为SELECTHTML 中的一个元素。可以OPTION在客户端使用 JavaScript 将子节点添加到 DOM,但这在提交表单时没有任何好处。如果您阅读HTML 规范,它会说:

只有选定的选项才会成功。如果未选择任何选项,则控件不成功,并且在提交表单时,名称和任何值都不会提交给服务器。

因此,当提交表单时,只有用户选择的列表元素会被传输到服务器。您需要一些隐藏字段才能将所有新数据发送到服务器。核心集中没有可以帮助您解决此问题的控件。

你有几个选择:

于 2009-10-08T10:54:30.933 回答
1

您可以使用可以访问的标准请求参数映射从页面上的“非 JSF”控件中检索值

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()

在您调用的任何操作中,例如。MyBean.save()

于 2009-10-07T17:56:13.820 回答