输入的非数字数据的服务器端验证

时间:2012-12-18 12:02:13

标签: struts2

我有textfield数组,只能接受数值,即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,但对于列表,我将超出异常

3 个答案:

答案 0 :(得分: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){
  }
}

答案 1 :(得分: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;
}

答案 2 :(得分:0)

在Stack overflow中的其他帖子上找到这个答案,检查一个字符串是否为整数,看看是否https://stackoverflow.com/a/1102916/1541001