第一部分:宏观视角 - Java Web应用的“骨架”
想象一下,一个Java Web应用就像一个餐厅,我们需要理解这个餐厅的运作流程。

- 顾客:浏览器,发出请求(“我要一份宫保鸡丁”)。
- 服务员:Web服务器(如 Nginx, Apache),接收顾客请求,决定交给谁处理。
- 厨师长:应用服务器(如 Tomcat, Jetty),是真正的业务处理中心,它知道菜谱(代码)和食材(数据)。
- 厨师:你的Java代码,根据菜谱(业务逻辑)处理食材(数据),做出菜(生成响应)。
- 传菜员:Servlet/JSP,将做好的菜(响应)交给服务员。
- 食材库:数据库,存储所有原材料(数据)。
这个流程就是Java Web应用的核心工作模式:请求 -> 处理 -> 响应。
第二部分:核心基石 - Servlet & JSP
这是Java Web的“元老”,是理解一切高级框架的基础,几乎所有现代框架(如Spring MVC)都是对它们的封装和增强。
Servlet (Server Applet) - 服务器端小程序
Servlet是运行在服务器端的Java类,它的核心任务是接收客户端请求并生成响应。
-
生命周期:理解Servlet的生命周期是掌握其精髓的关键。
(图片来源网络,侵删)- 加载与实例化:当第一个请求到达时,服务器会加载Servlet类并创建一个实例,通常一个应用中一个Servlet只有一个实例(单例模式)。
- 初始化:服务器调用
init()方法,这个方法只在Servlet生命周期中执行一次,用于完成一些一次性的初始化工作,比如加载配置、建立数据库连接池等。 - 请求处理:对于每个到来的请求,服务器会创建一个新的
HttpServletRequest和HttpServletResponse对象,然后在一个新的线程中调用service()方法。service()方法会根据请求的HTTP方法(GET, POST等)调用相应的doGet(),doPost()等方法,这是Servlet处理业务逻辑的核心。 - 销毁:当应用被卸载或服务器关闭时,服务器会调用
destroy()方法,释放资源。
-
核心API:
HttpServletRequest:代表客户端请求,你可以从中获取请求头、请求参数、Cookie、Session等信息。HttpServletResponse:代表服务器响应,你可以通过它设置响应状态码、响应头、向客户端输出HTML、JSON或文件等。
-
工作流程:
- 浏览器发送一个HTTP请求到Tomcat。
- Tomcat根据
web.xml或注解(如@WebServlet)找到对应的Servlet。 - Tomcat调用该Servlet的
service()方法,并传入请求和响应对象。 - Servlet中的Java代码执行业务逻辑(如查询数据库)。
- Servlet通过
HttpServletResponse将HTML内容写入输出流。 - Tomcat将输出流中的内容封装成HTTP响应,发送回浏览器。
JSP (JavaServer Pages) - 视图层技术
JSP本质上是一个Servlet,它允许我们在HTML页面中嵌入Java代码,从而实现动态内容的生成。
-
JSP如何工作:当Tomcat第一次收到一个对
.jsp文件的请求时,它会将这个JSP文件翻译成一个Java Servlet源文件(.java),然后编译成.class文件,后续的请求就直接由这个Servlet处理了。
(图片来源网络,侵删) -
JSP的核心元素:
- 脚本片段:
<% ... %>:可以写任何Java代码。(不推荐) - 表达式:
<%= ... %>:用于输出一个表达式的结果到页面上,相当于out.print()。 - 声明:
!<% ... %>:用于在JSP页面中定义变量或方法。 - 指令:
<%@ ... %>:page:定义页面的全局属性,如编码contentType="text/html; charset=UTF-8"。include:静态包含,将另一个文件的内容原样插入到当前JSP中。taglib:引入标签库,如JSTL。
- 动作:
<jsp: ...>:jsp:include:动态包含,包含的是另一个JSP执行后的结果。jsp:forward:将请求转发给另一个资源。jsp:useBean:创建或使用一个JavaBean。
- 脚本片段:
-
JSP的演变:纯粹的JSP(在页面里写Java代码)被称为“Model 1”架构,很快变得难以维护。MVC(Model-View-Controller)模式应运而生,成为了Java Web开发的黄金标准。
第三部分:设计模式与架构演进 - MVC
Servlet和JSP的分离催生了经典的MVC模式,这是理解现代Java Web框架架构的关键。
-
MVC (Model-View-Controller):
- Model (模型):负责业务逻辑和数据处理,它可以是JavaBean、EJB,或者与数据库交互的DAO层,模型不关心数据如何展示。
- View (视图):负责数据显示,在Java Web中,JSP、HTML、XML等都是视图,视图不关心数据从哪里来,只负责展示。
- Controller (控制器):是模型和视图之间的协调者,它接收用户的HTTP请求,调用模型处理业务逻辑,然后选择一个合适的视图来展示处理结果。Servlet就是最典型的Controller。
-
工作流程(MVC版):
- 浏览器请求一个URL(如
/user/list)。 - Controller (Servlet) 接收请求。
- Servlet调用 Model 中的方法,获取用户列表数据。
- Servlet将数据存入
request作用域。 - Servlet通过
forward将请求转发给 View (如user_list.jsp)。 - View (JSP) 从
request中取出数据,并使用JSTL等标签库将其渲染成HTML表格。 - Tomcat将最终的HTML响应返回给浏览器。
- 浏览器请求一个URL(如
-
问题与演进:
- 问题:即使使用了MVC,我们仍然需要为每个功能编写一个Servlet,配置
web.xml,处理请求参数、封装对象等,这些工作非常繁琐且重复。 - 演进:为了解决这些问题,前端控制器模式出现了,它引入一个核心的
FrontControllerServlet,所有请求都先交给它,这个FrontController根据请求信息,决定调用哪个具体的业务处理器,并负责通用的流程控制(如参数解析、异常处理)。这就是现代Web框架(如Struts 2, Spring MVC)的核心思想。
- 问题:即使使用了MVC,我们仍然需要为每个功能编写一个Servlet,配置
第四部分:数据交互 - 会话与连接
一个Web应用需要记住用户的状态,并且需要高效地与数据库交互。
会话管理
HTTP是无状态的,服务器默认不记得前后的请求,为了解决这个问题,我们引入了会话。
-
Cookie:
- 是什么:服务器发送给浏览器的一段文本信息,浏览器会将其保存,并在后续的每次请求中自动携带这段文本。
- 作用:通常用来记录用户的身份标识(Session ID),就像餐厅给顾客发的手环。
- 特点:数据存储在客户端,可以设置过期时间,但大小有限(通常4KB),且用户可以禁用。
-
Session:
- 是什么:服务器端的一块内存空间,用于存储特定用户的数据,它由
HttpSession对象表示。 - 作用:存储用户的登录信息、购物车内容等敏感或大量的数据。
- 工作原理:服务器在创建Session后,会生成一个唯一的
Session ID,然后通过Cookie将这个ID发送给浏览器,浏览器后续每次请求都会带上这个ID,服务器通过ID找到对应的Session对象。 - 特点:数据存储在服务器端,相对安全,但会占用服务器内存,有超时时间。
- 是什么:服务器端的一块内存空间,用于存储特定用户的数据,它由
数据库连接
Java Web应用几乎离不开数据库,早期,每个请求都创建一个新的数据库连接,效率极低。
- 连接池:
- 是什么:一个管理数据库连接的缓存池,应用启动时,预先创建一批连接并放入池中。
- 工作原理:当需要访问数据库时,从池中“借用”一个连接,用完后“归还”给池,而不是销毁,这样避免了频繁创建和销毁
