1、JavaEE 项目的三层架构

2、先创建书城需要的数据库和表

drop database if exists book;

create database book;

CREATE TABLE t_user(
id INT PRIMARY KEY auto_increment,
username VARCHAR(20) NOT NULL UNIQUE,
PASSWORD VARCHAR(32) NOT NULL,
email VARCHAR(200)
);

insert into t_user(username,password,email) values(‘admin’,‘admin’,‘admin@aiguigu.com’);
select * from t_user;

3、编写数据库表对应的 JavaBean 对象

public class User {private Integer id;private String username;private String password;private String email;
}

4、编写工具类 JdbcUtils

4.1、导入需要的 jar包(数据库和连接池需要)






导入完成之后:

4.2 在 src 源码目录编写 jdbc.properties 属性配置文件

4.3 编写 JdbcUtils 工具类

package com.utils;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;public class JdbcUtils {private static DruidDataSource dataSource;static {try {Properties  properties = new Properties();//读取 jdbc.properties 属性配置文件InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");//从流中加载数据properties.load(inputStream);//创建 数据库 连接池dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}/** 获取数据库连接池中的连接*@return 如果返回null,说明获取连接失败<br/>有值就是获取连接成功 */public static Connection getConnection(){Connection conn = null;try {conn = dataSource.getConnection();} catch (SQLException e) {e.printStackTrace();}return conn;}/** 关闭连接,放回数据库连接池* */public static void close(Connection conn){if (conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}

4.4、Jdbc测试

package com.aiguigu.test;import com.utils.JdbcUtils;
import org.junit.Test;import java.sql.Connection;public class JdbcUtilsTest {@Testpublic void testJdbcUtils(){for (int i = 0; i < 100; i++) {Connection connection = JdbcUtils.getConnection();System.out.println(connection);JdbcUtils.close(connection);}}
}

5、编写BaseDao(这一块不懂,得补)

package com.aiguigu.dao;import com.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;import java.awt.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;public abstract class BaseDao {//使用DbUtils 操作数据库private QueryRunner queryRunner = new QueryRunner();/*** update() 方法用来执行:Insert\Update\Delete* @return 如果返回 -1 ,说明执行失败<br/>返回其他表示影响的行数*/public int update(String sql,Object ... args){Connection connection = JdbcUtils.getConnection();try {queryRunner.update(connection,sql,args);} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils.close(connection);}return -1;}/*** 查询返回一个 javaBean 的 sql 语句* @param type 返回的对象类型* @param sql  执行的sql语句* @param args sql对应的参数值* @param <T>  返回的类型的泛型*/public <T> T queryForOne(Class<T> type,String sql,Object ... args){Connection con = JdbcUtils.getConnection();try {return queryRunner.query(con,sql,new BeanHandler<T>(type),args);} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils.close(con);}return null;}/*** 查询返回多个 javaBean 的 sql 语句* @param type 返回的对象类型* @param sql  执行的sql语句* @param args sql对应的参数值* @param <T>  返回的类型的泛型*/public <T> List<T>  queryForList(Class<T> type, String sql, Object ... args){Connection con = JdbcUtils.getConnection();try {return queryRunner.query(con,sql,new BeanListHandler<T>(type),args);} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils.close(con);}return null;}/*** 执行返回一行一列的sql语句* @param sql 执行的sql语句* @param args sql对应的参数值*/public Object queryForSingleValue(String sql,Object ... args){Connection conn = JdbcUtils.getConnection();try {return queryRunner.query(conn,sql,new ScalarHandler(),args);} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.close(conn);}return null;}}

6、编写UserDao 和测试

package com.aiguigu.dao;import com.aiguigu.pojo.User;public interface UserDao {/*** 根据用户名查询用户信息* @param username 用户名* @return 如果返回null,说明没有这个用户,反之亦然*/public User queryUserByUsername(String username);/*** 根据用户名和密码查询用户信息* @param username 用户名* @param password 密码* @return 如果返回null,说明没用户名或密码错误,反之亦然*/public User queryUserByUsernameAndPassword(String username,String password);/*** 保存用户信息* @param user* @return 返回-1表示操作失败,其他sql语句影响的行数*/public int saveUser(User user);}
package com.aiguigu.dao.impl;import com.aiguigu.dao.BaseDao;
import com.aiguigu.dao.UserDao;
import com.aiguigu.pojo.User;public class UserDaoImpl extends BaseDao implements UserDao {@Overridepublic User queryUserByUsername(String username) {String sql = "select `id`,`username`,`password`,`email` from t_user where username=?";return queryForOne(User.class,sql,username);}@Overridepublic User queryUserByUsernameAndPassword(String username, String password) {String sql = "select `id`,`username`,`password`,`email` from t_user where username=? and password=?";return queryForOne(User.class,sql,username,password);}@Overridepublic int saveUser(User user) {String sql = "insert into t_user(`username`,`password`,`email`) values(?,?,?)";return update(sql,user.getUsername(),user.getPassword(),user.getEmail());}
}
package com.aiguigu.dao.impl;import com.aiguigu.pojo.User;
import org.junit.Test;import static org.junit.Assert.*;public class UserDaoImplTest {@Testpublic void queryUserByUsername() {UserDaoImpl userDao = new UserDaoImpl();if (userDao.queryUserByUsername("admin") == null){System.out.println("用户名可用");}else {System.out.println("用户名已存在");}}@Testpublic void queryUserByUsernameAndPassword() {UserDaoImpl userDao = new UserDaoImpl();if (userDao.queryUserByUsernameAndPassword("admin","admin") == null){System.out.println("用户名或密码错误,登录失败");}else {System.out.println("查询成功");}}@Testpublic void saveUser() {UserDaoImpl userDao = new UserDaoImpl();System.out.println( userDao.saveUser(new User(null,"qweg168", "12qw6", "qwe168@qq.com")) );}
}

编写UserService 和测试

UserService接口:

package com.aiguigu.service;import com.aiguigu.pojo.User;public interface UserService {/*** 注册用户* @param  user* */public void registUser(User user);/*** 登录* @param user* @return 如果返回 null,说明登录失败,返回有值,是登录 成功*/public User login(User user);/*** 检查 用户名是否可用* @param username* @return 返回true表示用户名已存在,返回false表示用户名可用*/public boolean existUsername(String username);
}

UserServiceImpl:

package com.aiguigu.service.impl;import com.aiguigu.dao.UserDao;
import com.aiguigu.dao.impl.UserDaoImpl;
import com.aiguigu.pojo.User;
import com.aiguigu.service.UserService;
import com.aiguigu.test.UserDaoImplTest;public class UserServiceImpl implements UserService {private UserDao useDao = new UserDaoImpl();@Overridepublic void registUser(User user) {useDao.saveUser(user);}@Overridepublic User login(User user) {return useDao.queryUserByUsernameAndPassword(user.getUsername(),user.getPassword());}@Overridepublic boolean existUsername(String username) {if (useDao.queryUserByUsername(username) == null){// 等于null,说明没查到,没查到表示可用return false;}return true;}
}

UserServiceImplTest:

package com.aiguigu.test;import com.aiguigu.dao.impl.UserDaoImpl;
import com.aiguigu.pojo.User;
import com.aiguigu.service.UserService;
import com.aiguigu.service.impl.UserServiceImpl;
import org.junit.Test;import static org.junit.Assert.*;public class UserServiceImplTest {UserService userService = new UserServiceImpl();@Testpublic void registUser() {userService.registUser(new User(null,"qwe1234","qwe123",null));}@Testpublic void login() {System.out.println(userService.login(new  User(null,"qwe1234","qwe1235",null)));}@Testpublic void existUsername() {if (userService.existUsername("qwe1234")){System.out.println("用户名已存在!");}else {System.out.println("用户名可用!");}}}

7、编写 web 层

7.1、实现用户注册的功能

分析:

编写 RegistServlet:

package com.aiguigu.web;import com.aiguigu.dao.UserDao;
import com.aiguigu.pojo.User;
import com.aiguigu.service.UserService;
import com.aiguigu.service.impl.UserServiceImpl;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class RegistServlet extends HttpServlet {UserService userService = new UserServiceImpl();@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.获取请求参数String username = req.getParameter("username");String password = req.getParameter("password");String email = req.getParameter("email");String code = req.getParameter("code");//2.检查 验证码是否正确   写死,要求验证码为:abcdeif ("abcde".equalsIgnoreCase(code)){//equalsIgnoreCase:比较时忽略大小写//正确//3.检查 用户名是否可用if (userService.existUsername(username)){//不可用System.out.println("用户名[" + username + "]已存在");//跳回注册页面req.getRequestDispatcher("/pages/user/regist.html").forward(req,resp);}else {//可用//调用Service 保存到数据库userService.registUser(new User(null,username,password,email));//跳到注册成功页面 regist_success.htmlreq.getRequestDispatcher("/pages/user/regist_success.html").forward(req,resp);}}else {System.out.println("验证码["+ code + "]错误");req.getRequestDispatcher("/pages/user/regist.html").forward(req,resp);}}
}

在 前端的 regist.html 页面加上 base相对路径

 <!--写 base 标签,永远固定相对路径跳转  的结果--><base href="http://localhost:8080/book/">


修改 regist.html 里面的资源路径:

在页面运行按 F12 通过 网络来测试,有 报红的 都要修改路径

修改注册表单的提交 路径 并添加 post 方法 将表单信息发送给 servlet服务器:

验证码输入框 添加一个 name属性 便于服务器获取(这个以后优化):

后端接收参数:

对接收到的参数进行以下操作:

 //2.检查 验证码是否正确   写死,要求验证码为:abcdeif ("abcde".equalsIgnoreCase(code)){//equalsIgnoreCase:比较时忽略大小写//正确//3.检查 用户名是否可用if (userService.existUsername(username)){//不可用System.out.println("用户名[" + username + "]已存在");//跳回注册页面req.getRequestDispatcher("/pages/user/regist.html").forward(req,resp);}else {//可用//调用Service 保存到数据库userService.registUser(new User(null,username,password,email));//跳到注册成功页面 regist_success.htmlreq.getRequestDispatcher("/pages/user/regist_success.html").forward(req,resp);}}else {System.out.println("验证码["+ code + "]错误");req.getRequestDispatcher("/pages/user/regist.html").forward(req,resp);}

到 regist,html 进行测试

02尚硅谷书城案例-用户的注册相关推荐

  1. JavaWeb 尚硅谷书城项目

    书城项目第一阶段:表单验证 需求:         验证用户名:必须由字母,数字下划线组成,并且长度为 5 到 12 位         验证密码:必须由字母,数字下划线组成,并且长度为 5 到 12 ...

  2. Java web 2022跟学尚硅谷书城项目完整开源分享

    Java web 2022跟学尚硅谷书城项目完整开源分享 项目介绍 项目类图 sql建表和添加数据 界面展示 用户登录界面 用户注册界面 首页 添加购物车 我的购物车 我的订单 功能说明 项目介绍 跟 ...

  3. 02尚硅谷宋红康Java视频笔记之语言概述

    Java基础是学习JavaEE.大数据.Android开发 的基石! I Java基础知识图解 Java基础课程体系 1.1 软件开发介绍 软件开发 软件,即一系列按照特定顺序组织的计算机数据和指令的 ...

  4. 尚硅谷todolist案例

    vue todolist案例 1 拆分组件 一共拆分为4个组件 TodoHeader TodoItem TodoList TodoFooter item是list的子组件 2 组件化编码流程 实现静态 ...

  5. hive尚硅谷实战案例统计youtube视频热度

    hive视频热度统计案例 文章目录 hive视频热度统计案例 背景及需求描述 项目的完成 1. 数据清洗 (1) maven依赖 (2)ETLUtils-处理具体的数据清洗逻辑 (3)ETLMappe ...

  6. 尚硅谷github案例

    引入第三方bootstrap,要在public文件下的index.html中用link引入(且用相同的BAS_URl),如果在App.vue中引入会出现错误. Search组件(搜索栏) 引入axio ...

  7. 尚硅谷2022 javaweb网上书城

    想培训和学习的多多关注尚硅谷 尚硅谷官网 尚硅谷2022 javaweb网上书城视频 文档连接 代码地址-请看book-dev分支 环境准备 安装jdk1.8 安装idea 下载tomcat 登陆设置 ...

  8. 尚硅谷大数据技术Spark教程-笔记09【SparkStreaming(概念、入门、DStream入门、案例实操、总结)】

    尚硅谷大数据技术-教程-学习路线-笔记汇总表[课程资料下载] 视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[SparkCore ...

  9. Java web 2022跟学尚硅谷(十) 后端基础 书城

    Java web 2022跟学尚硅谷十 后端基础 书城 验证码kaptcha和缓存cookie 简单了解cookie 步骤 简单创建cookie的样例 代码 CookieServlet01 hello ...

最新文章

  1. mybatis mysql crud_Mybatis的CRUD操作
  2. it程序员刷题 面试 中文网站收集
  3. Openfire3.9.3源代码导入eclipse中开发配置指南
  4. 跟我一起学.NetCore之路由的最佳实现
  5. 计算机网络课程设计之简单 Web Server 程序的设计与实现
  6. Kubernetes集群部署及简单命令行操作
  7. ULN2003的使用
  8. GRUB4DOS使用大全
  9. php生成word,并下载
  10. llvm greedy register allocator
  11. android 屏幕截图检测,Android 屏幕截图
  12. HEVC/H.265编码HM码率控制
  13. 用三剑客取ip地址的方法(请忽略脱裤子放屁的~)
  14. VS2015远程调试
  15. 以太网扫盲(一)各种网络总线 mii总线,mdio总线介绍
  16. 中国直接针对消费者的疾病风险和健康DNA测试行业市场供需与战略研究报告
  17. 三种网站设计思维促进客户成交
  18. 谁会是移动平台的最后赢家
  19. Windows 启用 IIS
  20. (0102)iOS开发之iPad分屏多任务: Slide Over Split View

热门文章

  1. 新必应 new bing【NB】这不比知云翻译香
  2. mcc_generated_files/eusart1.c:208:: error: (1098) conflicting declarations for variable “
  3. 存储结构和磁盘划分(基于RedHat7)
  4. CityEngine2018正版免费申请试用教程
  5. ArcGIS Pro试用许可申请
  6. Python免安装环境(Windows)
  7. Facebook投资者Peter Thiel—一个不折不扣的“魔戒”迷
  8. 微软跳上OpenID Bandwagon
  9. SSL证书怎么部署,SSL证书需要怎么安装你知道吗?
  10. 【每周一个小技能】WSA 安装