Java 使用commandButton或commandLink返回并管理HTML控件值

Java 使用commandButton或commandLink返回并管理HTML控件值,java,jsf,facelets,Java,Jsf,Facelets,在许多情况下,您希望将HTML控件或Facelet添加到您的网站,但当您调用某个操作时,仅访问这些控件或Facelet到底有多容易 我有下面的commandLink来执行一个操作 <h:commandLink action="#{MyBean.save}" value=""> <f:verbatim><input type="button" value="Save"/></f:verbatim> <f:param name="

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

我有下面的commandLink来执行一个操作

<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状态,这样我的应用程序就不会崩溃

现在,假设您有一个
,现在这些组件是使您的站点启动和运行的基础,特别是如果您正在创建一些动态


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

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

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

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

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

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

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

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

JSF控件树与任何其他小部件树(如Swing或SWT)非常相似:

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

  • 一个实例封装这些值(最初由JSP/Facelet填充);例如:
  • 呈现页面时,生命周期查找组件的实现;
    渲染器将标记写入输出
  • 发布表单时,同一渲染器会查看传入的参数映射以获取其识别的键控值,并最终(在转换和验证后)将新值推送到
    UIComponent
    (这反过来可能会将其推送到模型的值绑定)
以列表框为例,这是一个棘手的问题。JSF提供了一个HTML中的
SELECT
元素。可以在客户机上使用JavaScript向DOM添加
选项
子项,但在提交表单时这没有任何好处。如果你读了,上面写着:

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

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

您有几个选择:

  • 从中查找执行此操作的现有控件。如果找不到一个,考虑使用Ajax来执行更新-查看灵感。
  • 编写自己的控件(警告:阅读并注意)
  • 容忍每次要向列表中添加元素时都必须执行POST操作

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

JSF控件树与任何其他小部件树(如Swing或SWT)非常相似:

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

  • 一个实例封装这些值(最初由JSP/Facelet填充);例如:
  • 呈现页面时,生命周期查找组件的实现;
    渲染器将标记写入输出
  • 发布表单时,同一渲染器会查看传入的参数映射以获取其识别的键控值,并最终(在转换和验证后)将新值推送到
    UIComponent
    (这反过来可能会将其推送到模型的值绑定)
以列表框为例,这是一个棘手的问题。JSF提供了一个HTML中的
SELECT
元素。可以在客户机上使用JavaScript向DOM添加
选项
子项,但在提交表单时这没有任何好处。如果你读了,上面写着:

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

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