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

相关推荐
LiRuiJie10 分钟前
深入剖析Spring Boot / Spring 应用中可自定义的扩展点
java·spring boot·spring
爬虫程序猿19 分钟前
利用 Java 爬虫获取淘宝商品 SKU 详细信息实战指南
java·开发语言·爬虫
星期天要睡觉1 小时前
MySQL 综合练习
数据库·mysql
Y4090011 小时前
数据库基础知识——聚合函数、分组查询
android·数据库
snowfoootball1 小时前
(自用)Linux 常用命令自查文档
linux·运维·服务器
茶本无香1 小时前
RequestContextFilter介绍
java·spring·filter·requestcontext
Web极客码1 小时前
在Ubuntu 20.04的服务器上查找的服务器的IP地址
服务器·tcp/ip·ubuntu