JavaWeb 技术栈

    最后更新: 2025年11月26日

    技术栈概述

    JavaWeb 是最基础的Java Web开发技术栈,使用Servlet + JSP + JDBC实现,是学习Java Web开发的入门必经之路,也是理解Web开发原理的最佳选择。

    技术组成

    组件说明
    Servlet处理HTTP请求的Java类
    JSPJava Server Pages,动态页面技术
    JDBCJava数据库连接
    TomcatWeb服务器/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>

    部署说明

    1. 将项目打包为WAR
    2. 复制到Tomcat的webapps目录
    3. 启动Tomcat
    4. 访问 http://localhost:8080/项目名/

    数据库支持

    支持的数据库类型

    数据库版本驱动类
    MySQL5.7+com.mysql.cj.jdbc.Driver
    SQLite3.xorg.sqlite.JDBC
    SQL Server2012+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: 数据库连接失败?

    检查清单

    1. MySQL 服务是否启动
    2. 数据库是否存在
    3. 用户名密码是否正确
    4. DBUtil.java 中的连接字符串是否正确

    Q4: 中文乱码问题?

    解决方案

    1. 在每个 JSP 页面顶部添加:
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. 在 Servlet 中设置编码:
      request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");
    3. 数据库连接字符串添加:
      ?characterEncoding=utf-8
      

    Q5: JavaWeb 适合学习吗?

    非常适合! JavaWeb 是学习 Web 开发的最佳入门技术:

    • ✅ 理解 HTTP 请求/响应原理
    • ✅ 理解 MVC 分层思想
    • ✅ 理解数据库连接和 JDBC 操作
    • ✅ 为学习框架(SSM、Spring Boot)打下坚实基础

    💡 提示:JavaWeb是学习Web开发的基础,掌握后再学习框架会更容易理解。生产项目建议使用Spring Boot。

    本文对您有帮助吗?
    提交反馈