1.创建 JavaEE book 项目

2.导入相关静态资源至webapp 目录下

3.创建数据库

DROP TABLE IF EXISTS book;CREATE DATABASE book;USE 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@guigu.com');SELECT * FROM t_user;

4.编写数据库表需要的 JavaBean 对象

package com.atguigu.pojo;

package com.atguigu.pojo;/** * @author: sjmp1573 * @date: 2022/7/17 17:48 * @description: */public class User {private Integer id;private String username;private String password;private String email;public Integer getId() {return id;}public String getUsername() {return username;}public String getPassword() {return password;}public String getEmail() {return email;}public void setId(Integer id) {this.id = id;}public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}public void setEmail(String email) {this.email = email;}public User() {}public User(Integer id, String username, String password, String email) {this.id = id;this.username = username;this.password = password;this.email = email;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +'}';}}

5.编写DAO持久层

为book 模块添加依赖。



WEB-INF 外部无法访问,可以放 jar包,数据库的配置。

编写 JDBCUtils 工具类

package com.atguigu;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;/** * @author: sjmp1573 * @date: 2022/7/17 21:12 * @description: */public class JdbcUtils {private static DruidDataSource dataSource;static {try {Properties properties = new Properties();InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");properties.load(inputStream);dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}/** * 获取数据库连接池中的连接 * * @return 如果如果返回null, 说明获取连接失败
有值就是获取连接成功 */
public static Connection getConnection() {Connection conn = null;try {conn = dataSource.getConnection();} catch (SQLException e) {e.printStackTrace();}return conn;}/** * 关闭连接,放回数据库 * @param conn * */public static void close(Connection conn) {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}

编写 jdbc.properties配置文件

src/main/resources/jdbc.properties

username=rootpassword=***********url=jdbc:mysql://localhost:3306/bookdriverClassName=com.mysql.jdbc.DriverinitialSize=5maxActive=10

6.编写BaseDAO

package com.atguigu.dao.impl;import com.atguigu.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.sql.Connection;import java.sql.SQLException;import java.util.List;/** * @author: sjmp1573 * @date: 2022/7/17 22:00 * @description: */public abstract class BaseDao {private QueryRunner queryRunner = new QueryRunner();/** * update() 方法用来执行:Insert\Update\Delete语句 * * @return 如果返回-1,说明执行失败
返回其他表示影响的行数 */
public int update(String sql, Object args) {Connection connection = JdbcUtils.getConnection();try {return 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 返回的类型的泛型 * @return */public <T> T queryForOne(Class<T> type, String sql, Object... args) {Connection conn = JdbcUtils.getConnection();try {return queryRunner.query(conn, sql, new BeanHandler<T>(type), args);} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.close(conn);}return null;}/** * 查询返回多个javaBean的sql语句 * * @param type 返回的对象类型 * @param sql执行的sql语句 * @param args sql对应的参数值 * @param 返回的类型的泛型 * @return */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对应的参数值 * @return */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;}}

7. 编写Dao层( UserDaoImpl 和 UserDao)

package com.atguigu.dao.impl;import com.atguigu.dao.UserDao;import com.atguigu.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());}}

然后测试

8.编写Service层(UserServiceImpl 和 UserService)

package com.atguigu.service.impl;import com.atguigu.dao.UserDao;import com.atguigu.dao.impl.UserDaoImpl;import com.atguigu.pojo.User;import com.atguigu.service.UserService;/** * @author: sjmp1573 * @date: 2022/7/17 23:03 * @description: */public class UserServiceImpl implements UserService {UserDao userDao = new UserDaoImpl();@Overridepublic boolean registerUser(User user) {int i = userDao.saveUser(user);return i == 1;}@Overridepublic boolean login(User user) {User user1 = userDao.queryUserByUsernameAndPassword(user.getUsername(), user.getPassword());return user1 != null;}@Overridepublic boolean exitsUsername(String username) {User user = userDao.queryUserByUsername(username);return user != null;}}

9.编写用户注册功能(web层)

package com.atguigu.web;import com.atguigu.pojo.User;import com.atguigu.service.UserService;import com.atguigu.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;/** * @author: sjmp1573 * @date: 2022/7/17 23:35 * @description: */public class RegisterServlet extends HttpServlet {private 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.检查验证码是否正确if ("abcde".equalsIgnoreCase(code)) {//3.检查用户名是否可用if (userService.exitsUsername(username)) {System.out.println("用户名[" + username + "]已存在!");req.getRequestDispatcher("/pages/user/regist.html").forward(req, resp);} else {userService.registerUser(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);}}}