Skip to content

Files

Latest commit

 

History

History
252 lines (216 loc) · 6.73 KB

59-271131-文本框前端验证.sy.md

File metadata and controls

252 lines (216 loc) · 6.73 KB
show version enable_checker
step
1.0
true

文本框前端验证

回忆

  • 这次解决了重复用户名的问题
  • 但是还是可能有问题的
  • 比如数据库中我们的数据存储宽度是30

图片描述

  • 如果提交的字符串长度大于30,会如何呢?🤔
  • 30有点太大了
  • 把列宽直接干到10
  • 错误就很容易发生了😏

修改字段长度

alter table login alter column username type varchar(10);

图片描述

  • 修改之后想要插入超过10个字符的内容
  • 果然就无法插入了
  • 不过,程序插入的时候会报错
  • 我们需要在insert里面进行验证
  • 并且报错

InsertServlet.java

图片描述

  • 这样就可以重定向到/error
  • msg=usernameTooLong
  • 这个消息需要在ErrorServlet里面处理

ErroServlet.java

图片描述

  • 我再去注册一个特别长的用户名

重新注册

图片描述

  • 如果提交的用户名大于10的话
  • 会直接重定向/error
  • 不过如果用户名大于10的话应该直接跳转
  • 还需要执行查询么?

目前次序

图片描述

  • 不用去执行红框中的查询
  • 代码顺序需要调整

修改代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class InsertServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	public void doPost(HttpServletRequest request,
			HttpServletResponse response)
		throws IOException, ServletException{
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		Connection c = null;
		Statement stmt = null;
		try {
			Class.forName("org.postgresql.Driver");
			c = DriverManager.getConnection(
					"jdbc:postgresql://localhost:5432/oeasy", "postgres",
					"oeasy@pg");
			c.setAutoCommit(false);
			out.println("db connection is ok!!<br/>");
			stmt = c.createStatement();
			String Username = request.getParameter("username");
			String Password = request.getParameter("password");
			if(null!=Username&&Username.length()>10){
				System.out.println("=====yes username too loog");
				stmt.close();
				c.commit();
				c.close();
				response.sendRedirect("http://localhost:8080/oeasy/error?msg=usernameTooLong");
			}
			else{
				ResultSet rs = stmt.executeQuery("select * from login where Username='"+Username+"'");
				if(rs.next()){
					stmt.close();
					c.commit();
					c.close();
					response.sendRedirect("http://localhost:8080/oeasy/error?msg=usernameExists");
				}
				else{
					String sql = "insert into login(username,password) values('"+Username+"','"+Password+"');";
					System.out.print("sql======================" + sql);
					stmt.executeUpdate(sql);
					stmt.close();
					c.commit();
					c.close();
					response.sendRedirect("http://localhost:8080/oeasy/select");
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println(e.getClass().getName() + ": " + e.getMessage());
		}
	}
}
  • 但是如果在网页前端就可以报错的话
    • 可以降低后台的读写压力
    • 可以降低网络传输压力
    • 可以第一时间进行提示
    • 因为浏览器直接就报了错了

前端验证

图片描述

  • 可以找到用户名文本框对应的字符串长度
  • 我在提交的时候
  • 需要先在前端验证
  • 然后再提交

prepareInsert.html

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta http-equiv="content-Type" content="text/html;charset=utf-8"/>
		<title>prepareInsert</title>
	</head>
	<body>
		<form id="RegistForm" onsubmit="return doSubmit()" action="./insert" method="post">
			用户名:<input id="username" name="username" type="text" />
			<br/>
			密码:<input id="password" name="password" type="text" />
			<br/>
			<input type="submit"  value="注册" >
			<input type="reset" value="重置" >
		</form>
	</body>
	<script>
		function doSubmit(){
			var username = document.getElementById("username");
			if(username.value.length>10){
				alert("用户名有"+username.value.length+",请不要超过10位");
				return false;
			}
			else{
				var form = document.getElementById("RegistForm");
				form.submit();
			}
		}
	</script>
</html>
  • 有的时候不是弹窗报错
  • 而是在网页上报错
  • 应该怎么办呢?

网页报错

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta http-equiv="content-Type" content="text/html;charset=utf-8"/>
		<title>prepareInsert</title>
	</head>
	<body>
		<form id="RegistForm" onsubmit="return doSubmit()" action="./insert" method="post">
			用户名:<input id="username" name="username" type="text" />
			<br/>
			密码:<input id="password" name="password" type="text" />
			<br/>
			<input type="submit"  value="注册" >
			<input type="reset" value="重置" >
		</form>
		<span id="errormsg"></span>
	</body>
	<script>
		function doSubmit(){
			var username = document.getElementById("username");
			if(username.value.length>10){
				errormsg.innerHTML = "用户名有"+username.value.length+"位,请不要超过10位";
				return false;
			}
			else{
				var form = document.getElementById("RegistForm");
				form.submit();
			}
		}
	</script>
</html>
  • 前端已经验证了
  • 还有必要在后端再验证一次么?🤔

前后端

  • 前端是堂倌明确地拒绝了客人
    • 不能点蒸熊掌
    • 第一时间在本地就告诉了客人
    • 节省时间和带宽
    • 但是客人可能直接去找初始
    • 强制构造表单并提交

图片描述

  • 后端是厨师
    • 让厨师牢记不能做蒸熊掌
    • 这样就在后厨立下规矩
    • 避免对数据库做不规范操作

总结

  • 这次解决了用户名字符串长度控制问题
    • 后端控制了之后
    • 再在前端先验证
    • 这样前后端都验证
    • 前端负责高效
    • 后端负责保险
  • 但是有的时候密码要求比较高
    • 不但要求有大写小写数字和符号
    • 还要求输入两次比对一下
  • 这怎么做呢?🤔
  • 下次再说!👋