尝试使用jsf2.0(Mojarra)开发复合组件,该组件应根据bean中的列表动态呈现命令按钮。我能够渲染按钮,但动作没有被触发。可以请任何人帮我解决问题吗?
以下是代码
<composite:interface>
<composite:attribute name="buttonList" required="true"
type="java.util.List" />
<composite:attribute name="beanName" required="true"
type="java.lang.Object" />
</composite:interface>
<composite:implementation>
<ui:repeat var="listItem" value="#{cc.attrs.buttonList}">
<h:commandButton value="#{listItem.buttonName}"
action="#{cc.attrs.beanName.listItem.buttonAction}">
</h:commandButton>
</ui:repeat>
</composite:implementation>
用作
<utils:buttonGroup buttonList="#{testButtonBean.buttonList}"
beanName="#{testButtonBean}" />
bean看起来像
public class TestButtonBean {
public List<ButtonPOJO> buttonList = new ArrayList<ButtonPOJO>();
public List<ButtonPOJO> getButtonList() {
return buttonList;
}
public void setButtonList(List<ButtonPOJO> buttonList) {
this.buttonList = buttonList;
}
public void preProcess() {
if (null != buttonList && buttonList.size() == 0) {
ButtonPOJO ob1 = new ButtonPOJO("Continue", "next");
ButtonPOJO ob2 = new ButtonPOJO("Back", "prev");
buttonList.add(ob1);
buttonList.add(ob2);
}
}
public String next() {
return "page1";
}
public String prev() {
return "page2";
}
}
答案 0 :(得分:0)
action="#{cc.attrs.beanName.listItem.buttonAction}"
这是不对的。此语法基本上是在listItem
上查找属性beanName
,然后尝试在其上调用文字操作buttonAction()
。
如果要将操作方法名称指定为来自其他bean属性的字符串,则需要括号符号action="#{bean[methodName]}"
。
action="#{cc.attrs.beanName[listItem.buttonAction]}"
无关具体问题,如果上述解决方案仍然失败,则只能表示value="#{cc.attrs.buttonList}"
在表单提交请求期间发生了不兼容的更改。您需要确保在回发期间准备与初始请求期间完全相同的列表。另见commandButton/commandLink/ajax action/listener method not invoked or input value not updated的第4点。