初学Javaweb的时候,第一次实操项目就被什么是servlet这个问题卡住,对着教程代码抄了半天,始终搞不懂这段代码到底在服务器里扮演什么角色。

一开始单纯以为servlet就是一段普通的Java代码,随便写个类跑起来就能处理网页访问请求,结果部署到Tomcat服务器后,页面一直404报错,折腾了整整一下午都没找到问题根源。当时完全摸不清逻辑,不知道为什么同样是Java类,普通主类能运行,写的servlet就完全没反应。

servlet的运行核心场景

后来才反应过来,servlet根本不是独立运行的程序,它没有main方法,没办法单独启动,必须依托Tomcat这类Javaweb容器才能执行。之前踩的最大的坑,就是把它当成普通Java程序直接运行,这也是所有新手最容易犯的低级错误。浏览器发送的每一次GET、POST请求,都会先被服务器容器拦截,容器再根据配置,把请求分发到对应的servlet类中处理。

很多人分不清servlet和普通Java类的区别,其实差别特别直白。普通Java类只在本地虚拟机执行,只能运行本地逻辑;而servlet是专门适配web场景的组件,专属任务就是接收前端参数、处理业务逻辑、返回响应数据,全程对接浏览器和服务器的数据交互。

超多人混淆servlet与JSP的关系。

servlet的实际落地用法

折腾好久才搞明白,早期的JSP本质上就是封装后的servlet。服务器运行JSP页面时,会自动把JSP解析成servlet代码再编译执行,只是JSP更侧重前端页面渲染,servlet更专注后端逻辑处理。现在开发基本很少直接手写原生servlet,但SpringMVC、SpringBoot的底层核心,依然是基于servlet规范搭建的,掌握它的底层逻辑,排查web请求报错会轻松很多。

我实操中唯一能用的落地方式,就是原生servlet的基础配置流程。新建Java类继承HttpServlet,重写doGet、doPost方法处理请求,再在web.xml中配置映射路径,或者用注解@WebServlet绑定访问地址,部署服务器后就能正常接收前端请求、返回文本或页面数据。这个方法不算便捷,但能百分百吃透web请求的基础流转逻辑。

最可惜的是,当初学的时候只想着照搬代码,没弄懂底层原理,导致后续学框架时,遇到请求参数接收异常、路径匹配失败等问题,完全无从下手。