gpt4 book ai didi

java - 使用 commandButton 或 commandLink 进行回发并管理 HTML 控件值

转载 作者:行者123 更新时间:2023-12-02 00:54:19 25 4
gpt4 key购买 nike

在许多情况下,您希望将 HTML 控件或 Facelet 添加到您的网站,但是当您调用某个操作时访问这些控件真的有多容易?

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

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

参数用于保存查询字符串状态,这样我的应用程序就不会崩溃。

现在,假设您有一个 <input type="text" /><h:inputText value="hello" />现在,这些组件对于您的网站启动和运行至关重要,尤其是在您创建一些动态时。

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

最佳答案

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

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

UIViewRoot
|_HtmlForm
|_HtmlInputText
|_HtmlCommandButton

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

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

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

Only selected options will be successful. When no options are selected, the control is not successful and neither the name nor any values are submitted to the server when the form is submitted.

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

您有几个选择:

关于java - 使用 commandButton 或 commandLink 进行回发并管理 HTML 控件值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1532423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com