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.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.注册后台处理逻辑编写相关推荐
- 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(一)后台控制逻辑代码部分...
我也是本着善意把自己的代码结构分享给大家,欢迎大家用批评指点.首先我为什么把这个标题写为恶人,因为我很喜欢招惹别人,因为喜欢跟别人交流,喜欢指出别人的缺点,偷偷学习别人的优点,所以大家都会反感我,因为 ...
- 使用java实现类似nc的功能_在FANUC机器人中使用后台运行逻辑实现PLC功能
后台逻辑概念 PLC是工业自动化领域常用的一种逻辑控制产品,以其性能稳定.兼容性好.可扩展性强.体积小.性价比高而被广泛应用.在机器人产品中,为了降低系统集成的难度,很多机器人产品自身也会在控制系统中 ...
- 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(一)后台控制逻辑代码部分
我也是本着善意把自己的代码结构分享给大家,欢迎大家用批评指点.首先我为什么把这个标题写为恶人,因为我很喜欢招惹别人,因为喜欢跟别人交流,喜欢指出别人的缺点,偷偷学习别人的优点,所以大家都会反感我,因为 ...
- 一个比较完整的登陆和注册后台
数据库类 conn.php View Code <?phpclass opmysql{private $host = 'localhost'; //服务器地址 private $name = ' ...
- 登录、注册相关业务逻辑(模拟登录、注册)-H5本地存储
登录相关业务逻辑(模拟登录.注册) 关于H5本地存储的内容,登录.注册案例可以很好的运用到相关的内容,此案例掌握的熟练,就可以很好的理解本地存储的内容啦!本文就详细的讲解了登录注册相关的业务逻辑.以及 ...
- ET框架-16 ET框架登录账号请求逻辑编写(1)
文章目录 1. 准备事项 1.1 通过GitClone去拉取ET-EUI项目 1.2 MongoDB正确安装 1.3 Robo 3T 数据库可视化软件 2.数据库相关 2.1 游戏区服 2.2 创建自 ...
- 注册登陆业务逻辑实现
注册 前端 ajax发起请求 ->调用注册接口 后端 设置路由 <-> controller层 后端 注册接口的逻辑实现 a. database连接数据库b. model层负责数据库 ...
- FPGA udp纯逻辑编写,Xilinx ise14.7平台,工程验证千兆无丢包 加200k128通道采集
FPGA udp纯逻辑编写,Xilinx ise14.7平台,工程验证千兆无丢包 加200k128通道采集 ID:221000630637522274gaoisgod
- @芥末的糖----------《管理系统后台架构逻辑》
mongo逻辑 //1.创建mongoose对象链接数据库,并暴露 var mongoose = require('mongoose') mongoose.connect('mongodb://loc ...
- Robotstudio软件:机床上下料工作站机器人主逻辑编写与仿真运行
本文已经首发在个人微信公众号:工业机器人仿真与编程(微信号:IndRobSim),欢迎关注! 前一期介绍了机器人数控机床上下料例行程序的编写,但是,也只是编写了机器人的运动程序,并没有进行信号逻辑控制 ...
最新文章
- 深度|全面了解一下这个世界上最奇葩的公司:Google!
- js 获取地址栏参数
- 关于文件的默认读取和保存路径(转)
- VS2008显示代码行号
- linux mysql设置编码_linux下修改mysql编码
- mysql对所有列的数据进行修改6_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)...
- docker下载tomact
- spark submit参数及调优
- 八、栈的操作、栈空间
- rocketmq python消息堆积_编写shell脚本监控rocketMQ消息堆积并推送钉钉
- Linux硬链接和符号链接(转)
- 河南计算机基础知识会考,2011河南事业单位备考计算机基础知识试题(含答案 )...
- 【老骥伏枥-狗年大礼包】嵌入式linux逆向工程,手把手教你作黑Q-第二讲
- PHP TCPDF导出订单合同并且每页加一个印章
- 如何快速删除某几页的页眉页脚
- 不想周末被工作提醒打扰?你需要这个手机便签消息免打扰设置
- Murata村田高压电容的国产替代--赫威斯电容(HVC Capacitor)
- RCNN系列发展历程
- 交通领域主要SCI期刊——2017年JCR
- vue 路由懒加载,使用 import 无法处理