非常に単純明快な質問です。
次のようなセッション スコープのマネージド Bean があります (PrimeFaces範囲スライダーのデモ)。
@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 の指定された 2 つのフィールドは、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
ieinit()
で注釈が付けられたメソッドで初期化される場合、この場合 (スニペットに示されているようにコンストラクターで初期化するのではなく)、指定された値は、ユーザーがログインするまで (セッションが作成されない限り) 設定されません。 .
コンストラクターでどのように初期化できますか?少し混乱しますか? (コンストラクターは、アノテーションが付けられたメソッドが呼び出される前に呼び出されることを知ってい@PostConstruct
ます)。