2012-04-06 43 views
1

使用JSF 2.0更換輸入字段:爲什麼一個JSF需要驗證錯誤,其原有的價值

用戶加載一個頁面綁定到具有現有值後臺Bean的字段中輸入字段。輸入字段已被標記爲必需。如果用戶填寫了該字段並提交了表單,則會按預期顯示所需的消息,但是在呈現頁面時該字段的值將替換爲其原始值,而不是將該字段留空。

此行爲與在字段上存在格式驗證錯誤(與所需的驗證錯誤)時發生的情況不一致,例如,如果用戶在與電子郵件格式驗證程序相關聯的頁面上輸入了一個字段,並且該用戶替換了當該頁面加載了無效電子郵件地址時填充在該字段中的現有有效電子郵件地址,並且提交表單時,將顯示驗證錯誤消息,並且電子郵件地址字段的當前值將保留(並且在加載頁面時不會用其原始值替換)。

當重新加載其原始(非空白)值時,是否有任何方法可以將字段留空爲空?

更多細節:

  • 的Weblogic 10.3.2
  • MyFaces的2.0.12

JSF頁面:

<h:form> 
    <h:messages showSummary="true"/> 
    <h:inputText value="#{page1Controller.firstName}" 
       required="true" 
       requiredMessage="You must enter a first name"/> 
    <h:commandButton value="Submit"/> 
</h:form> 

Managed Bean的

@ManagedBean 
public class Page1Controller 
{ 

    public String getFirstName() 
    { 
     return "Default Value"; 
    } 

    public void setFirstName(String value) 
    { 
     // no-op (for example purposes only) 
    } 

} 
+0

這是不是默認的行爲。它應該已經按照你最初的預期工作了。更重要的是,我只是在Tomcat 7.0.26上嘗試了一個Mojarra 2.1.7的快速例子,它對我來說很有用。請顯示SSCCE並提及確切的JSF impl/version和appserver impl/version。 – BalusC 2012-04-06 19:58:42

回答

3

改變網絡中的context-param javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL .xml從true到false修復了這個問題。

+0

(目前尚不清楚這是否是潛在的缺陷;人們可能會預期是否設置了真或假,所需字段在重置其原始值方面的行爲應該一致,或者至少應該在規範中記錄差異) – BestPractices 2012-04-09 13:55:50

+1

請注意,爲此記錄了一個JSF Jira缺陷 - http://java.net/jira/browse/JAVASERVERFACES-2375 – BestPractices 2012-04-09 19:44:44

0

支持bean的範圍是什麼?

,該問題可能與範圍,因爲豆可以驗證錯誤後重新加載,導致輸入字段顯示原豆的價值

+0

已嘗試請求,查看和會話。沒有區別 – BestPractices 2012-04-06 19:02:27

+0

這應該沒有什麼區別。 – BalusC 2012-04-06 20:00:28

0

我有同樣的問題 (Glassfish的帶鑽嘴魚科2.2.7)

如果用戶編輯已填寫數據的頁面,然後在一個selectOneMenu用於他選擇空選項,當他提出,他得到了驗證錯誤(字段爲空)並且值返回。

爲了解決這個問題我補充這一點:

<h:selectOneMenu value="#{myBean.value}" validator="#{myBean.required}"> 
<f:selectItem itemValue="#{null}" itemLabel="" /> 
<f:selectItems value="#{myBean.list}" /> 
</h:selectOneMenu> 

public void required(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    if(value == null) { 
     ((UIInput) component).setValue(null); 
     ((UIInput) component).setValid(false); 
     throw new ValidatorException(new FacesMessage("Empty!")); 
    } 
} 

但會更好,如果我們可以只使用「所需=真」。 我們沒有INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL的任何設置,所以我不認爲這是原因?

[編輯] 其實我注意到它僅用於內部小時輸入的情況:數據表

相關問題