【发布时间】:2013-12-06 21:04:22
【问题描述】:
一个非常简单直接的问题。
我有一个会话范围的托管 bean,如下所示(演示 PrimeFaces range slider)。
@ManagedBean
@SessionScoped
public final class RangeSliderBean implements Serializable
{
private static final long serialVersionUID = 1L;
private static final byte scale=2;
private BigDecimal maxPrice;
private BigDecimal minPrice;
public RangeSliderBean()
{
maxPrice=new BigDecimal(100).setScale(scale, RoundingMode.HALF_UP);
minPrice=new BigDecimal(5).setScale(scale, RoundingMode.HALF_UP);
}
@PostConstruct
private void init()
{
}
//Mutators and accessors
}
上述会话范围的托管 bean 中给定的两个字段绑定到 XHTML 页面。
<h:form id="rangeForm" prependId="true">
<p:panel header="Shop by Price">
<h:panelGrid id="rangeSliderPanelGrid" columns="1" style="margin-bottom:10px">
<h:outputText id="displayRange" value="Min : #{rangeSliderBean.minPrice.toPlainString()} Max : #{rangeSliderBean.maxPrice.toPlainString()}"/>
<p:slider for="txtMinPrice, txtMaxPrice"
minValue="#{rangeSliderBean.minPrice}"
maxValue="#{rangeSliderBean.maxPrice}"
display="displayRange"
style="width:170px"
range="true" displayTemplate="Min : {min} Max : {max}"/>
</h:panelGrid>
<h:inputHidden id="txtMinPrice" value="#{rangeSliderBean.minPrice}" converter="#{bigDecimalConverter}"/>
<h:inputHidden id="txtMaxPrice" value="#{rangeSliderBean.maxPrice}" converter="#{bigDecimalConverter}"/>
<p:commandButton value="Submit"/> <!--Update/process is temporarily omitted.-->
</p:panel>
</h:form>
如果这些字段在@PostConstruct注解的方法中初始化,即init(),在这种情况下(而不是在构造函数中初始化它们,如sn-p所示),它们的指定值是not 设置除非和直到用户登录(除非创建会话)。
那么如何在构造函数中初始化它们,只是有点混乱? (我知道构造函数是在@PostConstruct注解的方法被调用之前调用的)。
【问题讨论】:
-
如果这些字段在
@PostConstruct注释的方法中初始化,即init()(...) 除非用户登录,否则不会设置它们的指定值请注意,@PostConstruct注释的方法将在创建托管 bean 和注入其他组件之后调用,例如EJB。否则,您能否举例说明这种奇怪的行为? -
"由
@PostConstruct注释的方法将在创建托管 bean 后调用"。这就是说,被@PostConstruct注解的方法将在构造函数被调用之后被调用。 “...在注入其他组件之后,例如 EJB”。这也发生在托管 bean 构建之后(即构造函数完成其工作之后)。我无法想象另一个例子:)。 -
我的意思是:使用您的
@SessionScoped托管 bean 发布一个有效的 JSF/Facelets 代码,证明如果这些字段在@PostConstruct方法中初始化而不是在类构造函数中初始化,则它们是空的。
标签: jsf primefaces jsf-2.2 session-scope postconstruct