2020-11-11

书城项目:第2阶段

书城第二阶段——用户注册和登陆

一、实现的功能

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标签:

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

 

 

 

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

 

 

给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