整体框架原理

实现过程:

用户访问注册页面时,填好注册信息之后点击提交按钮时会将表单提交信息给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.comString 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

3.注册后台处理逻辑编写相关推荐

  1. 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(一)后台控制逻辑代码部分...

    我也是本着善意把自己的代码结构分享给大家,欢迎大家用批评指点.首先我为什么把这个标题写为恶人,因为我很喜欢招惹别人,因为喜欢跟别人交流,喜欢指出别人的缺点,偷偷学习别人的优点,所以大家都会反感我,因为 ...

  2. 使用java实现类似nc的功能_在FANUC机器人中使用后台运行逻辑实现PLC功能

    后台逻辑概念 PLC是工业自动化领域常用的一种逻辑控制产品,以其性能稳定.兼容性好.可扩展性强.体积小.性价比高而被广泛应用.在机器人产品中,为了降低系统集成的难度,很多机器人产品自身也会在控制系统中 ...

  3. 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(一)后台控制逻辑代码部分

    我也是本着善意把自己的代码结构分享给大家,欢迎大家用批评指点.首先我为什么把这个标题写为恶人,因为我很喜欢招惹别人,因为喜欢跟别人交流,喜欢指出别人的缺点,偷偷学习别人的优点,所以大家都会反感我,因为 ...

  4. 一个比较完整的登陆和注册后台

    数据库类 conn.php View Code <?phpclass opmysql{private $host = 'localhost'; //服务器地址 private $name = ' ...

  5. 登录、注册相关业务逻辑(模拟登录、注册)-H5本地存储

    登录相关业务逻辑(模拟登录.注册) 关于H5本地存储的内容,登录.注册案例可以很好的运用到相关的内容,此案例掌握的熟练,就可以很好的理解本地存储的内容啦!本文就详细的讲解了登录注册相关的业务逻辑.以及 ...

  6. ET框架-16 ET框架登录账号请求逻辑编写(1)

    文章目录 1. 准备事项 1.1 通过GitClone去拉取ET-EUI项目 1.2 MongoDB正确安装 1.3 Robo 3T 数据库可视化软件 2.数据库相关 2.1 游戏区服 2.2 创建自 ...

  7. 注册登陆业务逻辑实现

    注册 前端 ajax发起请求 ->调用注册接口 后端 设置路由 <-> controller层 后端 注册接口的逻辑实现 a. database连接数据库b. model层负责数据库 ...

  8. FPGA udp纯逻辑编写,Xilinx ise14.7平台,工程验证千兆无丢包 加200k128通道采集

    FPGA udp纯逻辑编写,Xilinx ise14.7平台,工程验证千兆无丢包 加200k128通道采集 ID:221000630637522274gaoisgod

  9. @芥末的糖----------《管理系统后台架构逻辑》

    mongo逻辑 //1.创建mongoose对象链接数据库,并暴露 var mongoose = require('mongoose') mongoose.connect('mongodb://loc ...

  10. Robotstudio软件:机床上下料工作站机器人主逻辑编写与仿真运行

    本文已经首发在个人微信公众号:工业机器人仿真与编程(微信号:IndRobSim),欢迎关注! 前一期介绍了机器人数控机床上下料例行程序的编写,但是,也只是编写了机器人的运动程序,并没有进行信号逻辑控制 ...

最新文章

  1. 深度|全面了解一下这个世界上最奇葩的公司:Google!
  2. js 获取地址栏参数
  3. 关于文件的默认读取和保存路径(转)
  4. VS2008显示代码行号
  5. linux mysql设置编码_linux下修改mysql编码
  6. mysql对所有列的数据进行修改6_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)...
  7. docker下载tomact
  8. spark submit参数及调优
  9. 八、栈的操作、栈空间
  10. rocketmq python消息堆积_编写shell脚本监控rocketMQ消息堆积并推送钉钉
  11. Linux硬链接和符号链接(转)
  12. 河南计算机基础知识会考,2011河南事业单位备考计算机基础知识试题(含答案 )...
  13. 【老骥伏枥-狗年大礼包】嵌入式linux逆向工程,手把手教你作黑Q-第二讲
  14. PHP TCPDF导出订单合同并且每页加一个印章
  15. 如何快速删除某几页的页眉页脚
  16. 不想周末被工作提醒打扰?你需要这个手机便签消息免打扰设置
  17. Murata村田高压电容的国产替代--赫威斯电容(HVC Capacitor)
  18. RCNN系列发展历程
  19. 交通领域主要SCI期刊——2017年JCR
  20. vue 路由懒加载,使用 import 无法处理

热门文章

  1. CS-Notes 知识清单 备战版
  2. 最完整的Android 安卓开发体系了解一下
  3. 移动端H5页面在ios设备上软键盘顶起页面后隐藏,页面不回弹的解决方案
  4. 微服务拆分之道,几条策略和坚持的原则
  5. [ZT]完全用Linux工作,摈弃Windows
  6. open数据库Timeout expired 错误
  7. 【数据结构】(六)树与二叉树
  8. dell电脑 驱动下载地址
  9. dell 服务器自动更新驱动程序,通过Repository Manager 1.3来管理戴尔驱动程序更新
  10. 数据分析(商业数据分析师理论认知之二商业分析师入门指南)