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

Ajax JSF2和自定义组件-如何从Javascript代码调用操作?,ajax,jakarta-ee,jsf-2,Ajax,Jakarta Ee,Jsf 2,我已经修改了一个饼图JS对象来与JSF一起使用;为了做到这一点,我创建了一个自定义组件,它在页面上输出适当的标记和JS调用,从而正确地呈现图形。为了便于参考,在我为JS部分所遵循的教程中 下一步是侦听切片上的单击,并从支持bean调用操作。图表的JS对象已经包含了一个占位符函数,可以监听这样的点击,所以我相信它的JS部分是好的。然而,JSF方面仍然让我感到厌烦;我已经阅读了JavaEE教程、JimDriscoll的博客文章以及互联网上的所有文章,但仍然无法理解它 那么,有谁能给我举个小例子,说明

我已经修改了一个饼图JS对象来与JSF一起使用;为了做到这一点,我创建了一个自定义组件,它在页面上输出适当的标记和JS调用,从而正确地呈现图形。为了便于参考,在我为JS部分所遵循的教程中

下一步是侦听切片上的单击,并从支持bean调用操作。图表的JS对象已经包含了一个占位符函数,可以监听这样的点击,所以我相信它的JS部分是好的。然而,JSF方面仍然让我感到厌烦;我已经阅读了JavaEE教程、JimDriscoll的博客文章以及互联网上的所有文章,但仍然无法理解它

那么,有谁能给我举个小例子,说明我如何将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?
}
我发现最接近我的问题是这样的。但是,我希望在我自己的组件中使用标准JSFAPI提供这种支持。可能接近的东西


提前谢谢大家

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

想到的框架是JBOSS的Seam

  • Seam通过设计直接与JSF集成(GWT更像是一个轻量级的、独立的、全状态的web应用程序框架——它没有很多用于直接与JMS和其他现代J2ee功能集成的嵌入式功能)

  • Seam直接支持GWT风格的支持ajax的组件


  • 这里有一个很好的教程:

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

    想到的框架是JBOSS的Seam

  • Seam通过设计直接与JSF集成(GWT更像是一个轻量级的、独立的、全状态的web应用程序框架——它没有很多用于直接与JMS和其他现代J2ee功能集成的嵌入式功能)

  • Seam直接支持GWT风格的支持ajax的组件


  • 这里有一个很好的教程:

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

    我能想到的最快的方法是跟随您引用的Jim Driscoll的博客,通过将您自己的基于Java的自定义组件包装到复合组件中,重新使用
    标记提供的现有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代码中完成所有这些工作,但这肯定需要更多的工作。

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

    我能想到的最快的方法是跟随您引用的Jim Driscoll的博客,通过将您自己的基于Java的自定义组件包装到复合组件中,重新使用
    标记提供的现有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代码中完成所有工作,但这肯定需要更多的工作。

    我知道Seam,但它不是本项目的选项。同样,这个问题与JSF自定义组件开发更相关,它首先应该是框架无关的。但是谢谢你的时间:)我知道Seam,但它不是这个项目的一个选项。同样,这个问题与JSF自定义组件开发更相关,它首先应该是框架无关的。但是谢谢你的时间:)我想没有办法了,只能试着简化一下组件本身。如果您查看JS图表,对切片单击的调用与画布组件相关联——作者使用几何图形来确定单击是否在切片上,然后调用触发事件的JS函数。将任何东西绑定到Java自定义组件中的这个JS行为都是很困难的。我想没有办法解决这个问题,只能尝试稍微简化组件本身。如果您查看JS图表,对切片单击的调用与画布组件相关联——作者使用几何图形来确定单击是否在切片上,然后调用触发事件的JS函数。将任何东西绑定到Java自定义组件中的这个JS行为都是很困难的。。