栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

自写travel网站---01--登录注册功能【保姆级 完全记录了过程里会遇到的bug,并附上解决方法以及资源】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自写travel网站---01--登录注册功能【保姆级 完全记录了过程里会遇到的bug,并附上解决方法以及资源】

1.介绍 1.1JAVA EE 三层架构

1.2数据库准备
Create Table

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL,
  `password` varchar(32) NOT NULL,
  `email` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3








1.3快捷键

查找替换:
ctrl+shift+r
ctrl +r

2 过程 2.1 目录结构

2.2 User
package domain;

import java.util.Objects;


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

  public User(Integer id, String username, String password, String email) {
    this.id = id;
    this.username = username;
    this.password = password;
    this.email = email;
  }

  @Override
  public String toString() {
    return "User{"
        + "id="
        + id
        + ", username='"
        + username
        + '''
        + ", password='"
        + password
        + '''
        + ", email='"
        + email
        + '''
        + '}';
  }

  @Override
  public int hashCode() {
    return Objects.hash(id, username, password, 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;
  }

  public User() {}
}


2.3 JDBCUtils
package utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;


public class JDBCUtils {

  private static DruidDataSource ds;

  
  static {
    // 记得lib目录要add as li
    try {
      // 1.加载配置文件
      Properties pro = new Properties();
      // 使用Classloader加载配置文件,获取字节输入流
      InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
      pro.load(is);
      // 这个异常try catch一下

      // 2.初始化连接池对象
      ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(pro);
      // 写完这个去UserDao完成login方法

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  
  public static DataSource getDataSource() {
    return ds;
  }

  
  public static Connection getConnection() throws Exception {
    Connection conn = null;

    try {
      conn = ds.getConnection();
    } catch (SQLException throwables) {
      throwables.printStackTrace();
    }

    return conn;
  }

  
  public static void close(Connection conn) {
    if (conn != null) {
      //
      try {
        conn.close();
      } catch (SQLException throwables) {
        throwables.printStackTrace();
      }
    }
  }
}

2.3.1 bug 2.3.1.1 空指针异常

原因:是数据库驱动版本问题

解决方法:

IDEA JE项目,将配置文件放在resources目录下

2.3.1.2 bug:query_cache_size

解决方法:

方法1:clean 一下 :没用

方法2 :添加 mysql-connector-java依赖 并下载jar包

修改pom文件dependencies 变成如下

        
            mysql
            mysql-connector-java
            8.0.25
        
        

并去SQL官网下载 mysql-connector-java-8.0.25-bin.jar 并更改project structure内的内容,详见上面部分 【自己sql的版本】

sql官网connector下载

添加到自己工程lib目录下并修改如下:

2.3.1.3 validateConnection false

报错:java.sql.SQLException: validateConnection false

原因:durid 版本过低,与sql-connector版本不匹配

查询后修改pom文件,增加

        
            com.alibaba
            druid
            1.1.22
        

并下载 druid 1.1.22 【根据自己情况二选一】
下载地址

变成如下: 终于连接好了

2.3.2 写完这个写test类



方法1 :


方法2




很奇怪,这里无法get connection
于是换成

解决!

代码如下

package test;

import org.junit.Test;
import utils.JDBCUtils;


public class JdbcUtilsTest {
  @Test
  public void TestJdbcUtils() throws Exception {
    System.out.println(JDBCUtils.getConnection());
  }
}


测试结果如下:

并注意:

2.4 baseDao


package impl;

import com.alibaba.druid.util.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 utils.JDBCUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;


public  abstract class baseDao {

//用 DbUtils操作数据库
  private QueryRunner qr = new QueryRunner();

  
  public int update(String sql, Object... args) throws Exception {
    Connection conn = JDBCUtils.getConnection();
    try {
      return qr.update(conn, sql, args);
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
        JdbcUtils.close(conn);
    }
    return -1;
  }

    
  public  T queryForOne(Classtype,String sql,Object ...args) throws Exception {
      Connection conn = JDBCUtils.getConnection();

      try {
          return qr.query(conn,sql,new BeanHandler(type),args);
      } catch (SQLException throwables) {
          throwables.printStackTrace();
      }finally{
          JdbcUtils.close(conn);
      }
      return null;
  }

    
    public  List queryForList(Classtype, String sql, Object ...args) throws Exception {
        Connection conn = JDBCUtils.getConnection();

        try {
            return qr.query(conn,sql,new BeanListHandler(type),args);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally{
            JdbcUtils.close(conn);
        }
        return null;
    }


    
    public Object queryForSinglevalue(String sql,Object ...args) throws Exception {
        Connection conn = JDBCUtils.getConnection();

        try {
           return  qr.query(conn,sql,new ScalarHandler(),args);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            JdbcUtils.close(conn);
        }
      return null;
    }
}

2.4 UserDao 2.3.1 userDao
package dao;

import domain.User;

public interface UserDao {

  
  public User queryUserByUserName(String username) throws Exception;

  
  public User queryUserNameAndPassword(String username, String Password) throws Exception;
  
  public int saveUser(User user) throws Exception;
}



2.3.2 UserDaoImpl
package dao.impl;

import dao.UserDao;
import domain.User;


public class UserDaoImpl extends baseDao implements UserDao {

  @Override
  public User queryUserByUserName(String username) throws Exception {
    String sql = "select `id`,`username`,`password`,`email` from t_user where username = ?";
    return queryForOne(User.class, sql, username);
  }

  @Override
  public User queryUserNameAndPassword(String username, String password) throws Exception {
    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) throws Exception {
    String sql = "insert into t_user(`username`,`password`,`email`) values(?,?,?)";
    return update(sql, user.getUsername(), user.getPassword(), user.getEmail());
  }
}


2.3.2.1 测试

生成方法:Ctrl+shift+t

package test;

import dao.UserDao;
import dao.impl.UserDaoImpl;
import domain.User;
import org.junit.Test;

public class UserDaoImplTest {
  UserDao userDao = new UserDaoImpl();

  @Test
  public void queryUserByUserName() throws Exception {

    if (userDao.queryUserByUserName("admin") == null) {
      System.out.println("用户名可用");
    } else {
      System.out.println("用户名已存在");
    }
  }

  @Test
  public void queryUserNameAndPassword() throws Exception {
    if (userDao.queryUserNameAndPassword("admin", "admin") == null) {
      System.out.println("用户名或密码错误");
    } else {
      System.out.println("查询成功");
    }
  }

  @Test
  public void saveUser() throws Exception {
    System.out.println(userDao.saveUser(new User(2, "admin1", "123456", "shdgyd@qq.com")));
  }
}

2.3.2.2 测试bug junit 版本过低

junit 版本过低


解决方法:

Junit8下载链接

2.3.2.3 没有查询出结果

sql没存入数据


解决:

INSERT INTO t_user(`username`,`password`,`email`) VALUES('admin ','admin','admin@qq.com');

2.5 Service 2.5.1 UserService
package service;

import domain.User;


public interface UserService {
  
  public void registUser(User user) throws Exception;

  
  public User login(User user) throws Exception;

  
  public boolean existUsername(String username) throws Exception;
}

2.5.2 UserServiceImpl
package service.impl;

import dao.UserDao;
import dao.impl.UserDaoImpl;
import domain.User;
import service.UserService;


public class UserServiceImpl implements UserService {
  // 需要操作数据库
  private UserDao userDao = new UserDaoImpl();

  @Override
  public void registUser(User user) throws Exception {
    userDao.saveUser(user);
  }

  @Override
  public User login(User user) throws Exception {
    return userDao.queryUserNameAndPassword(user.getUsername(), user.getPassword());
  }

  @Override
  public boolean existUsername(String username) throws Exception {

    if (userDao.queryUserByUserName(username) == null) {
      // 等于null表示没查到,也就是可用
      return false;
    }
    return false;
  }
}


2.5.3 test
package test;

import domain.User;
import org.junit.Test;
import service.UserService;
import service.impl.UserServiceImpl;

public class UserServiceTest {

  UserService userService = new UserServiceImpl();

  @Test
  public void registUser() throws Exception {

    userService.registUser(new User(2, "bb2635", "44444", "hsgsyvs@qq.com"));
  }

  @Test
  public void login() throws Exception {
    System.out.println(userService.login(new User(2, "bb2635", "44444", "hsgsyvs@qq.com")));
  }

  @Test
  public void existUsername() throws Exception {
    if (userService.existUsername("bb2635")) {
      System.out.println("用户名已存在");
    } else {
      System.out.println("用户名可用");
    }
  }
}

2.6 RegistServlet 2.6.1 web.xml
    
        RegistServlet
        web.servlet.RegietServlet
    
    
        RegistServlet
        /registServlet
    


!! 项目的开发中用绝对路径(框架阶段) 或 base+相对路径(web阶段)
本阶段用base+相对路径,所以要给需要的页面都加base


启动成功

2.6.2 RegistServlet


package web.servlet;

import domain.User;
import service.UserService;
import 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 {

  private UserService userService = new UserServiceImpl();

  private static final long serialVersionUID = -8085319310579984236L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {}

  @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)) {
      //        3、检查 用户名是否可用
      try {
        if (userService.existUsername(username)) {
          System.out.println("用户名[" + username + "]已存在!");
          //        跳回注册页面
          req.getRequestDispatcher("loginRegist.html").forward(req, resp);
        } else {
          //      可用
          //                调用Service保存到数据库
          userService.registUser(new User(null, username, password, email));
          //
          //        跳到注册成功页面 regist_success.html
          req.getRequestDispatcher("loginRegist_success.html").forward(req, resp);
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    } else {
      System.out.println("验证码[" + code + "]错误");
      req.getRequestDispatcher("loginRegist.html").forward(req, resp);
    }
  }
}

2.4 loginServlet

2.4.1 web.xml
    
        LoginServlet
        web.servlet.LoginServlet
    
    
        LoginServlet
        /loginServlet
    
2.4.2 LoginServlet
package web.servlet;

import domain.User;
import service.UserService;
import 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 LoginServlet extends HttpServlet {

    private static final long serialVersionUID = 6815621054614223781L;
    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");
    // 调用 userService.login()登录处理业务
    User loginUser = null;
    try {
      loginUser = userService.login(new User(null, username, password, null));
    } catch (Exception e) {
      e.printStackTrace();
    }
    // 如果等于null,说明登录 失败!
    if (loginUser == null) {
      //   跳回登录页面
      req.getRequestDispatcher("loginRegist.html").forward(req, resp);
    } else {
      // 登录 成功
      // 跳到成功页面login_success.html
      req.getRequestDispatcher("login_success.html").forward(req, resp);
    }
  }
}


2.5 UserServlet 【Regist Login Servlet 合并】

2.5.2 映射路径


import javax.servlet.annotation.WebServlet;
@WebServlet("/userServlet")注解代替读取web.xml的配置,即:

 
package web.servlet;

import domain.User;
import service.UserService;
import service.impl.UserServiceImpl;
import utils.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/userServlet")
public class UserServlet extends baseServlet {
  private static final long serialVersionUID = -8091529342806668006L;
  private UserService userService = new UserServiceImpl();

  
  protected void login(HttpServletRequest req, HttpServletResponse resp) throws Exception {

    //  1、获取请求的参数
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    // 调用 userService.login()登录处理业务
    User loginUser = userService.login(new User(null, username, password, null));
    // 如果等于null,说明登录 失败!
    if (loginUser == null) {
      // 把错误信息,和回显的表单项信息,保存到Request域中
      req.setAttribute("msg", "用户或密码错误!");
      req.setAttribute("username", username);
      //   跳回登录页面
      req.getRequestDispatcher("/login.jsp").forward(req, resp);
    } else {
      // 登录 成功
      // 跳到成功页面login_success.html
      req.getRequestDispatcher("/login_success.jsp").forward(req, resp);
    }
  }

  
  protected void regist(HttpServletRequest req, HttpServletResponse resp) throws Exception {

    //  1、获取请求的参数
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    String email = req.getParameter("email");
    String code = req.getParameter("code");

    User user = WebUtils.copyParamToBean(req.getParameterMap(), new User());

    //        2、检查 验证码是否正确  === 写死,要求验证码为:abcde
    if ("abcde".equalsIgnoreCase(code)) {
      //        3、检查 用户名是否可用
      if (userService.existUsername(username)) {
        System.out.println("用户名[" + username + "]已存在!");

        // 把回显信息,保存到Request域中
        req.setAttribute("msg", "用户名已存在!!");
        req.setAttribute("username", username);
        req.setAttribute("email", email);

        //        跳回注册页面
        req.getRequestDispatcher("loginRegist.jsp").forward(req, resp);
      } else {
        //      可用
        //                调用Service保存到数据库
        userService.registUser(new User(null, username, password, email));
        //
        //        跳到注册成功页面 regist_success.jsp
        req.getRequestDispatcher("regist_success.jsp").forward(req, resp);
      }
    } else {
      // 把回显信息,保存到Request域中
      req.setAttribute("msg", "验证码错误!!");
      req.setAttribute("username", username);
      req.setAttribute("email", email);

      System.out.println("验证码[" + code + "]错误");
      req.getRequestDispatcher("loginRegist.jsp").forward(req, resp);
    }
  }
}


2.6 baseServlet
package web.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.lang.reflect.Method;


public abstract class baseServlet extends HttpServlet {

  private static final long serialVersionUID = 6509980383138397669L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    doPost(req, resp);
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    // 解决post请求中文乱码问题
    // 一定要在获取请求参数之前调用才有效
    req.setCharacterEncoding("UTF-8");

    String action = req.getParameter("action");
    try {
      // 获取action业务鉴别字符串,获取相应的业务 方法反射对象
      Method method =
          this.getClass()
              .getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
      //            System.out.println(method);
      // 调用目标业务 方法
      method.invoke(this, req, resp);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}package web.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;


public abstract class baseServlet extends HttpServlet {

  private static final long serialVersionUID = 6509980383138397669L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    doPost(req, resp);
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    // 解决post请求中文乱码问题
    // 一定要在获取请求参数之前调用才有效
    req.setCharacterEncoding("UTF-8");

    String action = req.getParameter("action");
    try {
      // 获取action业务鉴别字符串,获取相应的业务 方法反射对象
      Method method =
          this.getClass()
              .getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
      //            System.out.println(method);
      // 调用目标业务 方法
      method.invoke(this, req, resp);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}



Beanutils 下载地址
comment logging 下载地址

2.6.2 bug:class not found exception


解决方法:去除web.xml的配置

2.5 FailServlet
package web.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;


@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
    private static final long serialVersionUID = -5449163807777119134L;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 给页面写一句话
        // 设置编码
        response.setContentType("text/html;charset=utf-8");
        // 输出
        response.getWriter().write("登陆失败,用户名或密码错误");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }
}

2.6 successServlet
package web.servlet;

import domain.User;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;


@WebServlet(urlPatterns = "/successServlet")
public class SuccessServlet extends HttpServlet {
  private static final long serialVersionUID = -3673955596722541985L;

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 获取request域中共享的user对象
    User user = (User) request.getAttribute("user");

    // 防止空指针异常
    if (user != null) {
      // 给页面写一句话
      // 设置编码
      response.setContentType("text/html;charset=utf-8");
      // 输出
      response.getWriter().write("登陆成功 " + user.getUsername() + "欢迎您");
    }
  }

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    this.doPost(request, response);
  }
}

3. bug :错误500 3.1 问题描述:

@Override
        public void run() {
            bytes = mmInStream.read(buffer);
            mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
        }

3.2 解决分析:

提示:可能是目录结构问题,排查完结构问题后,删除lib目录重新添加,并配置如下


3.3 结果

然后又遇到:war exploded: Error during artifact deployment.卡到这不动,各种解决方法,最后删掉web.xml文件里乱七八糟的,写成如下,

3.4 解决方法



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/357806.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号