Tomcat与Servlet全套小白教程

📅 2026/8/23 9:00:21
Tomcat与Servlet全套小白教程
一、前言我们已经学会Java基础、JDBC数据库操作现在正式进入Java Web后端开发。Java Web是传统后端开发的基石Servlet是整个Java Web体系的核心Tomcat是运行Web项目的服务器。很多初学者分不清转发与重定向、Cookie和Session不懂过滤器、监听器的使用场景写项目时频繁踩坑。本文循序渐进学习网络基础、Tomcat服务器、Servlet核心、请求响应对象、转发重定向、CookieSession、过滤器、监听器、JSP与项目部署。全部知识点搭配实操代码适合掌握Java和JDBC想要入门后端Web开发的小白。二、网络基础与Tomcat服务器搭建1、基础概念• 内网局域网、私网主要是指在小范围内的计算机互联网络。• 外网广域网、公网连接多个地区、城市和国家或横跨几个洲并能提供远距离通信。• IP地址互联网协议地址• 公有地址需要注册才能获得。• 私有地址属于非注册地址。A类 10.0.0.0--10.255.255.255公司常见B类 172.16.0.0--172.31.255.255Docker容器常见C类 192.168.0.0--192.168.255.255家庭常见• 127.0.0.1localhost 自己的计算机在软件开发中有两种软件架构方式• CS架构• Client/Server客户端/服务器• 必须在客户端安装特定软件• 优点图形效果显示较好如3D游戏• 缺点服务器的软件和功能进行升级客户端也必须升级不利于维护• BS架构• Browser/Server浏览器/服务器• 无需安装客户端任何浏览器都可以直接访问• 优点涉及到功能升级只需要升级服务器端• 缺点图形显示效果不如CS架构• 需要通过HTTP协议访问• 什么是Web万维网简单理解就是网站用来表示Internet主机上供外界访问的资源• 供外界访问的资源分为两大类• 静态资源HTML、CSS、JS• 动态资源JSP、Servlet• 在Java中动态Web资源开发技术我们统称为Java Web• Web服务器• Web服务器是运行及发布Web应用的容器• 只有将开发的Web项目放置到容器中项目部署才能使网络中的用户通过浏览器进行访问• 常见服务器• 开源OpenSource1、开放源代码 2、免费• Tomcat主流web服务器之一适合初学者• Jetty• Resin• 收费• WebLogicOracle• WebSphereIBM• 提供相应的服务与支持软件大耗资源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接口底层全部基于Servlet3、运行前提① 不能直接用 main() 运行必须全部放到Tomcat服务器中运行② 浏览器通过 http://ip:端口/项目名/访问地址 访问它4、Servlet配置两种方式方式一注解配置现在最常用//访问地址http://localhost:8080/项目名/hello WebServlet(/hello) public class HelloServlet extends HttpServlet{}方式二web.xml老式配置了解即可servlet servlet-nameFistServlet/servlet-name # 自定义名 servlet-classtest.servlet.FisrServlet/servlet-class # 处理请求的类,填写类的全路径 /servlet servlet-mapping servlet-nameFirstServlet/servlet-name # 与上面一致 url-pattern/first.html/url-pattern # 写请求地址 /servlet-mapping5、最简单Servlet实现步骤1导入依赖Mavendependencies dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/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; charsetUTF-8)• 通过 getWriter() 向页面输出文字• 实现重定向跳转高频问题中文乱码本质是浏览器与服务器编码格式不一致开发第一时间统一UTF-83、实战举例ParameterUtil工具类用于接收请求参数并安全转为整数参数为空或格式错误时返回null捕获转换异常避免程序崩溃TestServlet通过注解配置访问路径调用该工具获取id参数设置编码解决中文乱码对参数合法性做判断参数异常就向页面输出提示信息实现参数获取、类型转换、异常处理逻辑的代码复用。• 通过表单来提交信息打开当前工程的index.jsp页面jsp页面是用来存放HTML代码的地方在当前页面中编写一个form表单form表单的提交地址是TestServlet也就是Servlet对应的地址五、请求转发和重定向(重点)web开发中两种页面跳转方式面试非常爱问很多同学分不清核心区别几次请求、地址栏不变、能不能带request数据、能不能跳外部网站。1、请求转发 forwardrequest.getRequestDispatcher(目标地址).forward(request, response);•服务器内部跳转整个跳转动作发生在Tomcat服务器里面浏览器完全不知道发生了页面跳转•一次HTTP请求浏览器只发一次请求给服务器服务器内部换个资源继续处理从头到尾是同一个request对象• ✅可以使用request域传递数据: request.setAttribute(key, 值), 跳转之后目标页面可以拿到这个数据• ❗限制只能跳转到当前项目里面的资源,不能跳转到百度、其他网站• 浏览器地址栏URL不会发生任何变化举例子用户提交表单Servlet处理完把查询出来的数据存到request转发到jsp页面展示数据地址栏依旧停留在表单提交的地址。常见坑转发地址写路径写 /xxx.jsp 代表项目根路径不能写 https://www.baidu.com 会报错代码演示每按一次刷新控制台就会输出一次响应2、重定向 sendRedirectresponse.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与监听器Listener1、Filter 过滤器Filter相当于请求的门卫。执行流程浏览器请求 → Filter过滤器 → Servlet执行业务 → 响应返回 → 再次回到Filter1.1 作用① 统一设置请求、响应编码解决中文乱码最常用② 登录权限校验某些页面必须登录才能访问没登录直接拦截跳转到登录页③ 过滤非法字符、屏蔽资源访问1.2 过滤链一个请求可以经过多个Filter执行顺序由注解/配置文件顺序决定。请求按配置顺序执行 Filter1 → Filter2响应回来逆序 Filter2 → Filter11.3 核心方法• init()过滤器初始化项目启动执行一次• doFilter(request, response, chain)拦截每一次请求chain.doFilter() 放行不放行就直接拦截• destroy()项目关闭销毁过滤器• 代码演示1.4 Filter过滤器两种配置方式方式一注解配置推荐不用写xml只需要在Filter类上面加 WebFilter// 只拦截所有Servlet WebFilter(/servlet/*) // 只拦截单个页面 WebFilter(/login.jsp) // 拦截后缀所有.do结尾请求 WebFilter(*.do)• 拦截路径规则① /*拦截所有资源Servlet、jsp、html、图片② /xxx/*拦截该路径下面全部资源③ *.后缀不能加斜杠*.do、*.action✅/*.do❌报错④ /xxx.jsp精准匹配只拦截这一个页面方式二web.xml配置老式可以控制执行顺序在 WEB-INF/web.xml 里面配置!-- 注册过滤器 -- filter filter-nameEncodingFilter/filter-name filter-classcom.xxx.EncodingFilter/filter-class /filter !-- 过滤器映射拦截路径 -- filter-mapping filter-nameEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping• 写多个 filter-mappingxml从上到下的顺序就是过滤器执行顺序先写的先拦截1.5 登录拦截演示这个过滤器拦截所有以.html结尾的请求如果访问的是login.html就直接放行否则就去session中判断有没有登录标记没有登录就重定向跳转到index.jsp如果session存在登录信息就放行访问目标资源。2、监听器 Listener2.1 Listener介绍Listener用来监听域对象的事件对象创建、销毁、增加属性、删除属性。三大域对象ServletContext整个项目、Session用户会话、ServletRequest一次请求2.2 使用场景① 统计网站在线人数监听Session创建销毁一个用户打开浏览器创建Session人数1关闭会话销毁Session人数-1② 项目启动时加载初始化配置项目一启动就读取配置文件创建连接池等资源实际开发Filter经常写Listener业务场景很少了解原理即可。2.3 Listener配置两种方式方式一web.xml配置listener listener-classxxx.TestContextListener/listener-class /listener方式二注解配置推荐不用写xml在当前类上加上 WebListenerWebListener• 代码演示七、Cookie与会话Session1、会话概念会话打开浏览器访问网站浏览多个页面直到关闭浏览器整个过程就是一次会话。HTTP协议是无状态协议服务器不会记住你是谁。每一次http请求都是独立的服务器分不清两次请求是不是同一个用户。所以需要会话技术Cookie、Session 保存用户状态。2、CookieCookie数据保存在客户端浏览器本地• 数据存浏览器不是服务器大小有限制单个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、SessionSession数据保存在服务端Tomcat内存中• 安全性高可以保存登录用户、权限等敏感数据• 原理服务器创建Session对象生成唯一字符串SessionId把SessionId放到Cookie下发给浏览器。浏览器下次访问携带Cookie里的SessionId服务器根据id找到属于你的Session对象。• 默认关闭浏览器存SessionId的Cookie消失虽然服务器Session对象还在但是浏览器找不到对应Session会话失效。• 服务器长时间用户不操作Session会超时销毁Tomcat默认30分钟• 代码演示4、Cookie VS SessionCookie数据在浏览器不安全容量小适合少量非敏感数据Session数据在服务器安全适合保存登录用户等敏感信息依赖Cookie传递SessionId如果浏览器禁用CookieSession还能用吗不能靠Cookie传递SessionId可以使用URL重写把SessionId拼接在url后面现在很少使用八、JSP基础与Web项目部署1、JSPJSP本质上就是Servlet。JSP文件运行的时候Tomcat会把JSP翻译成Java Servlet源代码编译class运行。作用可以HTML和Java代码混写早期用来做页面渲染。❗现在前后端分离项目基本不用JSP后端只返回JSON前端Vue渲染页面。只需要懂基础语法看懂旧项目。• JSP基础语法① JSP脚本% java代码 % 写Java逻辑% for(int i0; i5; i){ out.print(*br/); } String namehello; %② include标签可以引入别的页面%include fileindex.jsp%③ 输出变量% 变量名%% name%④ JSTL标签库if、for循环标签页面做判断循环c:forEach begin1 end5 *br/ /c:forEachc:if test${stu.gender男} td bgcolorblack${stu.gender}/td /c:if⑤ EL表达式 ${user.name}简化获取域对象数据替代jsp脚本c:forEach items${requestScope.studentList} varstu tr td${stu.id}/td td${stu.name}/td td${stu.job}/td /tr /c:forEach⑥ 三目运算符td bgcolor${stu.gender女?green:red}${stu.gender}/td• JSP关系运算符关系运算符说明范例结果 或 eq等于${55) 或 ${5 eq 5}true! 或 ne不等于${5!5} 或 ${5 ne 5}false 或 lt小于${35} 或 {3 lt 5}true 或 gt大于${35} 或 {3 gt 5}false 或 le小于等于${35} 或 ${3 le 5}true 或 ge大于等于${35} 或 ${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九大内置对象对象名类型说明requestjavax.servlet.http.HttpServletRequestresponsejavax.servlet.http.HttpServletResponsesessionjavax.servlet.http.HttpSession由sessiontrue开关applicationjavax.servlet.ServletContextexceptionjava.lang.Throwable由isErrorPagefalse开关pagejava.lang.Object当前对象this当前servlet实例configjavax.servlet.ServletConfigpageContextjavax.servlet.jsp.JspWriteroutjavax.servlet.jsp.PageContextjavax.servlet.jsp.JspWriter2、Web项目部署上线开发完Java Web项目本地IDEA跑通之后部署到外部Tomcat。① 把项目打包成war包② 将war包复制到Tomcat目录下 webapps 文件夹可以给war包起个名字war包的名字就是程序在启动后的部署路径③ 点击startup.bat启动TomcatTomcat会自动解压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管理系统的能力。