我将详细总结一个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);}}@Overridepublic 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 {@Overridepublic 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();}@Overrideprotected 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");}}@Overrideprotected 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,掌握更多高级功能和最佳实践。