JavaEE 前后端交互与数据库连接练习

我将详细总结一个JavaEE练习项目,该项目展示了前后端交互以及与数据库连接的基本流程。该项目使用Maven构建,并部署在Tomcat服务器上。通过这个练习,可以掌握如何在JavaEE中处理用户请求、访问数据库以及进行页面跳转。

项目结构

该项目是一个典型的Maven Web项目,其目录结构如下:

java 复制代码
- src
  - main
    - java
      - com.ffyc.dao
        - IUserDao.java
        - IUserDaoImpl.java
      - com.ffyc.entity
        - User.java
      - com.ffyc.filter
        - CodingFilter.java
      - com.ffyc.servlet
        - LoginServlet.java
    - resources
      - (资源文件,如配置文件)
    - webapp
      - WEB-INF
        - web.xml
      - index.html
      - login-success.html
  • src/main/java: 放置Java类文件,包括DAO层、实体类、过滤器和Servlet。

  • src/main/resources: 放置资源文件,如配置文件、properties文件等。

  • src/main/webapp: 放置Web资源,如HTML页面、JSP文件、过滤器配置等。

    • WEB-INF: 放置web.xml等配置文件,以及class文件。

    • index.html: 登录页面。

    • login-success.html: 登录成功后的页面。

代码解释

1. 数据访问层 (DAO层)

IUserDao.java
java 复制代码
package com.ffyc.dao;

import com.ffyc.entity.User;

public interface IUserDao {
    User find(String username, String password);
}
  • 定义了一个find方法,用于根据用户名和密码查询用户信息。
IUserDaoImpl.java
java 复制代码
package com.ffyc.dao;

import com.ffyc.entity.User;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class IUserDaoImpl implements IUserDao {
    private final String USERNAME = "root";
    private final String PASSWORD = "123456";
    private final String URL = "jdbc:mysql://localhost:3306/stu_db?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
    private Connection conn;
    private PreparedStatement pst;
    private ResultSet rs;

    public IUserDaoImpl() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public User find(String username, String password) {
        String sql = "select * from user_tab where user_username =? and user_password =?";
        try {
            pst = conn.prepareStatement(sql);
            pst.setString(1, username);
            pst.setString(2, password);
            rs = pst.executeQuery();
            if (!rs.next()) {
                return null;
            } else {
                Integer id = rs.getInt("user_id");
                String u = rs.getString("user_username");
                String p = rs.getString("user_password");
                String name = rs.getString("user_name");
                User user = new User();
                user.setId(id);
                user.setUsername(u);
                user.setPassword(p);
                user.setName(name);
                return user;
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
  • 实现了IUserDao接口的find方法。

  • 建立数据库连接,执行SQL查询,返回用户对象。

2. 实体类

User.java
java 复制代码
package com.ffyc.entity;

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String username;
    private String password;
    private String name;
}
  • 使用Lombok的@Data注解,自动生成getter和setter方法。

  • 表示用户实体类,包含用户ID、用户名、密码和姓名。

3. 过滤器

CodingFilter.java
java 复制代码
package com.ffyc.filter;

import javax.servlet.*;
import java.io.IOException;

public class CodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
  • 实现了Filter接口,设置请求和响应的编码为UTF-8,防止乱码。

4. Servlet

LoginServlet.java
java 复制代码
package com.ffyc.servlet;

import com.ffyc.dao.IUserDao;
import com.ffyc.dao.IUserDaoImpl;
import com.ffyc.entity.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(value = "/login.do")
public class LoginServlet extends HttpServlet {
    private IUserDao userDao;

    public LoginServlet() {
        userDao = new IUserDaoImpl();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        User user = userDao.find(username, password);
        if (user == null) {
            resp.sendRedirect("index.html");
        } else {
            resp.sendRedirect("login-success.html");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  • 使用@WebServlet注解映射URL /login.do

  • 获取请求参数usernamepassword,调用userDao.find方法查询用户。

  • 根据查询结果重定向到不同的页面。

5. 前端页面

index.html
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<form action="http://localhost:8099/login.do" method="post">
    <fieldset>
        <legend>用户登录</legend>
        <div>
            <input type="text" name="username" placeholder="用户名">
        </div>
        <div>
            <input type="password" name="password" placeholder="密码">
        </div>
        <div>
            <input type="submit" value="登录">
            <input type="reset" value="取消">
        </div>
    </fieldset>
</form>
</body>
</html>
  • 提供一个简单的登录表单,提交到/login.do
login-success.html
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录成功页面</title>
</head>
<body>
<img src="https://img95.699pic.com/photo/40236/5997.jpg_wh300.jpg"/>
<h1>登录成功</h1>
</body>
</html>

项目配置

1. web.xml配置

WEB-INF目录下的web.xml文件中配置过滤器:

XML 复制代码
<filter>
    <filter-name>CodingFilter</filter-name>
    <filter-class>com.ffyc.filter.CodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2. 数据库配置

IUserDaoImpl.java中配置了数据库连接信息:

java 复制代码
private final String USERNAME = "root";
private final String PASSWORD = "123456";
private final String URL = "jdbc:mysql://localhost:3306/stu_db?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";

++需要确保数据库stu_db中存在user_tab表,并且表结构与代码中查询的字段一致。++

总结

通过这个练习,我学习了JavaEE中前后端交互的基本流程,包括:

  1. 前端页面: 使用HTML表单收集用户输入,并提交到Servlet。

  2. Servlet处理请求: 获取请求参数,调用DAO层方法查询数据库。

  3. 数据库访问: 通过DAO层建立数据库连接,执行SQL查询,返回结果。

  4. 页面跳转: 根据查询结果重定向到不同的页面。

这个练习为我打下了JavaEE开发的基础,理解了MVC架构中各层的作用和交互方式。今后我将继续深入学习JavaEE,掌握更多高级功能和最佳实践。

相关推荐
vvw&4 分钟前
如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库教程
linux·运维·服务器·数据库·ubuntu·nosql
白露与泡影1 小时前
Spring Boot中的 6 种API请求参数读取方式
java·spring boot·后端
CodeClimb1 小时前
【华为OD-E卷 - 服务失效判断 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
CodeClimb1 小时前
【华为OD-E卷 - 九宫格按键输入 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
豪宇刘1 小时前
MyBatis 与 MyBatis-Plus 的区别
java·tomcat
一个儒雅随和的男子1 小时前
Spring为什么要用三级缓存解决循环依赖?
java·spring·缓存
梦想是成为Java高手1 小时前
ThreadLocal的介绍与使用规范,初学者必看
java
StevenGerrad1 小时前
【读书笔记/源码】How Tomcat Works 笔记 - c1~c10
java·笔记·tomcat
我自是年少韶华倾负1 小时前
Mysql数据实时同步到Es上
数据库·mysql·elasticsearch
代码背包客1 小时前
制作一个纯净版的系统镜像(Linux,Window都可以)
linux·运维·服务器·windows