表单的验证:客户端验证和服务器端验证
表单的验证:客户端验证和服务器端验证
表单的确认
客户端确认:
减少服务器负载
缩短用户等待时间
兼容性难
服务器端确认:
统一确认
兼容性强
服务器负载重
客户端验证例子
首先建立一个表单,在其提交时用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>
但是客户端的验证是不可靠的,用户可以查看源代码,找到表单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。