JavaEE 环境与程序设计 · 交互课程
技术演进接力链(M1 → M9)
  1. 1WEB 基础
    HTTP / Browser / WebServer
    静态页面写死,人人看到一样
  2. 2Servlet
    手写 if-else 分发不可扩展,无生命周期/并发管理
  3. 3JSP:参数散字符串
    参数散成一堆 String,取值靠字段名硬记
  4. 3JSP:scriptlet 塞逻辑
    scriptlet 把逻辑塞进页面,代码与 HTML 糊在一起
  5. 3JavaBean:数据对象化
    对象全靠 new、层层硬依赖
  6. 4Spring IoC
    Web 路由仍手写 web.xml/if-else、手动取参绑定,展示/业务/数据访问没分开
  7. 5MVC · SpringMVC
    数据在库里,访问是重复样板 + 拼串有注入风险
  8. 6MySQL
    Java 连库要手写五步,连接与资源管理全手动
  9. 7JDBC
    SQL 与 Java 混写、结果集逐行手映射、没有动态 SQL
  10. 8MyBatis
    四份配置 + web.xml 装配繁琐,部署要外部 Tomcat
  11. 9SpringBoot
    链尾 · 不考核

WEB 基础与开发环境

起点 · 技术演进链由此出发
这是整条技术演进链的起点:HTTP / Browser / WebServer。搞清「浏览器敲一个网址到看到页面」中间发生了什么,是一切 Web 程序的根基。

WEB 基础与开发环境

目标:理解 WEB 基本概念与 HTTP 协议;能搭建 Eclipse + Tomcat 环境,创建 / 发布 / 调试最简单的 WEB 项目。

本模块是整门课的「世界观」:先搞清浏览器敲一个网址到看到页面中间发生了什么,再落到怎么搭环境、怎么写第一个 WEB 程序。贯穿示例用手写 HTTP 服务器(workspace-ssm/HttpWebServerV1..V7/)——从最简 socket 一步步长成 Tomcat。

一、Internet / WWW / 网站 / 网页

先分清四个常被混用的词:

一句话:Internet 是路,WWW 是规则,网站是一串门牌,网页是其中一扇门。

二、浏览器(Browser):客户端

「浏览器敲一个网址」这动作里,浏览器干了四件事:

  1. 解析 URL:把 http://host:port/path 拆成协议 / 主机 / 端口 / 路径;
  2. 发请求:按 HTTP 向服务器发一个请求报文(方法 + 首部);
  3. 收响应、渲染:拿到 HTML/CSS/JS,解析 DOM、应用样式、执行脚本,画出你看到的页面;
  4. 保存状态:把 Cookie 存下来、管理缓存——这是后面「登录态」的客户端一半。

浏览器是客户端:它只负责「问 + 显示」,不存业务数据;真正算内容的是服务器端(模块2+ 的 Servlet/JSP)。所以同一个 .jsp,浏览器每次看到的 HTML 都是服务器现算后返回的。

三、静态网页 vs 动态网页

判定一个网页「静」还是「动」,关键看内容是不是服务器端现算的:

维度静态网页动态网页
典型后缀.html / .htm.jsp / .asp / .aspx / .php
内容来源文件里写死的,人人看到都一样服务器端解释执行后生成,可因人而异、因时而变
能否交互基本不能(只有表单提交到别处)能:读参数、查数据库、写会话
代表技术纯 HTML + CSSJSP / ASP.NET / PHP / J2EE(本站主线)

动态网页的本质:浏览器请求的是一个「模板」,服务器端把 Java/脚本跑一遍、把结果拼成 HTML 再返回——你看到的永远是「算出来的 HTML」。这正是后面 JSP / Servlet 要解决的问题。

四、IP / URL / 域名

五、HTTP 请求—响应模型

HTTP 是无状态的请求—响应协议:客户端发一个请求报文,服务器回一个响应报文,一次交互结束。常见方法 GET(取资源)/POST(提交数据);常见状态码 200 OK(成功)/302(重定向)/404(未找到)/500(服务器内部错误)。

下面把一次完整通信拆成五步,逐帧看请求/响应报文里真正在用的字段(方法 / 首部 / 状态码):

交互实验:HTTP 请求/响应报文逐步动画(HttpRequestFlowDiagram)

点「下一步」逐帧走查一次完整通信:浏览器 → 请求报文 → 服务器 → 响应报文 → 浏览器。 每一步会高亮当前真正在用的报文字段(方法 / 首部 / 状态码)。

① 浏览器发起请求:用户在地址栏输入 URL,浏览器解析出 host 与 path,构造出 HTTP 请求报文。

请求报文(Request)

GET /index.html HTTP/1.1
localhost:8080
Mozilla/5.0 (Windows NT 10.0)
text/html,application/xhtml+xml
␣

响应报文(Response)

HTTP/1.1 200 OK
text/html; charset=UTF-8
132
␣
<html><body><h1>你好,JavaEE</h1></body></html>
第 1 / 5 步

无状态的含义:服务器不记得「上次是谁」。要跨请求记住用户(登录、购物车),就得靠 Cookie + Session——这是模块3 JSP 内置对象 session 的由来。

六、Web 服务器:Apache / IIS / Tomcat

一个 WEB 应用长什么样、怎么发布到 Tomcat,下面交互实验把目录结构和部署五步摊开看:

交互实验:WEB 应用结构与 Tomcat 部署(WebAppDeployFlow)

左边是一个 WEB 应用的目录结构,右边是发布到 Tomcat 的五步。点步骤看当前用到了哪些目录/文件—— 注意 WEB-INF/ 是浏览器访问不到的私有区。

应用目录结构

WebApp/— WEB 应用根目录(部署后对应 Tomcat webapps/<app>/)
index.jsp— 默认首页:访问 / 时优先返回它
jsp/— JSP 页面目录
hello.jsp— 动态页面:HTML + Java 片段
WEB-INF/— 私有目录:浏览器无法直接访问(安全边界)
web.xml— 部署描述符:Servlet/Filter/Listener 的映射与配置
classes/— 编译后的 .class(Servlet / JavaBean)
WordManageServlet.class— 处理请求的 Servlet 字节码
lib/— 应用依赖的 jar
servlet-api.jar— Servlet API(运行期由容器提供)

Tomcat 部署五步

① 编写代码:在 WebRoot 写 JSP 页面,在 src 写 Servlet / JavaBean——源码与页面分开放。

第 1 / 5 步

七、动态 WEB 技术选型

技术语言/平台容器定位
JSP / Servlet(J2EE)JavaTomcat本站主线:企业级、跨平台、类型安全
ASP.NETC#/.NETIISWindows 系企业开发
PHPPHPApache快速 Web 应用

本站统一按教材口径:SSM(Spring / SpringMVC / MyBatis)+ javax.servlet(Tomcat 8.5/9,Java EE 8),不引入 jakarta.* 混淆。

八、贯穿示例:手写 HTTP 服务器 V1–V7

与其把 Tomcat 当黑盒,不如自己从 socket 写起,看它每一层是怎么长出来的。workspace-ssm/HttpWebServerV1..V7/ 是同一工程的七个版本——点时间线看每版新增了什么能力、代表类是什么:

交互实验:手写 HTTP 服务器 V1–V7 演进(HttpServerTimeline)

从一个最简 socket 程序一步步长成 Tomcat:每升一版就补上一种 Web 能力。点时间线上的节点,看该版本新增了什么、代表类是什么——这正是模块1–3(Servlet / Filter / Listener)的活教材。

V1最简 socket 服务器V2V3V4V5V6V7

V1 · 最简 socket 服务器

新增能力:ServerSocket 监听 + 收请求/回响应,支持 request/response 内置对象

代表类:SimpleWebServerRequestResponse

第一个能跑的网络程序:绑定端口、读请求行、回一段 HTML。

到 V1 为止,已叠加 1 / 7 项核心能力——V7 凑齐 SSM 三件套雏形。

V1(最简 socket)就是模块1 的「第一个能跑的网络程序」;V3/V4/V5 分别对应后面模块2 的 Servlet / Filter / Listener——本模块埋的线,模块2 会逐一接上。

九、搭建开发环境(Eclipse + Tomcat + Maven)

  1. JDK:装 JDK 8+(本站示例按 Java EE 8 口径),配好 JAVA_HOME;
  2. Eclipse:建工作空间 → New Dynamic Web Project → 选 Target Runtime(Tomcat)→ 生成 WebContent/ + WEB-INF/web.xml;
  3. Maven:用 pom.xml 管理依赖(servlet-api、Spring、MyBatis…),mvn clean package 出 war;
  4. Tomcat:把 war / 目录放进 webapps/,启动后访问 http://localhost:8080/&lt;app&gt;/;
  5. 调试:Eclipse 里对 Servlet/JSP 打断点,浏览器触发请求即可单步——容器把请求转成对 service() 的调用。

思考题

  1. 一个 .html 页面和一个 .jsp 页面,浏览器最终收到的都是 HTML——它们的区别到底在哪?
  2. HTTP 是「无状态」的,那网站怎么知道「当前登录的是谁」?(提示:Cookie / Session)
  3. Tomcat 为什么能运行 JSP / Servlet?它和 Apache 这类静态服务器分工有什么不同?

学习小测验

学习小测验

Q1

判定一个网页是「动态网页」的核心依据是( )

Q2

URL http://localhost:8080/guestbook/index.jsp 中,8080 表示( )

Q3

浏览器向服务器提交表单数据(如登录)时,最常用的 HTTP 方法是( )

Q4

Tomcat 在这套技术栈里的角色是( )

Q5

HTTP 是「无状态」协议,网站要记住「当前用户」应依赖( )

Q6

浏览器(客户端)在一次网页访问里不负责( )

Q7

浏览器地址栏里 http://localhost:8080/guestbook/index.jsp,浏览器首先做的是( )

本章留下的死结
静态页面写死、人人看到一样——要动态内容就得靠服务端程序(下一章 Servlet)。