在许多情况下,您希望将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以检索列表框,输入文本或您希望拥有的任何其他值?
答案 0 :(得分:2)
将JSF呈现的页面视为一大堆HTML和JavaScript(我认为这是问题的核心)可能很困难。您不能将任意表单控件添加到客户端上的应用程序,并期望JSF框架解释它们。 JSF使用预定义的组件,因此组件必须知道如何解释来自请求的额外数据。因为它最终都是由servlet解释的HTML表单,所以从客户端发送的数据仍然会在参数映射中结束 - 但是,这些值不会通过JSF生命周期,因此不会受益于验证/数据绑定/等。
JSF控件树看起来很像任何其他窗口小部件树(如Swing或SWT):
UIViewRoot
|_HtmlForm
|_HtmlInputText
|_HtmlCommandButton
JSF控件基本上是这样的:
Renderer
将标记写入输出UIComponent
(这可能反过来推动它)到模型的值绑定)举一个列表框的具体例子 - 这是一个棘手的问题。 JSF提供HtmlSelectManyListbox,最终为HTML中的SELECT
元素。可以使用客户端上的JavaScript将OPTION
子项添加到DOM中,但在提交表单时这没有任何好处。如果您阅读HTML spec,则会说:
只有选定的选项才会成功。如果未选择任何选项,则控件不会成功,并且在提交表单时,不会将名称或任何值提交给服务器。
因此,在提交表单时,只有用户选择的列表元素才会传输到服务器。您需要一些隐藏字段才能将所有新数据提供给服务器。核心集中没有可以帮助您解决此问题的控件。
您有几个选择:
答案 1 :(得分:1)
您可以使用可以使用
访问的标准请求参数映射从页面上的“非JSF”控件中检索值FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
你所谓的任何行动,例如。 MyBean.save()