2012-08-07 166 views
3

我正在尋找一些代碼來設置JSF託管bean中的屬性。我的第一個想法是類似的東西:c:爲bean屬性設置

<c:set var="#{loginBean.device}" value="mobil"></c:set> 

這意味着我要的屬性device設置爲值"mobil"沒有一個按鈕都被點擊。

回答

9

是的,你可以使用C:爲了這個目的設置。

<c:set value="mobil" target="#{loginBean}" property="device" /> 

文件:http://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/2.0/docs/pdldocs/facelets/c/set.html

然而,很少設置一個靜態值是有道理的。您可能會考慮直接在託管bean類中設置默認值。同樣在可維護性方面,因爲您可以在Java代碼中比在視圖層中更好地處理常量。

+0

非常感謝你SOO - 我想不起來:) – DominikAngerer 2012-08-07 11:42:01

+3

正如旁註:JSF 2.2提出了一個很好的解決方案:查看操作(請參閱http://jdevelopment.nl/jsf-22/#758) 。 如果可能,我寧願不使用jstl。由於JSTL是在不同的時間點評估的,因此建議的方法在使用值表達式而不是靜態值時可能會導致難看的副作用。 – tasel 2012-08-07 12:45:19

2

我想你想JSF標記子標記setPropertyActionListener。您可以在任何ActionComponent中將其設置爲子標籤。

<h:anyActionComponent id="component1"> 
    <f:setPropertyActionListener target="#{loginBean.device}" value="mobil" /> 
</h:anyActionComponent> 

UPDATE:

我本來誤解了用戶的問題。他們有一個頁面,他們希望在頁面加載時設置屬性。有幾種方法可以做到這一點,但兩者有點不同。如果您想在每次回發後將屬性設置爲值,則可以在ManagedBean方法上使用@PostConstruct註釋。

@PostConstruct 
public void initializeStuff() { 
    this.device = "mobil"; 
} 

現在,如果我有一個ViewScoped或SessionScope豆需要用默認值初始化僅僅一次加載網頁時,那麼你可以設置將在每次回發後運行一個階段生命週期事件,並檢查是否該頁面應該被初始化或沒有。

mah.xhmtl:

<f:event listener="#{loginBean.initialize()}" type="preRenderView" /> 

LoginBean:

public void initialize() { 
    if (this.device == null) 
    this.device = "mobil"; 
} 
+0

Okey但當我不想點擊一個按鈕(這是一個UIComponent)或只有當網頁加載時的東西? – DominikAngerer 2012-08-07 11:31:10

+0

@ user1581725所以你的意思是說你只想在頁面加載的時候使用這個值來設置設備屬性? – 2012-08-07 11:33:51

+0

多數民衆贊成所有是的 - 但我真的不知道如何使--Sry我真的是新的JSF .. – DominikAngerer 2012-08-07 11:34:54

0

我無法評論:如果您需要在頁面加載時準備好值,可以使用受管Bean直接初始化值或使用其構造函數或@PostConstruct來執行相同操作。

 @ManagedBean 
    @ResquestScoped 
    public class LoginBean { 
      private String device = "some value"; 
      //Using Constructor 
      public LoginBean() { 
       device = getvalueFromSomewhere(); 
      } 

      //Using PostConstruct 
      @PostConstruct 
      public void init() { 
       device = getvalueFromSomewhere(); 
      } 

    } 
0

您可以通過另一個ManagedBean設置xhtml文件中的值而不是設置值。例如,如果您有管理page1.xhtml的managedBean1和管理page2.xhtml的managedBean2。如果page1.xhtml包括page2.xhtml,如:

<ui:include src="page2.xhtml"/> 

在managedBean1你可以在上面

@ManagedProperty(value = "#{managedBean2}") 
private ManagedBean2 managedBean2; 

,並在PostConstruct

@PostConstruct 
public void construct() { 
    managedBean2.setProperty(...); 
} 

反正工作對我來說...