我有一个页面,其中包含x.xhtml
,并通过了2个ui:param
。
<p:outputPanel>
<ui:include src="x.xhtml">
<ui:param name="a" value="a" />
<ui:param name="b" value="b" />
</ui:include>
</p:outputPanel>
x.xhtml
在其开头声明了2个c:set
,它们将参数设置到名为@ViewScoped
的{{1}}控制器中。
current
<c:set target="#{current}" value="#{a}" property="a" />
<c:set target="#{current}" value="#{b}" property="b" />
和setA(A a)
方法将被调用以设置这些属性。
setB(B b)
我正在控制器中寻找一个可以同时设置两个参数的地方。我不需要将它们作为属性。他们应该初始化控制器。我宁愿不在模板中使用它们。我宁愿不要将它们作为字段。我宁愿删除二传手。
问题在于无法从构造函数,@ViewScoped
class CurrentViewController {
private A a;
private B b;
public void setB(B b) { this.b = b; }
public void setA(A a) { this.a = a; }
}
方法或我知道的任何其他机制中访问它们。它们可以在相应的设置器中访问,但可以分别访问。
@PostConstruct
public void setB(B b) {
// I have to check if this.a is already set
if (this.a != null) {
// I can do my initialisation: this.a and b are ready
}
// I have to set a field because setA would do the same trick
}
看起来和setA(A a)
一样难看。还不清楚哪种方法触发初始化。我猜这主要取决于setB(B b)
中参数的顺序。