代码之家  ›  专栏  ›  技术社区  ›  Tuukka Mustonen

jsf2.0ajax:使用jsf.ajax.request请求(或其他方式)

  •  13
  • Tuukka Mustonen  · 技术社区  · 16 年前

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

    问题是:我本来打算把绳子 jsf.ajax.request ,但它不直接支持对bean调用方法。如何以AJAX的方式调用带有JSF的bean中的方法?

    • 将隐藏窗体包含到带有隐藏输入字段的页面。从javascript更新输入字段,然后调用jsf.ajax.request请求把那张表格寄出去。如果需要,可以在属性的getter或setter中调用自定义操作。
    • 用生肉做请求 XMLHttpRequest (或者在其他JS库的帮助下)。创建一个servlet并调用它。

    我错过什么了吗?你怎么做这些?

    有一个 quite similar question ,但给出的答案只涉及基于XML的AJAX调用。还有 another similar question ,但这也涉及到基于XML的AJAX调用。

    2 回复  |  直到 9 年前
        1
  •  15
  •   Tuukka Mustonen    11 年前

    我不知道如何用javascript直接调用bean,但下面是一个从javascript调用f:ajax声明的技巧:

    1) 创建一个隐藏窗体,其中包含要发送到服务器的所有数据的字段。还包括一个h:command按钮:

    <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()} 在本例中,引用要在服务器上执行的方法。

    onclick 要调用特殊的javascript并通过javascript单击触发器按钮:

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

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

    这是一个简化我的情况,但应该工作。不过,仍在寻找更便捷的方法。

        2
  •  1
  •   Oleg    14 年前

    这个任务我做了好几次。你不需要多个隐藏的恶魔。您只能使用一个隐藏字段,通过将所有输入值转换为JSON对象JSON.stringify文件进入这个领域。在服务器端-将JSON对象(有许多Java lib)反序列化为Java类。这就是全部。