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.

原因: 配置文件路径写错

原文地址:https://www.cnblogs.com/chuijingjing/p/9695965.html