• 3.注册后台处理逻辑编写


    整体框架原理

    实现过程:

    用户访问注册页面时,填好注册信息之后点击提交按钮时会将表单提交信息给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注册页面及后台服务器代码:

    <%@ 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>
    regist.jsp
    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);
        }
    
    }
    RegistServlet.jsp
    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;
        }
    }
    WebUtils.java
    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();
                }
            }
        }
    }
    JDBCUtils.java

    数据库:

    -- 创建库 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.

    原因: 配置文件路径写错

  • 相关阅读:
    Shell脚本实现用户数据导入
    Sping Cloud 微服务框架学习
    Redis学习笔记
    HTML+CSS实现简单三级菜单
    CSS Float浮动所带来的奇怪现象
    CSS如何清除浮动流的多种方案
    ECMAScript/JS 基础知识讲解
    Python的生成器
    Python包的导入说明
    Paramiko模块简单使用
  • 原文地址:https://www.cnblogs.com/chuijingjing/p/9695965.html
Copyright © 2020-2023  润新知