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,掌握更多高级功能和最佳实践。

相关推荐
八股文领域大手子1 分钟前
从接口400ms到20ms,记录一次JVM、MySQL、Redis的混合双打
jvm·数据库·redis·mysql·jar
佩奇的技术笔记4 分钟前
Java学习手册:JVM、JRE和JDK的关系
java·开发语言·jvm
夔88814 分钟前
Excel通过VBA脚本去除重复数据行并保存
java·服务器·excel
AronTing15 分钟前
13-Java并发编程性能优化终极指南:从原理到企业级实战
java·后端·面试
zyx没烦恼28 分钟前
Linux 多线程
linux·运维·服务器·开发语言·c++
布道谷30 分钟前
锁的可重入性:概念、原理与Java实现深度解析
java·后端
雷渊33 分钟前
谈一谈在分布式系统中,如何保证数据一致性?
java·后端·面试
省长37 分钟前
使用 Sa-Token CORS 策略处理跨域问题(三种方式全版)
java·后端·开源
提高记忆力1 小时前
truncate,drop,delete分析
数据库
东方芷兰1 小时前
JavaWeb 课堂笔记 —— 03 Vue
java·前端·javascript·vue.js·笔记