2014-09-12 70 views
0

我有一個jsf頁面,其中包含一個selectmanylistbox,其值是由我管理的函數提供的對象數組。這些目的是根據下面的簡單類:jsf提交表單無效的值

public class Category { 
private String categoryId; 
private String categoryName; 
private String[] templates; 

public Category(String categoryId, String categoryName) { 
    this.categoryId = categoryId; 
    this.categoryName = categoryName; 
} 

public Category(String categoryId, String categoryName, String[] templates) { 
    this.categoryId = categoryId; 
    this.categoryName = categoryName; 
    this.templates = templates; 
} 

public String getCategoryId() { 
    return categoryId; 
} 

public void setCategoryId(String categoryId) { 
    this.categoryId = categoryId; 
} 

public String getCategoryName() { 
    return categoryName; 
} 

public void setCategoryName(String categoryName) { 
    this.categoryName = categoryName; 
} 

public String[] getTemplates() { 
    return templates; 
} 

public void setTemplates(String[] templates) { 
    this.templates = templates; 
} 

這裏是託管bean函數提供所述陣列,用於selectonelistbox:

public Category[] getCategoryValues() { 

    categoryValues = new Category[4]; 

    String[] temp = new String[3]; 
    temp[0] = "Line 1"; 
    temp[1] = "Line 2"; 
    temp[2] = "Line 3"; 
    categoryValues[0] = new Category("1001", "Category 1", temp); 
    temp = new String[3]; 
    temp[0] = "Line 4"; 
    temp[1] = "Line 5"; 
    temp[2] = "Line 6"; 
    categoryValues[1] = new Category("1002", "Category 2", temp); 

    temp = new String[3]; 
    temp[0] = "Line 7"; 
    temp[1] = "Line 8"; 
    temp[2] = "Line 9"; 

    categoryValues[2] = new Category("1003", "Category 3", temp); 

    temp = new String[3]; 
    temp[0] = "Line 10"; 
    temp[1] = "Line 11"; 
    temp[2] = "Line 12"; 

    categoryValues[3] = new Category("1004", "Category 4", temp); 

    return categoryValues; 

} 

下面是該selectmanylistbox JSF的代碼:

<h:selectOneListbox value="#{category.selectedCategoryId}" 
    onchange="submit()"> 

     <f:selectItems value="#{category.categoryValues}" var="cat" 
      itemLabel="#{cat.categoryName}" itemValue="#{cat.categoryId}" /> 
    </h:selectOneListbox> 

此外,我使用以下事件來重新加載頁面,只要選擇一個類別:

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

重新載入頁面的目的是使用selectedcategory作爲selectmanycheckbox項目的基礎,顯示selectedcategory中的數組作爲複選框。這裏是相應的jsf代碼:

<h:selectManyCheckbox value="#{category.targetTemplates}"> 

     <f:selectItems value="#{category.selectedCategoryTemplates}" /> 
    </h:selectManyCheckbox> 

其中CategoryTemplates是simplay一個字符串對象的數組。

現在,類別選擇和頁面重新載入工作正常,並且selectmanycheckbox項目正確顯示,並且所選類別中的字符串作爲選項正確顯示。當我嘗試選擇一些複選框值並提交它們時,我收到了一個inavlid值錯誤消息,並且沒有提交完成。 selectmanycheckbox使用的值在頁面加載時可用,那麼可能是什麼問題?

下面是實際無爲initialize()方法,我只是用它來重新加載頁面的目的:

public void intialize() { 

} 

下面是複選框的HTML代碼:

<table> 
<tr> 
<td> 
<input name="j_idt4:j_idt8" id="j_idt4:j_idt8:0" value="Line 1" type="checkbox" /><label 
for="j_idt4:j_idt8:0" class=""> Line 1</label></td> 
<td> 
<input name="j_idt4:j_idt8" id="j_idt4:j_idt8:1" value="Line 2" type="checkbox" /><label 
for="j_idt4:j_idt8:1" class=""> Line 2</label></td> 
<td> 
<input name="j_idt4:j_idt8" id="j_idt4:j_idt8:2" value="Line 3" type="checkbox" /><label 
for="j_idt4:j_idt8:2" class=""> Line 3</label></td> 
</tr> 
</table> 

在控制檯上實際的錯誤信息是:

j_idt4:j_idt8:Überprüfungsfehler:WERT ISTungültig),細節=(j_idt4:j_idt8:Überprüfungsfehler:WERT ISTù ngültig。)]

及其在德國和意味着驗證失敗,值無效

+0

請顯示錯誤消息和category.intialize()方法。看起來preRenderView在最終的POST後被再次調用,從而改變了值。根據用戶選擇更新部分輸出的要求更好地使用ajax處理... – Yamada 2014-09-12 15:35:07

+0

我已編輯帖子,添加了導致錯誤的HTML代碼以及錯誤消息(其德文版本)。我也考慮過Ajax,但由於項目需求而無法使用 – user1107888 2014-09-12 15:43:55

+0

您對initialize()函數是正確的,它在提交時也會被調用。 – user1107888 2014-09-12 15:47:38

回答

0

檢查託管bean其提供selectonelistbox(方法getCategoryValues)陣列的範圍。它必須像在初始請求期間(在提交表單之前,在選擇值期間)一樣,在後續請求(在提交表單期間)返回相同的列表。