2012-12-18 30 views
1

我有隻能接受數字值的文本字段數組,即1-5。輸入非數字數據的服務器端驗證

<s:textfield name="marks[0]" maxlength="1" /> 
<s:textfield name="marks[1]" maxlength="1" /> 
<s:textfield name="marks[2]" maxlength="1" /> and so on upto 9 textfields. 

我對這個getter/setter方法如下

public List<Integer> getMarks(){ 
    return marks; 
} 
public void setMarks(List<Integer> marks){ 
    this.marks = marks; 
} 

如何確保用戶不輸入字母一樣非數值?如果我輸入字符,它會引發運行時異常'java.lang.ClassCastException:java.lang.String不能轉換爲java.lang.Integer'指向Next JSp頁面中的validate方法。

public void validate(){ 
    for(i=0;i<9;i++){ 
    if (marks.get(i)>5)  //this line throws above ClassCastException 
    addFieldError("..."); 
    } 
} 

如何解決此異常以及驗證是否繼續?在其他網頁,文本框單有,則顯示invalid.fieldvalue.error但名單我得到異常

回答

1

只要把你的驗證邏輯裏面try catch

public void validate(){ 
    try{ 
    for(i=0;i<9;i++){ 
     if (marks.get(i)>5)  //this line throws above ClassCastException 
     addFieldError("..."); 
    } 
    }catch(Exception e){ 
    } 
} 
+0

現在它正在工作,但我現在收到2場錯誤。其中一個是來自ConversionErrorInterceptor的無效字段錯誤,其中fieldName顯示爲標記[0]或標記[1],另一個是我使用addFieldError添加的catch塊,它清晰易懂。如何僅顯示自定義消息 –

+0

不要添加您的自定義消息並查看此鏈接http://struts.apache.org/2.x/docs/type-conversion.html#TypeConversion-TypeConversionErrorHandling。 –

0

上面,我通常這樣做的(可能有更好的解決辦法)

public void setMarks(List<String> marksStr){ 
    List<Integer> marks = new ArrayList(); 

    for(String markStr : marksStr) { 
    try { 
     Integer mark = Integer.parseInt(markStr); 
     marks.add(mark); 
    } catch (NumberFormatException e) { 
     addFieldError("", "Wrong mark value: " + markStr); 
    } 
    } 
    this.marks = marks; 
} 
+0

不要把驗證邏輯放在setters/getters裏面。 –

+0

@Vaisly Komarov-我也試過這個,但它仍然在拋出異常。我和Aleksandr M一起,不應該把驗證邏輯放在setters/getters裏面。感謝您的回答,可能在其他一些代碼中可能對我有用。 –