JSF2和自定义组件 - 如何从Javascript代码调用操作?

时间:2011-12-28 17:36:54

标签: ajax java-ee jsf-2

我已经改编了一个用于JSF的饼图JS对象;为了做到这一点,我创建了一个自定义组件,在页面上输出相应的标记和JS调用,正确地呈现图形。为了参考,我参考了JS部分的教程this is the link

下一步是监听切片上的点击,并从辅助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

提前谢谢大家!

2 个答案:

答案 0 :(得分: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代码中完成所有操作,但这肯定需要更多的工作。

答案 1 :(得分:0)

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

想到的框架是JBOSS的Seam

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

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

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