我有两个backbeans,一个用于检索ui中的数据:repeat和一个用于执行操作。
当我的页面被渲染时,如果我用第二个backbean执行一个动作,第一个被调用(初始化),即使我使用Richfaces 4的ajax动作。如果我不使用重复,则不是这种情况零件。 令人讨厌的是,使用repeat元素调用第一个bean。
这是我的代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<h:head>
</h:head>
<h:body>
<h:form>
<ui:repeat var="currentValue" value="#{test_form_backBean_1.testSimpleModels}">
#{currentValue.name}
<br />
</ui:repeat>
<a4j:commandButton value="Tester" actionListener="#{test_form_backBean_2.test}" execute="@this" render="@this">
</a4j:commandButton>
</h:form>
</h:body>
</html>
我的第一个豆子:
@Named("test_form_backBean_1")
@RequestScoped
public class Test_form_backBean_1 {
private static final Logger logger = Logger.getLogger(Test_form_backBean_1.class);
private List<Test_Simple_Model> testSimpleModels;
@PostConstruct
public void init() {
if (logger.isTraceEnabled())
logger.trace("Initialisation de Test_form_backBean_1.");
testSimpleModels = new ArrayList<Test_Simple_Model>();
testSimpleModels.add(new Test_Simple_Model(1L, "name_1"));
testSimpleModels.add(new Test_Simple_Model(2L, "name_2"));
testSimpleModels.add(new Test_Simple_Model(3L, "name_3"));
testSimpleModels.add(new Test_Simple_Model(4L, "name_4"));
}
public List<Test_Simple_Model> getTestSimpleModels() {
logger.trace("getTestSimpleModels() : appel.");
return testSimpleModels;
}
public void setTestSimpleModels(List<Test_Simple_Model> testSimpleModels) {
logger.trace("setTestSimpleModels() : appel.");
this.testSimpleModels = testSimpleModels;
}
}
第二个:
@Named("test_form_backBean_2")
@RequestScoped
public class Test_form_backBean_2 {
private static final Logger logger = Logger.getLogger(Test_form_backBean_2.class);
@PostConstruct
public void init() {
logger.trace("Initialisation de Test_form_backBean_2.");
}
public void test() {
logger.trace("test() : appel de la fonction de test.");
}
}
提前感谢您的帮助。
答案 0 :(得分:0)
问题是你的bean是请求范围的,这意味着它们在请求 - 响应生命周期完成后就会超出范围,这是非面部请求(整页)或AJAX后退的结果请求。
您需要使用视图范围的bean。由于您正在使用CDI,您可以停止使用它并切换到使用具有@ViewScoped
注释的JSF 2托管bean,或者您可以继续使用带有Seam Faces 3的CDI,它显然也支持@ViewScoped
。 (我不知道它做了什么魔术,但显然它只是有效。)
还请尝试使用普遍接受的Java命名约定,例如TestFormBackBean1
而不是Test_form_backBean_1
。