整体框架原理
实现过程:
用户访问注册页面时,填好注册信息之后点击提交按钮时会将表单提交信息给RegistServlet.java进行后台处理,后台在执行完逻辑之后会把执行结果返回到jsp页面。
请求方式:
POST请求
<!-- action:请求的路径 ,method:请求方式 --> <form action="/RegistServlet" method="POST">
细节处理:
我们在 jsp页面申请一个块结构来显示后台的验证信息,位置位于表单上方
<!-- 如果出现错误将在表单顶部显示 --> <td colspan="2" style="text-align:center;color:green"> <%=request.getAttribute("errMsg")==null?"":request.getAttribute("errMsg") %> </td>
后台逻辑:
后台服务器接受到表单请求之后,会执行验证逻辑,将符合要求的的用户信息保存到后台数据库中,不符合逻辑的的信息将不会保存,并将错误返回到客户端 jsp页面。
导包情况:
需要导入两个jar包,进行数据库操作的时候需要。
代码实现及演示结果
jsp注册页面及后台服务器代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML> <html> <head> <title>欢迎注册BinGou</title> <meta http-equiv="Content-type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" href="css/regist.css"/> </head> <body> <!-- action:请求的路径 ,method:请求方式 --> <form action="/RegistServlet" method="POST"> <h1>欢迎注册BinGou</h1> <table> <tr><!-- 如果出现错误将在表单顶部显示 --> <td colspan="2" style="text-align:center;color:green"> <%=request.getAttribute("errMsg")==null?"":request.getAttribute("errMsg") %> </td> </tr> <tr> <td class="tds">用户名:</td> <td> <input type="text" name="username" /> </td> </tr> <tr> <td class="tds">密码:</td> <td> <input type="password" name="password" /> </td> </tr> <tr> <td class="tds">确认密码:</td> <td> <input type="password" name="password2"/> </td> </tr> <tr> <td class="tds">昵称:</td> <td> <input type="text" name="nickname"/> </td> </tr> <tr> <td class="tds">邮箱:</td> <td> <input type="text" name="email"/> </td> </tr> <tr> <td class="tds">验证码:</td> <td> <input type="text" name="valistr"/> <img src="img/regist/yzm.jpg" width="" height="" alt="" /> </td> </tr> <tr> <td class="sub_td" colspan="2" class="tds"> <input type="submit" value="注册用户"/> </td> </tr> </table> </form> </body> </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package cn.bingou.web; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.bingou.util.JDBCUtils; import cn.bingou.util.WebUtils; public class RegistServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1.请求乱码问题 // 请求乱码-POST请求 req.setCharacterEncoding("utf-8"); // 应答乱码问题 resp.setContentType("text/html;charset=utf-8"); // 2.接收表单参数 String username = req.getParameter("username"); String password = req.getParameter("password"); String password2 = req.getParameter("password2"); String nickname = req.getParameter("nickname"); String email = req.getParameter("email"); String valistr = req.getParameter("valistr"); // 3.验证表单 // 1)非空验证 if(WebUtils.isEmpty(username)){ // 用户名为空验证 // 向request作用域中添加错误提示信息 req.setAttribute("errMsg", "用户名不能为空!"); // 将请求转发给regist.jsp,forward():请求转发 req.getRequestDispatcher("/regist.jsp").forward(req, resp); // 如果用户输入为空,直接返回 return; } if(WebUtils.isEmpty(password)){ // 密码为空验证 req.setAttribute("errMsg", "密码不能为空!"); req.getRequestDispatcher("/regist.jsp").forward(req, resp); return; } if(WebUtils.isEmpty(nickname)){ // 昵称为空验证 req.setAttribute("errMsg", "昵称不能为空!"); req.getRequestDispatcher("/regist.jsp").forward(req, resp); return; } if(WebUtils.isEmpty(email)){ // 邮箱为空验证 req.setAttribute("errMsg", "邮箱不能为空!"); req.getRequestDispatcher("/regist.jsp").forward(req, resp); return; } if(WebUtils.isEmpty(valistr)){ // 验证码为空验证 req.setAttribute("errMsg", "验证码不能为空!"); req.getRequestDispatcher("/regist.jsp").forward(req, resp); return; } // 2)密码一致验证 if(!password.equals(password2)){ // 如果密码与确认密码不一样,则输出错误 req.setAttribute("errMsg", "密码不一致"); req.getRequestDispatcher("/regist.jsp").forward(req, resp); return; } // 3)邮箱格式验证 // abc@123.163.com String reg="^\\w+@\\w+(\\.\\w+)+$"; if(!email.matches(reg)){ req.setAttribute("errMsg", "邮箱格式不符"); req.getRequestDispatcher("/regist.jsp").forward(req, resp); return; } // 4)用户名是否存在 String sql1="select * from user where username=?"; Connection conn = null; PreparedStatement ps = null; ResultSet rs=null; try { conn=JDBCUtils.getConnections(); ps=conn.prepareStatement(sql1); ps.setString(1, username); rs=ps.executeQuery(); while(rs.next()){ // 寻找用户名,直到找到为止 req.setAttribute("errMsg", "用户名已存在"); req.getRequestDispatcher("/regist.jsp").forward(req, resp); return; } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("验证用户名时数据库出现异常:"+e.getMessage()); } finally{ JDBCUtils.close(conn, ps, rs); } // 5)验证码验证 // 4.数据存入数据库 // 验证信息没有问题,将用户提交的注册信息提交到数据库 String sql2="insert into user values(null,?,?,?,?)"; Connection conn2=null; PreparedStatement ps2=null; try { conn2=JDBCUtils.getConnections(); ps2=conn2.prepareStatement(sql2); ps2.setString(1, username); ps2.setString(2, password); ps2.setString(3, nickname); ps2.setString(4, email); ps2.executeUpdate(); int i=ps.executeUpdate(); if(i>0){ // 保存成功-提示成功信息,定时刷新到首页 resp.getWriter().write("<h1 style='text-align:center;color:red'>恭喜您,注册成功!3秒后自动跳转首页</h1>"); // 实现定时刷新 resp.setHeader("refresh", "3;url="+req.getContextPath()+"/index.jsp"); }else{ req.setAttribute("errMsg", "注册出现异常,请稍后重试..."); req.getRequestDispatcher("/regist.jsp").forward(req, resp); return; } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("注册数据出现异常:"+e.getMessage()); } finally{ JDBCUtils.close(conn2, ps2, rs); } } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package cn.bingou.util; public class WebUtils { /** * 验证字符串是否为null或是空格的方法 * @param str 被验证的字符串 * @return true-字符串为null或者trim之后为空串 * false-不为null且trim后不为空串 */ public static boolean isEmpty(String str){ if(str==null || "".equals(str.trim())){ return true; } return false; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package cn.bingou.util; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JDBCUtils { // 获取c3p0数据库连接池对象 private static ComboPooledDataSource ds=new ComboPooledDataSource(); /** * 通过数据库连接池获取一个连接对象 * @return 一个连接对象 或 null; */ public static Connection getConnections(){ Connection conn=null; try { conn=ds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return conn; } /** * 关闭数据库占用的资源 * @param conn * @param ps * @param rs */ public static void close(Connection conn,Statement ps, ResultSet rs){ if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ps!=null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
数据库:
-- 创建库 easymall create database bingou; -- 使用easymall库 use bingou; -- 创建user表 id int,用户名,密码,昵称,邮箱 create table user( id int primary key auto_increment, -- id username varchar(50), -- 用户名 password varchar(50), -- 密码 nickname varchar(50), -- 昵称 email varchar(50) -- 邮箱 ); -- 添加测试数据 insert into user values(null,'admin','123','炒鸡管理员','admin@123.com'); insert into user values(null,'张飞','123','管理员','admin@123.com');
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/bingou</property> <property name="user">root</property> <property name="password">root</property> </default-config> </c3p0-config>
演示过程:
第一步:启动Tomcat服务器和数据库
第二部:访问www.bingou.com
第三步:点击注册
第四步:输入信息注册,此时数据库已经保存了用户注册信息
出现错误:HTTP Status 500 - 注册数据出现异常:No operations allowed after statement closed.
原因: 配置文件路径写错