一、前言
我们已经学会Java基础、JDBC数据库操作,现在正式进入Java Web后端开发。Java Web是传统后端开发的基石,Servlet是整个Java Web体系的核心,Tomcat是运行Web项目的服务器。很多初学者分不清转发与重定向、Cookie和Session,不懂过滤器、监听器的使用场景,写项目时频繁踩坑。
本文循序渐进学习:网络基础、Tomcat服务器、Servlet核心、请求响应对象、转发重定向、Cookie&Session、过滤器、监听器、JSP与项目部署。全部知识点搭配实操代码,适合掌握Java和JDBC,想要入门后端Web开发的小白。
二、网络基础与Tomcat服务器搭建
1、基础概念
• 内网(局域网、私网):主要是指在小范围内的计算机互联网络。
• 外网(广域网、公网):连接多个地区、城市和国家,或横跨几个洲并能提供远距离通信。
• IP地址:互联网协议地址
• 公有地址:需要注册才能获得。
• 私有地址:属于非注册地址。
A类 10.0.0.0--10.255.255.255(公司常见)
B类 172.16.0.0--172.31.255.255(Docker容器常见)
C类 192.168.0.0--192.168.255.255(家庭常见)
• 127.0.0.1=localhost 自己的计算机
在软件开发中,有两种软件架构方式:
• CS架构:
• Client/Server:客户端/服务器
• 必须在客户端安装特定软件
• 优点:图形效果显示较好(如:3D游戏)
• 缺点:服务器的软件和功能进行升级,客户端也必须升级,不利于维护
• BS架构
• Browser/Server:浏览器/服务器
• 无需安装客户端,任何浏览器都可以直接访问
• 优点:涉及到功能升级,只需要升级服务器端
• 缺点:图形显示效果不如CS架构
• 需要通过HTTP协议访问
• 什么是Web:万维网,简单理解就是网站,用来表示Internet主机上供外界访问的资源
• 供外界访问的资源分为两大类:
• 静态资源:HTML、CSS、JS
• 动态资源:JSP、Servlet
• 在Java中,动态Web资源开发技术我们统称为Java Web
• Web服务器:
• Web服务器是运行及发布Web应用的容器
• 只有将开发的Web项目放置到容器中(项目部署),才能使网络中的用户通过浏览器进行访问
• 常见服务器:
• 开源:OpenSource(1、开放源代码 2、免费)
• Tomcat(主流web服务器之一,适合初学者)
• Jetty
• Resin
• 收费:
• WebLogic(Oracle)
• WebSphere(IBM)
• 提供相应的服务与支持,软件大,耗资源
2、Tomcat服务器
2.1 Tomcat是什么
Tomcat是免费开源的Web容器(Servlet容器)
作用:接收浏览器HTTP请求,调用我们编写的Servlet代码,最后把执行结果响应给浏览器。
2.2 Tomcat安装配置步骤
① 访问Tomcat官网https://tomcat.apache.org/(推荐9版本,稳定)
② 解压到纯英文无空格路径
③ 配置CATALINA_HOME环境变量


④ bin目录运行 startup.bat 启动,访问 http://localhost:8080 验证

2.3 IDEA整合Tomcat
① 点击新建一个Java项目,左键单击你的项目名称,然后双击shift,搜索"Add Framework Support"/添加框架支持(这个选项会让你为项目添加不同的框架支持)。

② 在弹出窗口中,勾选【Web Application】/ Web 应用程序,然后点击【OK】。

这时,IDEA 会为你创建一个名为 web 的文件夹。

③ 在WEB-INF下创建一个lib目录和classes目录(lib 文件夹将用于存放项目的依赖库,classes 文件夹将存放编译后的代码。)

④ 导入servlet的jar包,点击文件-项目结构-库,然后点击+,添加刚刚的lib目录,点击应用、确定即可


⑤ 点击文件-设置,找到应用程序服务器,点击"+",选择Tomcat 服务器

⑥ 点击文件图标,选中你的Tomcat下载目录,点击Ok

⑦ 点击旁边如下图框中的"+",选择你的Tomcat的Lib目录,点击Ok

⑧ 形成下图效果就表示成功。点击OK退出

⑨ 点击run,找到Edit点击,然后点击"+"号,寻找Tomcat server下的Local

⑩ 在下图界面点击Configure,再次选择Tomcat的下载目录。再进入Deployment,点击"+",添加Artifack

点击下方Services,点击Tomcat,点击右边的绿三角启动。

三、Servlet基础与生命周期
1、Servlet是什么
Servlet是运行在Tomcat(Web服务器)中的Java程序,用来接收浏览器请求,处理业务,返回响应,Java Web的核心。
通俗比喻:浏览器等于顾客,Tomcat等于门店,Servlet等于店里的前台服务员。顾客(浏览器)进店提需求(访问网址、提交表单),服务员(Servlet)接受请求、干活查数据、最后把结果回复给客户。
2、Servlet解决了什么问题
① 纯静态HTML只能看固定页面,没法做登录、注册、查询数据库这类动态功能
② Servlet 让Java代码可以和浏览器交互,实现动态网页
③ 所有后面学的SpringMVC、SpringBoot接口,底层全部基于Servlet
3、运行前提
① 不能直接用 main() 运行,必须全部放到Tomcat服务器中运行
② 浏览器通过 http://ip:端口/项目名/访问地址 访问它
4、Servlet配置(两种方式)
方式一:注解配置(现在最常用)
java
//访问地址:http://localhost:8080/项目名/hello
@WebServlet("/hello")
public class HelloServlet extends HttpServlet{}
方式二:web.xml老式配置(了解即可)
XML
<servlet>
<servlet-name>FistServlet</servlet-name> # 自定义名
<servlet-class>test.servlet.FisrServlet</servlet-class> # 处理请求的类,填写类的全路径
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name> # 与上面一致
<url-pattern>/first.html</url-pattern> # 写请求地址
</servlet-mapping>
5、最简单Servlet实现
步骤1:导入依赖(Maven)
XML
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
步骤2:自己写一个类,实现Servlet接口(最常用:继承HttpServlet)

步骤3:配置访问路径(两种方式)
详情看"Servlet配置(两种方式)"
6、Servlet生命周期(三大核心方法)
① init():Servlet第一次被访问时创建对象,只执行1次,初始化资源
② service():每次浏览器发起请求都会执行,处理请求业务逻辑
③ destroy():服务器正常关闭时执行1次,释放资源
❗重点:Servlet是单例对象,多个用户同时访问共用同一个Servlet,不要定义成员变量存储数据,会出现线程安全问题!!

当收到请求后,容器会检查是否已经创建了该Servlet对象,如果没有创建,则先创建Servlet对象,调用构造方法,在创建完Servlet对象之后会自动调用 init() 方法进行初始化操作,init() 方法只会执行一次,针对每一次请求,Servlet都会调用 service() 方法进行处理,每次请求都会调用 service() 方法,在服务器被停止或者重启之前,调用 destroy() 方法进行资源的释放。
@WebServlet(urlPatterns = "/FirstServlet", loadOnStartup = 0)
配置loadOnStartup参数用来设置Servlet实例创建的时机,数值越小,优先级越高!!!
四、HttpServletRequest请求与HttpServletResponse响应
浏览器访问服务器,Tomcat自动封装两个核心对象:
1、HttpServletRequest request:请求对象
封装浏览器发来的所有数据:请求地址、请求头、表单参数。
常用方法:
• getParameter("name"):获取前端传递参数



• getParameterValues():获取复选框一类多值参数
• setAttribute():域对象存入数据(用于请求转发)
2、HttpServletResponse response:响应对象
负责把Java程序的数据返回给浏览器。
常用功能:
• 设置响应编码,解决中文乱码,response.setContentType("test.html"; charset=UTF-8)
• 通过 getWriter() 向页面输出文字



• 实现重定向跳转
高频问题:中文乱码,本质是浏览器与服务器编码格式不一致,开发第一时间统一UTF-8
3、实战举例


ParameterUtil工具类用于接收请求参数并安全转为整数,参数为空或格式错误时返回null,捕获转换异常避免程序崩溃;TestServlet通过注解配置访问路径,调用该工具获取id参数,设置编码解决中文乱码,对参数合法性做判断,参数异常就向页面输出提示信息,实现参数获取、类型转换、异常处理逻辑的代码复用。
• 通过表单来提交信息
打开当前工程的index.jsp页面,jsp页面是用来存放HTML代码的地方,在当前页面中编写一个form表单,form表单的提交地址是TestServlet,也就是Servlet对应的地址



五、请求转发和重定向(重点)
web开发中两种页面跳转方式,面试非常爱问,很多同学分不清,核心区别:几次请求、地址栏不变、能不能带request数据、能不能跳外部网站。
1、请求转发 forward
java
request.getRequestDispatcher("目标地址").forward(request, response);
• **服务器内部跳转:**整个跳转动作发生在Tomcat服务器里面,浏览器完全不知道发生了页面跳转
• **一次HTTP请求:**浏览器只发一次请求给服务器,服务器内部换个资源继续处理,从头到尾是同一个request对象
• ✅可以使用request域传递数据: request.setAttribute("key", 值), 跳转之后目标页面可以拿到这个数据
• ❗限制:只能跳转到当前项目里面的资源,不能跳转到百度、其他网站
• 浏览器地址栏:URL不会发生任何变化
举例子:用户提交表单,Servlet处理完,把查询出来的数据存到request,转发到jsp页面展示数据,地址栏依旧停留在表单提交的地址。
常见坑:转发地址写路径:写 /xxx.jsp 代表项目根路径;不能写 https://www.baidu.com ,会报错
代码演示:


每按一次刷新,控制台就会输出一次响应

2、重定向 sendRedirect
java
response.sendRedirect("目标地址");
• 两次HTTP请求
① 第一次:浏览器请求Servlet
② 服务器返回302状态码+新的访问地址
③ 浏览器收到响应,自动发起第二次全新请求访问新地址
• 浏览器地址栏URL会变成新地址
• ❗两次请求,是两个完全独立的request对象,request域存的数据跳转后全部丢失,不能共享
• ✅既可以跳转本项目资源,也可以跳转到外部网址,例如:response.sendRedirect("https://www.baidu.com");
举例子:用户登录成功,重定向跳转到首页;地址栏变成首页URL。如果此时用转发,用户刷新浏览器会重复提交表单。
代码演示:
刷新后,浏览器中的地址发生了跳转,控制台上会发现当前的BServlet没有拿到AServlet传递的信息


• request.getContextPath()+"/b.html"获取当前的部署路径
3、转发 VS 重定向
① 需要把数据通过request传给下一个资源、只访问本项目内部资源 → 请求转发
② 需要改变浏览器地址栏、防止表单重复提交、跳转外部网站 → 重定向
|------------|--------------|------------------|
| 对比项 | 请求转发 forward | 重定向 sendRedirect |
| 请求次数 | 1次 | 2次 |
| 地址栏 | 不变 | 改变 |
| request域共享 | 可以共享 | 不可以共享 |
| 跳转范围 | 仅限本项目 | 内部资源+外部资源 |
| 发生位置 | 服务器内部 | 浏览器执行跳转 |
面试高频追问:表单提交为什么建议重定向?
如果用转发,用户按下F5刷新浏览器,会再次把表单数据提交一遍,造成重复提交数据;重定向刷新只会请求首页,不会重复提交表单。
六、过滤器Filter与监听器Listener
1、Filter 过滤器
Filter相当于请求的门卫。
执行流程:浏览器请求 → Filter过滤器 → Servlet执行业务 → 响应返回 → 再次回到Filter
1.1 作用
① 统一设置请求、响应编码,解决中文乱码(最常用)
② 登录权限校验:某些页面必须登录才能访问;没登录直接拦截跳转到登录页
③ 过滤非法字符、屏蔽资源访问
1.2 过滤链
一个请求可以经过多个Filter,执行顺序由注解/配置文件顺序决定。请求按配置顺序执行 Filter1 → Filter2;响应回来逆序 Filter2 → Filter1
1.3 核心方法
• init():过滤器初始化,项目启动执行一次
• doFilter(request, response, chain):拦截每一次请求;chain.doFilter() 放行,不放行就直接拦截
• destroy():项目关闭销毁过滤器
• 代码演示

1.4 Filter过滤器两种配置方式
方式一:注解配置(推荐,不用写xml)
只需要在Filter类上面加 @WebFilter
java
// 只拦截所有Servlet
@WebFilter("/servlet/*")
// 只拦截单个页面
@WebFilter("/login.jsp")
// 拦截后缀,所有.do结尾请求
@WebFilter("*.do")
• 拦截路径规则
① /*:拦截所有资源(Servlet、jsp、html、图片)
② /xxx/*:拦截该路径下面全部资源
③ *.后缀:不能加斜杠,*.do、*.action✅;/*.do❌报错
④ /xxx.jsp:精准匹配,只拦截这一个页面
方式二:web.xml配置(老式,可以控制执行顺序)
在 WEB-INF/web.xml 里面配置
XML
<!-- 注册过滤器 -->
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.xxx.EncodingFilter</filter-class>
</filter>
<!-- 过滤器映射,拦截路径 -->
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
• 写多个 filter-mapping,xml从上到下的顺序,就是过滤器执行顺序,先写的先拦截


1.5 登录拦截演示

这个过滤器拦截所有以.html结尾的请求,如果访问的是login.html就直接放行;否则就去session中判断有没有登录标记,没有登录就重定向跳转到index.jsp,如果session存在登录信息,就放行访问目标资源。
2、监听器 Listener
2.1 Listener介绍
Listener用来监听域对象的事件:对象创建、销毁、增加属性、删除属性。
三大域对象:ServletContext(整个项目)、Session(用户会话)、ServletRequest(一次请求)
2.2 使用场景
① 统计网站在线人数:监听Session创建销毁,一个用户打开浏览器创建Session人数+1;关闭会话销毁Session人数-1
② 项目启动时加载初始化配置:项目一启动就读取配置文件,创建连接池等资源
实际开发:Filter经常写;Listener业务场景很少,了解原理即可。
2.3 Listener配置(两种方式)
方式一:web.xml配置
XML
<listener>
<listener-class>xxx.TestContextListener</listener-class>
</listener>
方式二:注解配置(推荐,不用写xml)
在当前类上加上 @WebListener
java
@WebListener
• 代码演示:


七、Cookie与会话Session
1、会话概念
会话:打开浏览器访问网站,浏览多个页面,直到关闭浏览器,整个过程就是一次会话。
HTTP协议是无状态协议:服务器不会记住你是谁。每一次http请求都是独立的,服务器分不清两次请求是不是同一个用户。所以需要会话技术:Cookie、Session 保存用户状态。
2、Cookie
Cookie:数据保存在客户端(浏览器本地)
• 数据存浏览器,不是服务器;大小有限制,单个cookie很小
• 默认明文存储,不安全,不能存放密码这类敏感信息
• Cookie中的信息是以 key value 的形式储存的,一个名称对应一个值,Cookie中所有的值都是字符串类型的
• 可以设置存活时间:
• 默认会话Cookie:浏览器关闭,Cookie直接删除
• 设置setMaxAge,持久Cookie:关闭浏览器依旧保存在本地,到期自动删除
• 浏览器访问网站的时候,会自动把该网站的Cookie随请求头带给服务器
使用场景:记住用户名、免密勾选、浏览记录
缺点:用户可以手动清除浏览器Cookie,也可以禁用Cookie
• 代码演示:


可以通过cookie.setPath("目标路径")来修改cookie的存储路径

若想在程序中读取cookie,去要从request中获取

访问b.html后控制台上可以看到当前站点所有的cookie

为了保证安全性,可以通过cookie的setMaxAge()方法设置cookie的有效期,cookie的有效期有三种值,零正数和负数,如果是一个正数的话,代表cookie的有效期是多少秒,如果是0则此刻失效,当为负数时,代表关闭浏览器后失效
3、Session
Session:数据保存在服务端Tomcat内存中
• 安全性高,可以保存登录用户、权限等敏感数据
• 原理:服务器创建Session对象,生成唯一字符串SessionId;把SessionId放到Cookie下发给浏览器。浏览器下次访问,携带Cookie里的SessionId;服务器根据id找到属于你的Session对象。
• 默认:关闭浏览器,存SessionId的Cookie消失;虽然服务器Session对象还在,但是浏览器找不到对应Session,会话失效。
• 服务器长时间用户不操作,Session会超时销毁(Tomcat默认30分钟)
• 代码演示:




4、Cookie VS Session
Cookie:数据在浏览器,不安全,容量小,适合少量非敏感数据
Session:数据在服务器,安全,适合保存登录用户等敏感信息;依赖Cookie传递SessionId
如果浏览器禁用Cookie,Session还能用吗?
不能靠Cookie传递SessionId,可以使用URL重写把SessionId拼接在url后面,现在很少使用
八、JSP基础与Web项目部署
1、JSP
JSP本质上就是Servlet。JSP文件运行的时候,Tomcat会把JSP翻译成Java Servlet源代码,编译class运行。
作用:可以HTML和Java代码混写,早期用来做页面渲染。
❗现在前后端分离项目基本不用JSP,后端只返回JSON,前端Vue渲染页面。只需要懂基础语法看懂旧项目。
• JSP基础语法
① JSP脚本:<% java代码 %> 写Java逻辑
java
<%
for(int i=0; i<5; i++){
out.print("*<br/>");
}
String name="hello";
%>
② include标签可以引入别的页面
java
<%@include file="index.jsp"%>
③ 输出变量<%= 变量名%>
java
<%= name%>
④ JSTL标签库:if、for循环标签,页面做判断循环
java
<c:forEach begin="1" end="5">
*<br/>
</c:forEach>
java
<c:if test="${stu.gender=='男'}">
<td bgcolor="black">${stu.gender}</td>
</c:if>
⑤ EL表达式 ${user.name}:简化获取域对象数据,替代jsp脚本
java
<c:forEach items="${requestScope.studentList}" var="stu">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.job}</td>
</tr>
</c:forEach>
⑥ 三目运算符
java
<td bgcolor="${stu.gender=='女'?'green':'red'}">${stu.gender}</td>
• JSP关系运算符
|----------|------|----------------------|-------|
| 关系运算符 | 说明 | 范例 | 结果 |
| == 或 eq | 等于 | {5==5) 或 {5 eq 5} | true |
| != 或 ne | 不等于 | {5!=5} 或 {5 ne 5} | false |
| < 或 lt | 小于 | {3\<5} 或 \&{3 lt 5} | true |
| \> 或 gt | 大于 | {3>5} 或 &{3 gt 5} | false |
| <= 或 le | 小于等于 | {3\<=5} 或 {3 le 5} | true |
| >= 或 ge | 大于等于 | {3\>=5} 或 {3 ge 5} | false |
• JSP逻辑运算符
|------------|----|----------------------------|------------|
| 逻辑运算符 | 说明 | 范例 | 结果 |
| && 或 and | 交集 | { A \&\& B} 或 { A and B} | true/false |
| || 或 or | 并集 | { A \|\| B} 或 { A or B} | true/false |
| !或 not | 非 | { !A } 或 { not A } | true/false |
• 域对象(四个域从小到大)
pageContext → requestScope(当前request对象) → sessionScope(当前的会话) → applicationScope(当前整个应用)
• JSP九大内置对象
|-------------|----------------------------------------|-----------------------------|
| 对象名 | 类型 | 说明 |
| request | javax.servlet.http.HttpServletRequest | |
| response | javax.servlet.http.HttpServletResponse | |
| session | javax.servlet.http.HttpSession | 由session="true"开关 |
| application | javax.servlet.ServletContext | |
| exception | java.lang.Throwable | 由isErrorPage="false"开关 |
| page | java.lang.Object当前对象this | 当前servlet实例 |
| config | javax.servlet.ServletConfig | |
| pageContext | javax.servlet.jsp.JspWriter | |
| out | javax.servlet.jsp.PageContext | javax.servlet.jsp.JspWriter |
2、Web项目部署上线
开发完Java Web项目,本地IDEA跑通之后,部署到外部Tomcat。
① 把项目打包成war包




② 将war包复制到Tomcat目录下 webapps 文件夹,可以给war包起个名字,war包的名字就是程序在启动后的部署路径

③ 点击startup.bat启动Tomcat:Tomcat会自动解压war
④ 打开浏览器访问项目

• 其他电脑访问:http://服务器IP:端口/项目名
可以修改conf下面的server.xml配置:
• 修改Tomcat端口(默认8080)
• 配置虚拟访问路径,不用带项目名访问
注意:生产环境一般不会直接用webapps部署,现在SpringBoot内置Tomcat,直接jar包运行,但是传统Java Web需要掌握war部署流程。
九、结语
本篇完整走完Java Web传统技术栈学习路线:Tomcat作为Web容器承载项目,Servlet负责接收浏览器请求;借助Request、Response完成数据交互;利用转发/重定向实现页面跳转;Cookie、Session解决会话保持问题;过滤器统一拦截请求,监听器监听对象状态变化。Servlet、Filter、Session等内容是SpringMVC底层原理,吃透这套基础,后续学习SSM、SpringBoot框架时更容易理解底层逻辑。学完本章,结合前面JDBC知识,已经具备了独立开发小型Java Web管理系统的能力。

