【问题标题】:JSF2 and custom components - how to call action from Javascript code?JSF2 和自定义组件 - 如何从 Javascript 代码调用操作?
【发布时间】:2012-01-29 08:42:58
【问题描述】:

我已经调整了一个饼图 JS 对象以与 JSF 一起使用;为此,我创建了一个自定义组件,该组件在页面上输出适当的标记和 JS 调用,从而正确呈现图形。作为参考,this is the link 是我为 JS 部分所遵循的教程。

下一步是监听切片上的点击,并从支持 bean 调用一个动作。图表的 JS 对象已经包含了一个占位符函数来监听这种点击,所以我相信它的 JS 部分是好的。但是,JSF 方面仍然困扰着我。我已经阅读了 Java EE 教程、Jim Driscoll 的博客文章以及整个互联网,但仍然无法理解它。

那么,谁能提供一个小例子,说明我如何将 JS 函数调用绑定到 JSF 中的事件侦听器,以便我的支持 bean 可以很好地获知点击了哪个切片索引用户?

大概是这样的:

function myChartObject() {

    function onSliceClick() {
        // This will somehow trigger JSF ajax event listener with slice data
    }
}

class MyCustomChart extends UIComponentBase implements ClientBehaviorHolder {
    // Is the decode() method the place to bind JS calls to JSF actions?
}

我发现最接近我的问题的是this。但是,我希望使用标准的 JSF API 在我自己的组件中获得这种支持。可能接近this

提前谢谢大家!

【问题讨论】:

    标签: ajax jakarta-ee jsf-2


    【解决方案1】:

    执行 AJAX 调用的 JSF Javascript API 本身是标准化的(资源库“javax.faces”,资源名称“jsf.js”),但在您自己的基于 Java 的自定义组件中添加完整的 AJAX 支持有点复杂。

    我能想到的最快方法是关注您引用的 Jim Driscoll 的博客,并通过将您自己的基于 Java 的自定义组件包装在复合组件中来重用 <f:ajax> 标签提供的现有 AJAX 机制。

    在 Jim 的示例中,我猜想他示例中第 22 行的以下代码是您应该在 onSliceClick 函数中呈现的内容:

    String click = behaviors.get("click").get(0).getScript(behaviorContext);
    

    它看起来有点像这样:

    <ui:component
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:cc="http://java.sun.com/jsf/composite"
        xmlns:cu="http://javaserverfaces.dev.java.net/demo/custom-taglib" 
    >
        <cc:interface shortDescription="Some Description">
            <cc:attribute name="render" required="false" />     
            <cc:attribute name="clickAction" method-signature="java.lang.Object action" required="true" shortDescription="The click action method" />
        </cc:interface>
        <cc:implementation>
            <cu:custom id="customId">
                <f:ajax render="#{cc.attrs.render}" listener="#{cc.attrs.clickAction}"/>
            </cu:custom>
        </cc:implementation>
    </ui:component>
    

    请注意,我没有对此进行测试,但这是一般的想法。当然,也可以直接在 Java 代码中完成所有这些操作,但这肯定需要更多的工作。

    【讨论】:

    • 我想没有办法绕过它,而是尝试将组件本身简化一点。如果查看 JS 图表,切片点击的调用与画布组件相关联——作者使用几何来识别点击是否超过切片,然后调用触发事件的 JS 函数。在 Java 自定义组件中将任何东西绑定到这个 JS 行为将会很困难..
    【解决方案2】:

    看起来您希望能够在您的 java 编译代码中编码 ajax 样式行为,同时将其与 J2ee 堆栈集成。

    想到的框架是JBOSS的Seam

    1. Seam 在设计上直接与 JSF 集成,(GWT 更像是一个轻量级的、独立的、有状态的 Web 应用程序框架 - 它没有很多用于与 JMS 和其他现代 J2ee 特性直接集成的嵌入式特性)...

    2. Seam 直接支持启用 GWT 风格的 ajax 组件。

    这里有一个很好的教程:http://www.ibm.com/developerworks/java/library/j-seam3/

    【讨论】:

    • 我知道 Seam,但它不是这个项目的一个选项。再一次,这个问题更多地与 JSF 自定义组件开发有关,它首先应该与框架无关。但是感谢您的时间:)
    猜你喜欢
    • 1970-01-01
    • 2014-07-12
    • 2017-10-10
    • 1970-01-01
    • 2015-02-11
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多