一些背景:我正在构建一个自定义JSF组件。该组件基本上是一个文本编辑器,它应具有一个“保存”按钮,用于保存编辑器的内容字符串。当我使用CodeMirror库时,我需要使用javascript从编辑器中获取内容(字符串),并将其发送到服务器。因此,在这种情况下,我不能使用基于XML的JS调用,例如f:ajax。
f:ajax
问题:我打算使用发送字符串jsf.ajax.request,但是它不直接支持在bean上的调用方法。如何以AJAX方式在具有JSF的bean中调用方法?
jsf.ajax.request
至少有两种方法可以解决此问题:
XMLHttpRequest
两种方法都很笨拙,后者也超出了JSF的范围。
我想念什么吗?你如何做这些?
我找不到如何用javascript直接调用bean的方法,但是这里有一个关于从javascript调用f:ajax-declaration的技巧:
1)创建一个隐藏表单,其中包含要发送到服务器的所有数据的字段。也包括ah:commandButton:
<h:form id="hiddenForm" style="display: none;"> <h:inputHidden id="someData" value="#{someBean.someData}" /> <h:commandButton id="invisibleClickTarget"> <f:ajax execute="@form" listener="#{someBean.myCoolActionOnServer()}" /> </h:commandButton> </h:form>
通常,在这种情况下,listener属性#{someBean.myCoolActionOnServer()}是指您要在服务器上执行的方法。
listener
#{someBean.myCoolActionOnServer()}
2)在其他按钮中,用于onclick调用您的特殊javascript,然后通过javascript单击触发按钮:
onclick
<h:commandButton value="Click me" onclick="populateTheForm('hiddenForm'); document.getElementById('hiddenForm:invisibleClickTarget').click(); return false;" />
populateTheForm() 应该实际上将数据填充到hiddenForm的字段中。
populateTheForm()
这是我的情况的简化,但应该可以。不过,仍在寻找更方便的方法。