JavaWeb 技术栈
最后更新: 2025年11月26日
技术栈概述
JavaWeb 是最基础的Java Web开发技术栈,使用Servlet + JSP + JDBC实现,是学习Java Web开发的入门必经之路,也是理解Web开发原理的最佳选择。
技术组成
| 组件 | 说明 |
|---|---|
| Servlet | 处理HTTP请求的Java类 |
| JSP | Java Server Pages,动态页面技术 |
| JDBC | Java数据库连接 |
| Tomcat | Web服务器/Servlet容器 |
| MySQL | 数据库 |
核心特性
- ✅ 基础原理:深入理解Web开发本质
- ✅ 教学标准:高校Java课程首选
- ✅ 轻量级:无框架依赖,代码简洁
- ✅ 可控性强:完全掌控每一行代码
JavaWeb 框架变体说明
系统提供两个 JavaWeb 变体,满足不同需求:
JAVA_WEB (完整版) - 推荐
| 特性 | 说明 |
|---|---|
| 平台代码 | JAVA_WEB |
| 技术栈 | JSP + Servlet + JDBC |
| 页面结构 | 完整布局(包含 header.jsp) |
| 适用场景 | 完整项目、企业应用、标准课程设计 |
| 模板目录 | project-javaweb |
JAVA_WEB3 (简化版) - 适合课程设计
| 特性 | 说明 |
|---|---|
| 平台代码 | JAVA_WEB3 |
| 技术栈 | JSP + Servlet + JDBC |
| 页面结构 | 简化布局(不生成 header.jsp) |
| 适用场景 | 课程作业、快速学习、简单项目 |
| 模板目录 | project-javaweb3 |
变体选择建议:
| 您的需求 | 推荐变体 |
|---|---|
| 完整企业项目、标准课程设计 | JAVA_WEB (完整版) |
| 快速学习、简单课程作业 | JAVA_WEB3 (简化版) |
💡 提示:两个变体的后端代码(Servlet、DAO)完全相同,仅 JSP 页面布局不同。JAVA_WEB3 页面更简洁,代码更少。
适用场景
| 场景 | 适合度 | 说明 |
|---|---|---|
| 课程作业 | ⭐⭐⭐⭐⭐ | 完美符合教学要求 |
| 学习Web原理 | ⭐⭐⭐⭐⭐ | 最佳学习材料 |
| 简单项目 | ⭐⭐⭐⭐ | 快速实现 |
| 企业项目 | ⭐⭐ | 建议使用框架 |
项目结构
ProjectName/ ├── src/ │ └── com/example/project/ │ ├── entity/ # 实体类 │ │ └── Student.java │ ├── dao/ # 数据访问层 │ │ ├── BaseDao.java │ │ └── StudentDao.java │ ├── service/ # 业务逻辑层 │ │ └── StudentService.java │ ├── servlet/ # Servlet控制器 │ │ └── StudentServlet.java │ ├── filter/ # 过滤器 │ │ └── EncodingFilter.java │ └── util/ # 工具类 │ └── DBUtil.java ├── web/ │ ├── WEB-INF/ │ │ ├── web.xml │ │ └── lib/ # JAR包 │ ├── student/ # 页面 │ │ ├── list.jsp │ │ └── edit.jsp │ ├── css/ │ ├── js/ │ └── index.jsp └── sql/ └── schema.sql
核心代码示例
数据库工具类 (DBUtil.java)
package com.example.project.util; import java.sql.*; public class DBUtil { private static final String URL = "jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8"; private static final String USER = "root"; private static final String PASSWORD = "your_password"; static { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(Connection conn, Statement stmt, ResultSet rs) { try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
实体类 (Student.java)
package com.example.project.entity; import java.util.Date; public class Student { private Long id; private String name; private String studentNo; private Integer gender; private Long classId; private Date createTime; // Getter和Setter方法 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } // ... 其他getter/setter }
DAO层 (StudentDao.java)
package com.example.project.dao; import com.example.project.entity.Student; import com.example.project.util.DBUtil; import java.sql.*; import java.util.ArrayList; import java.util.List; public class StudentDao { public List<Student> findAll() { List<Student> list = new ArrayList<>(); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); String sql = "SELECT * FROM student ORDER BY id DESC"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { Student student = new Student(); student.setId(rs.getLong("id")); student.setName(rs.getString("name")); student.setStudentNo(rs.getString("student_no")); student.setGender(rs.getInt("gender")); student.setClassId(rs.getLong("class_id")); student.setCreateTime(rs.getTimestamp("create_time")); list.add(student); } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(conn, ps, rs); } return list; } public Student findById(Long id) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); String sql = "SELECT * FROM student WHERE id = ?"; ps = conn.prepareStatement(sql); ps.setLong(1, id); rs = ps.executeQuery(); if (rs.next()) { Student student = new Student(); student.setId(rs.getLong("id")); student.setName(rs.getString("name")); student.setStudentNo(rs.getString("student_no")); student.setGender(rs.getInt("gender")); student.setClassId(rs.getLong("class_id")); return student; } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(conn, ps, rs); } return null; } public int insert(Student student) { Connection conn = null; PreparedStatement ps = null; try { conn = DBUtil.getConnection(); String sql = "INSERT INTO student(name, student_no, gender, class_id) VALUES(?,?,?,?)"; ps = conn.prepareStatement(sql); ps.setString(1, student.getName()); ps.setString(2, student.getStudentNo()); ps.setInt(3, student.getGender()); ps.setLong(4, student.getClassId()); return ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(conn, ps, null); } return 0; } public int update(Student student) { Connection conn = null; PreparedStatement ps = null; try { conn = DBUtil.getConnection(); String sql = "UPDATE student SET name=?, student_no=?, gender=?, class_id=? WHERE id=?"; ps = conn.prepareStatement(sql); ps.setString(1, student.getName()); ps.setString(2, student.getStudentNo()); ps.setInt(3, student.getGender()); ps.setLong(4, student.getClassId()); ps.setLong(5, student.getId()); return ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(conn, ps, null); } return 0; } public int delete(Long id) { Connection conn = null; PreparedStatement ps = null; try { conn = DBUtil.getConnection(); String sql = "DELETE FROM student WHERE id = ?"; ps = conn.prepareStatement(sql); ps.setLong(1, id); return ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(conn, ps, null); } return 0; } }
Servlet (StudentServlet.java)
package com.example.project.servlet; import com.example.project.dao.StudentDao; import com.example.project.entity.Student; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; import java.util.List; @WebServlet("/student") public class StudentServlet extends HttpServlet { private StudentDao studentDao = new StudentDao(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String action = req.getParameter("action"); if (action == null) action = "list"; switch (action) { case "list": list(req, resp); break; case "add": req.getRequestDispatcher("/student/edit.jsp").forward(req, resp); break; case "edit": edit(req, resp); break; case "delete": delete(req, resp); break; } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { save(req, resp); } private void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<Student> list = studentDao.findAll(); req.setAttribute("list", list); req.getRequestDispatcher("/student/list.jsp").forward(req, resp); } private void edit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Long id = Long.parseLong(req.getParameter("id")); Student student = studentDao.findById(id); req.setAttribute("student", student); req.getRequestDispatcher("/student/edit.jsp").forward(req, resp); } private void save(HttpServletRequest req, HttpServletResponse resp) throws IOException { Student student = new Student(); String idStr = req.getParameter("id"); if (idStr != null && !idStr.isEmpty()) { student.setId(Long.parseLong(idStr)); } student.setName(req.getParameter("name")); student.setStudentNo(req.getParameter("studentNo")); student.setGender(Integer.parseInt(req.getParameter("gender"))); student.setClassId(Long.parseLong(req.getParameter("classId"))); if (student.getId() == null) { studentDao.insert(student); } else { studentDao.update(student); } resp.sendRedirect(req.getContextPath() + "/student?action=list"); } private void delete(HttpServletRequest req, HttpServletResponse resp) throws IOException { Long id = Long.parseLong(req.getParameter("id")); studentDao.delete(id); resp.sendRedirect(req.getContextPath() + "/student?action=list"); } }
JSP页面 (list.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <title>学生列表</title> <link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.min.css"> </head> <body> <div class="container mt-4"> <h2>学生列表</h2> <a href="${pageContext.request.contextPath}/student?action=add" class="btn btn-primary mb-3">新增学生</a> <table class="table table-bordered"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>学号</th> <th>性别</th> <th>操作</th> </tr> </thead> <tbody> <c:forEach items="${list}" var="item"> <tr> <td>${item.id}</td> <td>${item.name}</td> <td>${item.studentNo}</td> <td>${item.gender == 1 ? '男' : '女'}</td> <td> <a href="${pageContext.request.contextPath}/student?action=edit&id=${item.id}" class="btn btn-sm btn-info">编辑</a> <a href="${pageContext.request.contextPath}/student?action=delete&id=${item.id}" class="btn btn-sm btn-danger" onclick="return confirm('确定删除?')">删除</a> </td> </tr> </c:forEach> </tbody> </table> </div> </body> </html>
部署说明
- 将项目打包为WAR
- 复制到Tomcat的webapps目录
- 启动Tomcat
- 访问 http://localhost:8080/项目名/
数据库支持
支持的数据库类型
| 数据库 | 版本 | 驱动类 |
|---|---|---|
| MySQL | 5.7+ | com.mysql.cj.jdbc.Driver |
| SQLite | 3.x | org.sqlite.JDBC |
| SQL Server | 2012+ | com.microsoft.sqlserver.jdbc.SQLServerDriver |
⚠️ 注意:系统当前仅支持以上 3 种数据库。如需其他数据库(如 PostgreSQL、Oracle),需要手动修改配置和驱动。
常见问题
Q1: JAVA_WEB 和 JAVA_WEB3 应该选哪个?
推荐选择 JAVA_WEB (完整版),除非您的课程作业要求简化页面或快速学习。
区别总结:
- JAVA_WEB:完整页面布局(包含 header.jsp),适合标准课程设计和企业项目
- JAVA_WEB3:简化页面布局(不含 header.jsp),代码更少,适合快速学习
Q2: 为什么选择 JavaWeb 而不是 Spring Boot?
JavaWeb 的优势:
- ✅ 深入理解 Web 开发原理(Servlet 生命周期、请求处理)
- ✅ 高校课程标准,资料丰富
- ✅ 轻量级,无框架依赖,代码简洁
- ✅ 完全掌控每一行代码
如果是新项目开发,建议选择 Spring Boot(配置更简单,开发效率更高)。
Q3: 数据库连接失败?
检查清单:
- MySQL 服务是否启动
- 数据库是否存在
- 用户名密码是否正确
- DBUtil.java 中的连接字符串是否正确
Q4: 中文乱码问题?
解决方案:
- 在每个 JSP 页面顶部添加:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> - 在 Servlet 中设置编码:
request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); - 数据库连接字符串添加:
?characterEncoding=utf-8
Q5: JavaWeb 适合学习吗?
非常适合! JavaWeb 是学习 Web 开发的最佳入门技术:
- ✅ 理解 HTTP 请求/响应原理
- ✅ 理解 MVC 分层思想
- ✅ 理解数据库连接和 JDBC 操作
- ✅ 为学习框架(SSM、Spring Boot)打下坚实基础
💡 提示:JavaWeb是学习Web开发的基础,掌握后再学习框架会更容易理解。生产项目建议使用Spring Boot。
本文对您有帮助吗?
提交反馈