书城第二阶段——用户注册和登陆
一、实现的功能
1、登录页面

2、注册页面

二、JavaEE 项目的三层架构

分层的目的是为了解耦。解耦就是为了降低代码的耦合度。方便项目后期的维护和升级。
1、idea中提供书城项目需要的包结构
web层 com.zixue.web/servlet/controller
service层 com.zixue.service service接口包
com.zixue.service.impl service接口实现类
dao持久层 com.zixue.dao dao接口包
com.zixue.dao.impl dao接口实现类
实体bean对象 com.zixue.pojo/entity/domain/bean JavaBean类
测试包 com.zixue.test/junit
工具类 com.zixue.utils

2、创建书城需要的数据库和表
DROP DATABASE 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@qq.com');SELECT * FROM t_user;
3、编写数据库表对应的 JavaBean 对象

User.java如下:
package com.zixue.pojo;/** * @author Mr Guo * @create 2020-11-11 10:03 */public class User { private Integer id; private String username; private String password; private String 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; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + '}'; }}
4、编写工具类 JdbcUtils
① 导入数据库和数据库连接池需要的jar包

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

③ 编写 JdbcUtils 工具类
package com.zixue.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.Map;import java.util.Properties;/** * @author Mr Guo * @create 2020-11-11 10:26 */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,说明获取连接失败;有值就是获取成功 */ public static Connection getConnection(){ Connection conn = null; try { conn = dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return conn; } /** * 关闭连接,放回数据库连接池 * @param connection */ public static void close(Connection connection){ if (connection != null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }}
④ JdbcUtils测试类
package com.zixue.test;import com.zixue.utils.JdbcUtils;import org.junit.Test;import java.sql.Connection;/** * @author Mr Guo * @create 2020-11-11 10:46 */public class JdbcUtilsTest { @Test public void testJdbcUtils(){ for (int i = 0; i < 100; i++) { Connection conn = JdbcUtils.getConnection(); System.out.println(conn); JdbcUtils.close(conn); } }}效果如下:

5、编写 BaseDao
① 导入DBUtils的jar包

②编写BaseDao
package com.zixue.dao.impl;import com.zixue.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.sql.Connection;import java.sql.SQLException;import java.util.List;/** * @author Mr Guo * @create 2020-11-11 11:01 */public abstract class BaseDao { //使用DbUtils来操作数据库 private QueryRunner queryRunner = new QueryRunner(); /** * update()方法用来执行:insert、delete、update语句 * @param sql 执行的sql语句 * @param args sql对应的参数 * @return 如果返回-1,说明执行失败<br/>其它表示受影响的行数 */ public int update(String sql, Object ... args){ Connection conn = JdbcUtils.getConnection(); try { return queryRunner.update(conn, sql, args); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.close(conn); } return -1; } /** * 查询返回一个JavaBean对象 * @param type 返回对象类型 * @param sql 执行的sql语句 * @param args sql对应的参数 * @param <T> 返回的类型的泛型 * @return 如果返回null,说明查询失败<br/>其它表示查询到的对象 */ 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对象的集合 * @param type 返回对象类型 * @param sql 执行的sql语句 * @param args sql对应的参数 * @param <T> 返回的类型的泛型 * @return 如果返回null,说明查询失败<br/>其它表示查询到的对象的集合 */ public <T> List<T> queryForList(Class<T> type, String sql, Object ... args){ Connection conn = JdbcUtils.getConnection(); try { return queryRunner.query(conn, sql, new BeanListHandler<T>(type), args); } catch (SQLException e) { e.printStackTrace(); }finally { JdbcUtils.close(conn); } return null; } /** * 执行返回一行一列的sql语句 * @param sql 执行的sql语句 * @param args sql对应的参数 * @return 如果返回nul,查询失败<br/>其它查询成功 */ public Object queryForSingleOne(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 和测试
UserDao接口:
package com.zixue.dao;import com.zixue.pojo.User;/** * @author Mr Guo * @create 2020-11-11 11:31 */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表示操作失败,其它是受影响的行数 */ public int saveUser(User user);}UserDaoImpl实现类:
package com.zixue.dao.impl;import com.zixue.dao.UserDao;import com.zixue.pojo.User;/** * @author Mr Guo * @create 2020-11-11 11:37 */public class UserDaoImpl extends BaseDao implements UserDao { @Override public User queryUserByUsername(String username) { String sql = "select `id`, `username`, `password`, `email` from t_user where username = ?"; return queryForOne(User.class, sql, username); } @Override public 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); } @Override public int saveUser(User user) { String sql = "insert into t_user(`username`,`password`,`email`) values(?,?,?)"; return update(sql, user.getUsername(), user.getPassword(), user.getEmail()); }}UserDaoTest测试类:
package com.zixue.test;import com.sun.media.sound.SoftTuning;import com.zixue.dao.UserDao;import com.zixue.dao.impl.UserDaoImpl;import com.zixue.pojo.User;import org.junit.Test;import static org.junit.Assert.*;/** * @author Mr Guo * @create 2020-11-11 11:44 */public class UserDaoTest { private UserDao userDao = new UserDaoImpl(); @Test public void queryUserByUsername() { if (userDao.queryUserByUsername("admin") == null){ System.out.println("用户名可用"); }else{ System.out.println("用户名已存在"); } } @Test public void queryUserByUsernameAndPassword() { if (userDao.queryUserByUsernameAndPassword("admin", "admin") == null){ System.out.println("用户名或密码错误"); }else{ System.out.println("登录成功"); } } @Test public void saveUser() { System.out.println(userDao.saveUser(new User(null, "wzg", "123456", "wzg@qq.com"))); }}
7、编写 UserService 和测试
UserService接口:
package com.zixue.service;import com.zixue.pojo.User;/** * @author Mr Guo * @create 2020-11-11 12:02 */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 existsUsername(String username);}UserServiceImpl接口实现类:
package com.zixue.service.impl;import com.zixue.dao.UserDao;import com.zixue.dao.impl.UserDaoImpl;import com.zixue.pojo.User;import com.zixue.service.UserService;/** * @author Mr Guo * @create 2020-11-11 12:07 */public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override public void registUser(User user) { userDao.saveUser(user); } @Override public User login(User user) { return userDao.queryUserByUsernameAndPassword(user.getUsername(), user.getPassword()); } @Override public boolean existsUsername(String username) { if(userDao.queryUserByUsername(username) == null){ return false; } return true; }}UserServiceTest测试类:
package com.zixue.test;import com.zixue.pojo.User;import com.zixue.service.UserService;import com.zixue.service.impl.UserServiceImpl;import org.junit.Test;import static org.junit.Assert.*;/** * @author Mr Guo * @create 2020-11-11 12:13 */public class UserServiceTest { UserService userService = new UserServiceImpl(); @Test public void registUser() { userService.registUser(new User(null, "bbj168", "666666", "bbj168@qq.com")); } @Test public void login() { System.out.println(userService.login(new User(null, "admin", "admin", "admin@qq.com"))); } @Test public void existsUsername() { if(userService.existsUsername("admin444")){ System.out.println("用户名已存在"); }else{ System.out.println("用户名可用"); } }}
8、编写 web 层
实现用户注册的功能:
① 图解用户注册的流程

② 修改 regist.html 和 regist_success.html 页面
给regist.html页面添加base标签:




修改注册表单的提交地址和请求方式:

给regist_success.html页面添加base标签:

修改 base 标签对页面中所有相对路径的影响(浏览器 F12,哪个报红,改哪个):


③ 编写 RegistServlet 程序
package com.zixue.web;import com.zixue.pojo.User;import com.zixue.service.UserService;import com.zixue.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 Mr Guo * @create 2020-11-11 13:25 */public class RegistServlet extends HttpServlet { UserService userService = new UserServiceImpl(); @Override protected 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.检查验证码是否正确 === 写死:abcde if ("abcde".equalsIgnoreCase(code)){ //检查用户名是否可用 if (userService.existsUsername(username)){ //用户名不可用 System.out.println("用户名["+ username +"]已存在"); //跳回注册页面 req.getRequestDispatcher("/pages/user/regist.html").forward(req, resp); }else{ //用户名可用 //调用service保存到数据库 userService.registUser(new User(null, username, password, email)); //跳转到注册成功页面 req.getRequestDispatcher("/pages/user/regist_success.html").forward(req, resp); } }else{ System.out.println("验证码["+ code +"]错误"); //跳回注册页面 req.getRequestDispatcher("/pages/user/regist.html").forward(req, resp); } }
9、IDEA 中 Debug 调试的使用
9.1、Debug 调试代码,首先需要两个元素:断点 + Debug 启动服务器
① 断点,只需要在代码需要停的行的左边上单击,就可以添加和取消
② Debug 启动 Tomcat 运行代码:

9.2、测试工具栏:

:让代码向下执行一行。
:可以进入当前方法体内(自己写的代码,非框架源码)
:跳到当前方法体外。
:强制进入当前方法体内
:停到当前光标所在行,相当于临时断点。
9.3、变量窗口
变量窗口:它可以查看当前方法范围内所有有效的变量。
9.4、方法调用栈窗口
①方法调用栈可以查看当前线程有哪些方法调用信息
②下面的调用上一行的方法

9.5、其他常用调试相关按钮:

10、用户登录功能的实现
10.1、图解用户登录

10.2、修改 login.html 页面和 login_success.html 页面
10.2.1、添加base标签

10.2.2、修改 base 标签对页面中所有相对路径的影响(浏览器 F12,哪个报红,改哪个)


10.2.3、修改 login.html 表单的提交地址和请求方式

10.3、编写LoginServlet程序
package com.zixue.web;import com.zixue.pojo.User;import com.zixue.service.UserService;import com.zixue.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 Mr Guo * @create 2020-11-11 15:23 */public class LoginServlet extends HttpServlet { private UserService userService = new UserServiceImpl(); @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.获取请求的参数 String username = req.getParameter("username"); String password = req.getParameter("password"); //2.调用UserService.login()处理登录业务 User loginUser = userService.login(new User(null, username, password, null)); //如果登录null,说明登录失败 if (loginUser == null){ //跳回登录页面 req.getRequestDispatcher("/pages/user/login.html").forward(req, resp); }else{ //登录成功,跳到登录成功页面 req.getRequestDispatcher("/pages/user/login_success.html").forward(req, resp); } }}
原文转载:http://www.shaoqun.com/a/489796.html
c88:https://www.ikjzd.com/w/1017
upc:https://www.ikjzd.com/w/111
tenso:https://www.ikjzd.com/w/1552
书城第二阶段——用户注册和登陆一、实现的功能1、登录页面2、注册页面二、JavaEE项目的三层架构 分层的目的是为了解耦。解耦就是为了降低代码的耦合度。方便项目后期的维护和升级。1、idea中提供书城项目需要的包结构 web层 com.zixue.web/servlet/controller service层 com.zixue.service serv
转运中国:https://www.ikjzd.com/w/1549
大森林:https://www.ikjzd.com/w/2268
厦门野山谷生态乐园什么时候去最合适呢?:http://tour.shaoqun.com/a/5471.html
肯尼亚旅行玩什么:http://tour.shaoqun.com/a/18255.html
广西盘阳河美吗?:http://tour.shaoqun.com/a/5852.html
No comments:
Post a Comment