校验,是保证应用程序“入口干净”的基本手段,“地沟油,奶粉”,在这里不应该被放行。


客户端校验是程序开始校验的起点(详见我的博客),此处我们讨论服务器端的校验方法,这是进行程序的最后关口,如果此关把不住,对应用的影响会是致命的。


做事情总需要一个“套路”,才可以基本上符合质量的要求。以下我总结一下在Servlet中进行校验的基本模板:

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        boolean passed=true;//表示校验是否通过
        String page="suc.jsp";//成功页面
        //数据的接收
        String uname=request.getParameter("uname");
        String sa=request.getParameter("salary");
        String email=request.getParameter("email");
        String idcard=request.getParameter("idcard");
        String sbirth=request.getParameter("birth");
                                          
        //转换类型
        float salary=-1;
        Date birth=null;
                                          
        try{
            salary=Float.parseFloat(sa);
        }
        catch (Exception e) {
            //转换失败,进入到此处,salary将维持-1的值
        }
        try{
            SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd");
            birth=sd.parse(sbirth);
        }
        catch (Exception e) {
            //转换失败,进入到此处,birth将维持null的值
        }
        //以上两处异常,会帮助我们做校验,省事了吧。。。
                                          
        //校验 开始
        if(uname.trim().length()<=3){
            passed=false;
            request.setAttribute("uname_error", "用户名必须大于三位");
                                              
        }
        if(salary<0){
            passed=false;
            request.setAttribute("salary_error", "请输入合法数值");
        }
        if(!email.matches(".+@.+\\..+")){
            passed=false;
            request.setAttribute("email_error", "请输入合法邮箱");
        }
        if(!idcard.matches("^\\d{4}[\\d|x|X]$")){
            passed=false;
            request.setAttribute("idcard_error", "请输入×××号");
        }
        if(birth==null){
            passed=false;
            request.setAttribute("birth_error", "请输入正确的日期");
        }
                                          
        if(passed){//校验通过,正常调用业务
        //封装
            User u = new User();
            u.setUname(uname);
            //业务调用
                                              
            //业务数据传递
                                              
            //跳转
        }
        else{
            page="index.jsp";//校验未通过时,转向到输入页面
        }
                                          
        request.getRequestDispatcher(page).forward(request, response);
                                          
    }

JSP中的代码模板,如下:

<form action="regist" method="post">
 用户名:<input type="text" name="uname" value="${param.uname }"/><span>${uname_error}</span><br/>
 工资:<input type="text" name="salary" value="${param.salary}"/><span>${salary_error}</span><br/>
 电邮:<input type="text" name="email" value="${param.email}"/><span>${email_error}</span><br/>
 ×××号:<input type="text" name="idcard" value="${param.idcard}"/><span>${idcard_error}</span><br/>
 出生日期:<input type="text" name="birth" value="${param.birth}"/><span>${birth_error}</span><br/>
 <input type="submit"/>
                         
</form>


不足之处:编码量过大,难对提高效率和质量,在Struts2中,对代码做了大量的改进,详见我的后续博文。