Java 使用commandButton或commandLink返回并管理HTML控件值
在许多情况下,您希望将HTML控件或Facelet添加到您的网站,但当您调用某个操作时,仅访问这些控件或Facelet到底有多容易 我有下面的commandLink来执行一个操作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="
<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
SELECT
元素。可以在客户机上使用JavaScript向DOM添加选项
子项,但在提交表单时这没有任何好处。如果你读了,上面写着:
只有选定的选项才会成功。如果未选择任何选项,则控件将不成功,并且在提交表单时,名称或任何值都不会提交到服务器
因此,在提交表单时,只有用户选择的列表元素才会传输到服务器。您需要一些隐藏字段才能将所有新数据发送到服务器。核心集中没有一个控件可以帮助您完成此任务
您有几个选择:
- 从中查找执行此操作的现有控件。如果找不到一个,考虑使用Ajax来执行更新-查看灵感。
- 编写自己的控件(警告:阅读并注意)
- 容忍每次要向列表中添加元素时都必须执行POST操作
- 一个实例封装这些值(最初由JSP/Facelet填充);例如:
- 呈现页面时,生命周期查找组件的实现;
渲染器将标记写入输出
- 发布表单时,同一渲染器会查看传入的参数映射以获取其识别的键控值,并最终(在转换和验证后)将新值推送到
(这反过来可能会将其推送到模型的值绑定)UIComponent
SELECT
元素。可以在客户机上使用JavaScript向DOM添加选项
子项,但在提交表单时这没有任何好处。如果你读了,上面写着:
只有选定的选项才会成功。如果未选择任何选项,则控件将不成功,并且在提交表单时,名称或任何值都不会提交到服务器
因此,在提交表单时,只有用户选择的列表元素才会传输到服务器。您需要一些隐藏字段才能将所有新数据发送到服务器。核心集中没有一个控件可以帮助您完成此任务