我已经改编了一个用于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?
提前谢谢大家!
答案 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
Seam通过设计直接与JSF集成,(GWT更像是一个轻量级,独立,有状态的Web应用程序框架 - 它没有很多嵌入式功能,可以直接与JMS和其他现代J2ee功能集成)......
Seam直接支持启用GWT风格的ajax组件。
这里有一个很好的教程:http://www.ibm.com/developerworks/java/library/j-seam3/