2012-10-15 63 views
0

我正在開發一個項目,我對JSF不太熟悉,請更正此問題中的任何空白。使用Apache配置JSF時遇到問題<SelectItems>標記

我有持有該域的值的屬性文件...所以例如

domain=.com 
domain=.net 

在我的豆我有這個

private String domain; 
private String[] domainSelection; 

public void initProp(){ 

    try { 
     Configuration config = new PropertiesConfiguration("prop.properties"); 
     domainSelection = config.getStringArray("domain"); 

    } catch (ConfigurationException e) { 
     Log.error("Error"); 
    } 

} 

在與JSF我的.jsp頁有

<rich:select id="domain" value="#{Bean.domain}"            
     required="true"> 
    <f:selectItems itemValue="#{Bean.domainSelection}" /> 
</rich:select> 

當我調試這個,我得到兩個值在domainSelection,但我需要ge把它們交給JSF,我無法弄清楚如何做到這一點。

回答

1

對不起,我最初錯過了這個問題。

private List<SelectItem> domains = new ArrayList<SelectItem>(); 
//for each domain 
domains.add("com",firstFromDomainSelection); 
domains.add("net",secondFromDomainSelection); 

<f:selectItems value="#{Bean.domains}" /> 

所以這需要getDomains來檢索它們。

編輯:

這是可行的,我相信只要你讀屬性文件再次。需要記住的一件事是該文件可能已經在.war之內,因此您將不得不想出重新添加的方式或將其添加到已部署的文件夾中。

每次該視圖想要獲取該列表,它將調用getDomains()這意味着我們應該有邏輯來拉動被稱爲加班的邏輯。由於File IO可能會造成輕微的性能下降。

private List<SelectItem> domains; 
private Configuration config = new PropertiesConfiguration("prop.properties"); // with accessors 

public List<SelectItem> getDomains(){ 
    domains = new ArrayList<SelectItem>(); 
    String[] domainSelection = getConfig().getStringArray("domain"); 
    for(String domain : domainSelection){ 
    //Define desired logic for the value if its the same (.com) pass the same as value 
    domains.add(new SelectItem(domain ,domain)); // SelectItem(value, label); 
    } 
    return domains; 
} 

我會做

什麼,而不是使用屬性文件,我會用一個表中的域和剛剛動態的記錄添加到表,他們會進行相應的檢索。當該視圖有很多請求時,它可能會減慢速度 - 至少略微減慢。另一個要記住的問題是,如果Apache緩存這些文件。要時刻銘記在心。使用數據庫表更安全的IMO。

+0

我們正在尋找的是如果需要在屬性文件中能夠動態添加域。這不可能嗎?我希望列出整個列表,而不是在每個列表上添加一個「.add」。 – envinyater

+0

我很接近,非常感謝。我現在唯一得到的是當我做的循環,並做domain.add(域,域)我得到的錯誤「類型列表中的方法add(int,SelectItem)不適用於參數(字符串,字符串) – envinyater

+0

對不起,這是一個錯誤,SelectItem列表需要相同的類型 –