使用commandButton或commandLink来回发和管理HTML控件值

时间:2009-10-07 15:37:28

标签: java jsf facelets

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

我有以下commandLink来执行Action

<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添加元素的Listbox,那么在执行commandLink或commandButton时如何访问它们?您是否必须将控件绑定到Bean或是否可以以另一种方式访问​​此FaceContext以检索列表框,输入文本或您希望拥有的任何其他值?

2 个答案:

答案 0 :(得分: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,最终为HTML中的SELECT元素。可以使用客户端上的JavaScript将OPTION子项添加到DOM中,但在提交表单时这没有任何好处。如果您阅读HTML spec,则会说:

  

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

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

您有几个选择:

答案 1 :(得分:1)

您可以使用可以使用

访问的标准请求参数映射从页面上的“非JSF”控件中检索值
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()

你所谓的任何行动,例如。 MyBean.save()