JavaEE 前后端交互与数据库连接练习
我将详细总结一个JavaEE练习项目,该项目展示了前后端交互以及与数据库连接的基本流程。该项目使用Maven构建,并部署在Tomcat服务器上。通过这个练习,可以掌握如何在JavaEE中处理用户请求、访问数据库以及进行页面跳转。
项目结构
该项目是一个典型的Maven Web项目,其目录结构如下:
- 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
package com.ffyc.dao;
import com.ffyc.entity.User;
public interface IUserDao {
User find(String username, String password);
}
定义了一个
find
方法,用于根据用户名和密码查询用户信息。
IUserDaoImpl.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
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
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
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
。获取请求参数
username
和password
,调用userDao.find
方法查询用户。根据查询结果重定向到不同的页面。
5. 前端页面
index.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
<!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
文件中配置过滤器:
<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
中配置了数据库连接信息:
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中前后端交互的基本流程,包括:
-
前端页面: 使用HTML表单收集用户输入,并提交到Servlet。
-
Servlet处理请求: 获取请求参数,调用DAO层方法查询数据库。
-
数据库访问: 通过DAO层建立数据库连接,执行SQL查询,返回结果。
-
页面跳转: 根据查询结果重定向到不同的页面。
这个练习为我打下了JavaEE开发的基础,理解了MVC架构中各层的作用和交互方式。今后我将继续深入学习JavaEE,掌握更多高级功能和最佳实践。