一尘不染

JSF 2.0 AJAX:使用jsf.ajax.request(或其他方式)从javascript调用bean方法

ajax

一些背景:我正在构建一个自定义JSF组件。该组件基本上是一个文本编辑器,它应具有一个“保存”按钮,用于保存编辑器的内容字符串。当我使用CodeMirror库时,我需要使用javascript从编辑器中获取内容(字符串),并将其发送到服务器。因此,在这种情况下,我不能使用基于XML的JS调用,例如f:ajax

问题:我打算使用发送字符串jsf.ajax.request,但是它不直接支持在bean上的调用方法。如何以AJAX方式在具有JSF的bean中调用方法?

至少有两种方法可以解决此问题:

  • 在具有隐藏输入字段的页面中包含隐藏表单。从javascript更新该输入字段,然后调用jsf.ajax.request发布该表单。如果需要,可以在属性的getter或setter中调用自定义操作。
  • 用raw处理请求XMLHttpRequest(或在其他JS库的帮助下)。创建一个servlet并调用它。

两种方法都很笨拙,后者也超出了JSF的范围。

我想念什么吗?你如何做这些?


阅读 274

收藏
2020-07-26

共1个答案

一尘不染

我找不到如何用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()}是指您要在服务器上执行的方法。

2)在其他按钮中,用于onclick调用您的特殊javascript,然后通过javascript单击触发按钮:

<h:commandButton value="Click me" onclick="populateTheForm('hiddenForm'); document.getElementById('hiddenForm:invisibleClickTarget').click(); return false;" />

populateTheForm() 应该实际上将数据填充到hiddenForm的字段中。

这是我的情况的简化,但应该可以。不过,仍在寻找更方便的方法。

2020-07-26