表单的验证:客户端验证和服务器端验证

 

表单的验证:客户端验证和服务器端验证

 

表单的确认

客户端确认:

  减少服务器负载

  缩短用户等待时间

  兼容性难

服务器端确认:

  统一确认

  兼容性强

  服务器负载重

 

客户端验证例子

  首先建立一个表单,在其提交时用JavaScript方法进行验证,若该方法返回true,则进行表单的提交,若返回false,则表单不提交。

 

      <!-- 表单提交时执行JavaScript方法validate(),如果该方法返回false,那么表单是不会提交的 -->
    <form onsubmit="return validate()" action="servlet/ValidateServlet">
    username:<input type="text" name="username" id="username1"><br>
    password:<input type="password" name="password" id="password1"><br>
    re-password:<input type="password" name="repassword" id="repassword1"><br>
    <input type="submit" value="submit">
    </form>

 

  其中用于验证的JavaScript方法如下:

<script type="text/javascript">
        function validate()
        {
            //第一种方式:通过ID获取元素
            // var username = document.getElementById("username1");
            // var password = document.getElementById("password1");
            // var repassword = document.getElementById("repassword1");
            
            //第二种方式:通过名字获取
            var username = document.getElementsByName("username")[0];//因为允许名字重复
            var password = document.getElementsByName("password")[0];
            var repassword = document.getElementsByName("repassword")[0];
            
            //判断用户名是否为空
            if("" == username.value)
            {
                //判断语句也可以写: username.value.length == 0
                alert("username can't be blank!");
                return false;
                
            }
            
            //密码和重复密码内容一样,长度在6到10之间
            
            //先验证密码长度
            if(password.value.length < 6 || password.value.length > 10)
            {
                alert("length of password is invalid!");
                return false;
            }
            if(repassword.value.length < 6 || repassword.value.length > 10)
            {
                alert("length of repassword is invalid!");
                return false;
            }
            
            //再验证重复密码和密码是否相同
            if(password != repassword)
            {
                alert("password and repassword don't match!");
                return false;
                 
            }
            
            //通过重重考验后返回true,进行表单提交
            return true;
        
        }
    </script>

  在验证有误的时候,弹出对话框提示,并且返回false,不提交表单。

  完整的login.jsp如下(在客户端验证的时候可以先不管转向的Servlet):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <script type="text/javascript">
        function validate()
        {
            //第一种方式:通过ID获取元素
            // var username = document.getElementById("username1");
            // var password = document.getElementById("password1");
            // var repassword = document.getElementById("repassword1");
            
            //第二种方式:通过名字获取
            var username = document.getElementsByName("username")[0];//因为允许名字重复
            var password = document.getElementsByName("password")[0];
            var repassword = document.getElementsByName("repassword")[0];
            
            //判断用户名是否为空
            if("" == username.value)
            {
                //判断语句也可以写: username.value.length == 0
                alert("username can't be blank!");
                return false;
                
            }
            
            //密码和重复密码内容一样,长度在6到10之间
            
            //先验证密码长度
            if(password.value.length < 6 || password.value.length > 10)
            {
                alert("length of password is invalid!");
                return false;
            }
            if(repassword.value.length < 6 || repassword.value.length > 10)
            {
                alert("length of repassword is invalid!");
                return false;
            }
            
            //再验证重复密码和密码是否相同
            if(password != repassword)
            {
                alert("password and repassword don't match!");
                return false;
                 
            }
            
            //通过重重考验后返回true,进行表单提交
            return true;
        
        }
    </script>

  </head>
  
  <body>
      <!-- 表单提交时执行JavaScript方法validate(),如果该方法返回false,那么表单是不会提交的 -->
    <form onsubmit="return validate()" action="servlet/ValidateServlet">
    username:<input type="text" name="username" id="username1"><br>
    password:<input type="password" name="password" id="password1"><br>
    re-password:<input type="password" name="repassword" id="repassword1"><br>
    <input type="submit" value="submit">
    </form>
  </body>
</html>
login.jsp

 

  但是客户端的验证是不可靠的,用户可以查看源代码,找到表单action的Servlet,然后转向这个地址,将参数用?连接在地址之后,这时候参数是没有经过客户端校验的

 

服务器端验证例子

  从表单中获得参数:JSP通过request内置对象获取表单信息,用不同的方法获取不同种类的信息。

  服务器端验证程序,先将客户端验证部分去掉,即去掉 表单中的:onsubmit="return validate()"

  那么用户在表单中提交的数据将直接传到服务器端,服务器端Servlet对其进行验证:

  方式如下:有错误时将错误信息放在一个String类型的List中,最后判断这个List是否为空,如果为空,转向验证成功页面;如果List不为空,则转向失败页面,显示错误信息。

 

package com.shengqishiwind.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



public class ValidateServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String repassword = req.getParameter("repassword");
        
        List<String> list = new ArrayList<String>();
        if(null == username || "".equals(username))
        {
            list.add("username can't be blank!");
        }
        
        if(null == password || password.length()<6 || password.length()>10)
        {
            list.add("password should be between 6 and 10");
        }
        if(null == repassword || repassword.length()<6 || repassword.length()>10)
        {
            list.add("repassword should be between 6 and 10");
        }
        
        if(null != password && null != repassword && !password.equals(repassword))
        {
            list.add("password and repassword don't match!");
        }
        
        //有两种结果:验证通过和不通过
        if(list.isEmpty())
        {
            req.setAttribute("username", username);
            req.setAttribute("password", password);
            req.getRequestDispatcher("../success.jsp").forward(req, resp);
            
        }
        else 
        {
            req.setAttribute("error", list);
            req.getRequestDispatcher("../error.jsp").forward(req, resp);
        }
        

    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {

        this.doGet(req, resp);
    }

}

 

 

  成功页面JSP body部分:

  <body>
    username:<%= request.getAttribute("username") %><br>
    password:<%= request.getAttribute("password") %><br>
  </body>

 

  失败页面:

  <body>
    <h1>login failed</h1>
    <% List<String> list = (List<String>)request.getAttribute("error");
    for(String str: list)
    {
        out.println(str+"<br>");  
    }
    %>
  </body>

 

 

 

参考资料

  圣思园张龙老师Java Web培训视频022。

posted @ 2013-06-23 15:59  圣骑士wind  阅读(12207)  评论(0编辑  收藏  举报