在JSF2中,我需要一个bean ClassA在PostConstruct期间由ClassB更新,然后显示更新后的值。我的问题是,类a的getter在类b被postconstruct之前被调用。
我的输出是:
ValX:
淡水河谷:托托
ValX: 42
我要的输出:
ValX: 42
淡水河谷:托托
ValX: 42
在view id创建之前没有创建所有bean是否正常?
在调用ClassA的getter之前更新ClassA的正确解决方案是什么?
package test;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class ClassA implements Serializable {
private String valX;
@PostConstruct
public void init() {
System.out.println("init ClassA");
}
public String getValX() {
System.out.println("get ValX");
return valX;
}
public void setValX(String valX) {
System.out.println("set ValX");
this.valX = valX;
}
}
package test;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class ClassB implements Serializable {
@ManagedProperty(value = "#{classA}")
private ClassA classA;
private String valY = "toto";
@PostConstruct
public void init() {
System.out.println("init ClassB");
classA.setValX("42");
}
public ClassA getClassA() {
return classA;
}
public void setClassA(ClassA classA) {
this.classA = classA;
}
public String getValY() {
return valY;
}
public void setValY(String valY) {
this.valY = valY;
}
}
<?xml version='1.0' encoding='UTF-8' ?>
<!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">
<h:head>
</h:head>
<h:body>
ValX: #{classA.valX}<br/>
ValY: #{classB.valY}<br/>
ValX: #{classA.valX}<br/>
</h:body>
</html>
可以从ClassA的构造函数初始化classB,这样类b的post构造函数将在类a之前被调用Post构造函数。
首先创建类的对象。
然后是与类绑定的post构造函数,在对象创建后自动执行。
类中的任何其他函数,无论是getter、setter还是普通函数,都只能使用已经创建的对象来调用。
如果要在创建类的对象之前调用函数,则必须将函数声明为静态。在所有其他方式中getter将被称为