目前,我正在尝试使用带有 Facelets View 技术的 JavaServer Faces 2.0 实现 webpart 技术以用于教育目的。我已经创建了 facelet 模板、facelet 自定义组件并制作了一些 facelet"template"客户端。但在一件事上我被困住了。我无法动态加载控件并将它们放在 cc:attributes
中。
例如,如果我有一个带有静态文本的页面,或者将其与 ManagedBean 属性 ui:include
绑定(bind),则一切正常。
<ui:define name="right-column">
right-column asd
<h:link outcome="asdf" value="link_get">
<f:param name="aa" value="123" />
<f:param name="a" value="123 dd + 20" />
</h:link>
<h:commandLink action="asdf?faces-redirect=true" value="asdf">
<f:param name="aa" value="123" />
</h:commandLink><br />
<ui:include src="./resources/Controls/CategoryTree.xhtml"/><br />
This works even if I put src with MenageBean property.
<ui:include src="#{browseProducts.incudePath}"/>
</ui:define>
这是我的 facelet 控件(数据绑定(bind)在 #{TreeBean.root}
中的此控件内:
<!-- NO INTERFACE -->
<cc:interface>
</cc:interface>
<!-- IMPLEMENTATION -->
<cc:implementation>
<!-- This is a very simply scaffolding for Category Three Control.
-->
<p:tree value="#{TreeBean.root}" var="node"
expandAnim="FADE_IN" collapseAnim="FADE_OUT">
<p:treeNode>
<h:outputText value="#{node}" />
</p:treeNode>
</p:tree>
</cc:implementation>
但是当 ui:include
指向带有 cc:attribute
的控件时,我遇到了问题。我不知道如何从支持 bean 初始化这个属性并做“东西”。
例如我有这个页面:
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./resources/layout/Template.xhtml"
xmlns:sc="http://java.sun.com/jsf/composite/Controls">
<ui:define name="right-column">
<sc:dummy ItemCount="10" />
<ui:include src="./resources/Controls/dummy.xhtml" />
</ui:define>
</ui:composition>
这里是复合控件:
<cc:interface>
<cc:attribute name="ItemCount" required="true"
shortDescription="This attribute is meaningful " />
</cc:interface>
<!-- IMPLEMENTATION -->
<cc:implementation>
<!-- How to pass ItemCount to my dummy bean to create so many items in
list as ItemCount value -->
<ui:repeat value="#{dummy.dummyList}" var="dummyItem">
<h:outputText value="#{dummyItem}" />
</ui:repeat>
</cc:implementation>
和支持 bean 代码:
public ArrayList<String> getDummyList() {
//Here I try to get dummy list work.
dummyList = new ArrayList<String>(getDummyCount());
for (int i=0;i< getDummyCount();i++){
dummyList.add(i + "" + i);
}
return dummyList;
}
如何做到这一点?
最佳答案
我认为你有两个问题:
- 使用复合组件的参数调用方法
- 为包含的页面指定一些参数
对于 1.,从 jsf 2 开始,您可以直接调用方法,指定参数(这应该是方法签名的一部分):
<ui:repeat value="#{dummy.getDummyList(cc.attrs.dummyCode)}" var="dummyItem">
<h:outputText value="#{dummyItem}" />
</ui:repeat>
但我怀疑您正试图将背衬用于并非设计用途的背衬。也许您会对为您的复合组件编写支持 Java 代码感兴趣,这是不同的。但是,如果您是初学者,则很难掌握。我会首先尝试以不同方式设计我的页面和 bean 交互。我不知道你要解决哪个问题,但乍一看,这个解决方案看起来太复杂了。
对于 2.,您应该查看 ui:param。快速谷歌搜索给了我这个:http://www.jsfcentral.com/articles/facelets_3.html
关于jsf-2 - Java facelets 动态加载和复合组件属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4842517/