Java web登录注册功能连接数据库

总体思想

前言 

在我第一次进行jsp连接数据库时,第一步不知道怎么下手,例如,怎么连接,如何判断,又怎么把判断的结果返回,又是怎么处理判断结果等等,遂总结如下。 

文件路径如下

src/
└── com/
└── humc/
├── controller/ # 控制器层
│ ├── LoginServlet # 登录控制器
│ ├── LogoutServlet # 登出控制器
│ └── RegisterServlet # 注册控制器
│
├── dao/ # 数据访问层
│ ├── UserDao # 用户数据访问接口
│ └── impl/ # 实现类子包
│ └── UserDaoImpl # UserDao接口实现
│
├── model/ # 数据模型
│ └── User # 用户实体类
│
└── util/ # 工具类
├── DBUtil # 数据库工具类
└── db.properties # 数据库配置文件

 

内容准备 

1.登录注册界面

对下面这个登录注册界面进行数据库连接 

登录页面 

<h3>登录界面</h3>
<form method="POST" action="LoginServlet">
  <div>
    <label>账号:</label>
    <input type="text" name="username" placeholder="请输入用户名">
  </div>
  <div>
    <label>密码:</label>
    <input type="password" name="password" placeholder="请输入密码">
  </div>
  <div>
    <input type="submit" value="登录">
    <button type="button" id="registerBtn">注册</button>
  </div>
</form>

注册界面 

<form action="RegisterServlet" method="post">
      <div>
        <label>用户名</label>
        <input type="text" name="username" required placeholder="请输入用户名">
      </div>
      <div>
        <label for="password">密码</label>
        <input type="password"name="password" required placeholder="请输入密码(至少6位)">
      </div>
      <div>
        <label>确认密码</label>
        <input type="password" name="confirmPassword" required placeholder="请再次输入密码">
      </div>
      <button type="submit">立即注册</button>
</form>

 

 1.数据库连接文件

1. db.properties文件

存储数据库的相关信息 

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/root?useSSL=false&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

三个root分别为数据库名,MySql用户名,密码 

2. 读取文件进行连接

public class DBUtil {
    private static String url;
    private static String username;
    private static String password;

    static {
        try (InputStream is = 
        DBUtil.class.getClassLoader().getResourceAsStream("db.properties")) 
        {
            Properties props = new Properties();
            props.load(is);
            url = props.getProperty("jdbc.url");
            username = props.getProperty("jdbc.username");
            password = props.getProperty("jdbc.password");
            Class.forName(props.getProperty("jdbc.driver"));
        } catch (Exception e) {
            throw new RuntimeException("数据库配置加载失败", e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }

    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

3.登录界面判断

 这个界面的主要作用是获取登录界面的信息,然后将它们交给数据库相应的代码进行判断,等待判断完成后,再进行接收返回的判断结果,然后进行相应判断结果的界面跳转。UserDao是一个接口,里面包括登录数据判断的函数,以及在注册时使用的名称查找方法。

1.获取数据

使用getParameter获取POST请求返回的表单数据。

String username = request.getParameter("username");
String password = request.getParameter("password");

2.对页面数据进行数据库判断。

定义UserDao,调用UserDaoImpl文件中的findByUsername方法进行查找昵称并返回,使得show.jsp页面获取并显示。

UserDao userDao = new UserDaoImpl();

定义isValid,调用UserDaoImpl文件中的validateUser方法,目的是判断获取页面的username和password是否和数据库的相匹配,并返回布尔值(true/false)以供下面判断

boolean isValid = userDao.validateUser(username,password);

if判断,如果为真,将查找到的usernsme存入到user中,并通过session方法存入到username中,最后返回相应页面。 

if(isValid) {
   User user = userDao.findByUsername(username);
   HttpSession session = request.getSession();
   session.setAttribute("username", user);

   // 跳转到主页
   request.getRequestDispatcher("/index.jsp").forward(request,response);
}else {
      System.out.println("Invalid username or password");
}

4. 注册界面判断

同登录界面一样,获取数据,判断结果进行页面跳转,三个处理函数在同一个类中,没什么别的不同 

public class RegisterServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        UserDao userDao = new UserDaoImpl();
        boolean isaddUser = userDao.addUser(username,password);

        if(isaddUser) {
            request.getRequestDispatcher("/index.jsp").forward(request,response);
        }else{

        }
    }
}

5. 处理登录界面数据

先定义一个登录的sql语句,然后判断数据库连接,预编译sql语句,没有问题就try,否则就catch出去,里面就是使用PreparedStatementAPI的函数setString对数据库的中的数据对应,以ResultSet类型调用executeQuery函数,并返回到rs中,最后使用next()返回布尔值。

public boolean validateUser(String username, String password) {
        String sql = "SELECT id FROM tb_user WHERE username = ? AND password = ?";
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql)) {

            stmt.setString(1, username);
            stmt.setString(2, password);
            ResultSet rs = stmt.executeQuery();
            return rs.next(); 

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

6.处理注册界面数据

同登录界面的判断类似,就是sql语句不同,不过在这个判断使用的是executeUpdate函数执行插入操作,返回整数值,通过判断返回整数是否大于0进行布尔返回 

    public boolean addUser(String username, String password) {
        String sql = "INSERT INTO tb_user(username, password) VALUES(?,?)";

        UserDao userDao = new UserDaoImpl();
        User result = userDao.findByUsername(username);

        if(result != null) {
            return false;
        }else{
            try (Connection conn = DBUtil.getConnection();
                 PreparedStatement stmt = conn.prepareStatement(sql)) {

                stmt.setString(1, username);
                stmt.setString(2, password);

                int affectedRows = stmt.executeUpdate();
                return affectedRows > 0;
            } catch (SQLException e) {
                e.printStackTrace();
                return false;
            }
        }
    }

总结

对数据库的操作本质还是在JAVA文件中插入sql语句进行执行,对于我第一次连接时,迷茫的主要是需要准备什么来进行连接,几个文件,文件路径等等 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值