servlet菜鸟教程
作者:探索 来源:热点 浏览: 【大 中 小】 发布时间:2026-10-17 06:12:32 评论数:
Servlet 不是菜程框架,它只是鸟教 Java 对 HTTP 协议的一层封装。你写一个类继承 HttpServlet,菜程覆写 doGet 或 doPost,鸟教扔进 Tomcat 的菜程 webapps 目录,浏览器一敲地址,鸟教方法就被调用了。菜程就这么直接。鸟教
很多人第一次接触 Servlet 时会被 web.xml 吓到。菜程那堆 <servlet> 和 <servlet-mapping> 标签到底在干什么?鸟教其实就一件事:告诉容器,哪个 URL 交给哪个类处理。菜程比如你写了个 HelloServlet,鸟教想让 /hello 访问它,菜程就得在 web.xml 里配对。鸟教后来 Servlet 3.0 出了注解,菜程@WebServlet("/hello") 一行搞定,web.xml 才没那么烦人。但老项目里那坨配置还在,看不懂就寸步难行。
Tomcat 收到请求后的流程值得走一遍。浏览器发 GET /hello,Tomcat 解析 HTTP 报文,找到对应 Context(通常就是你的 war 包名),再根据 URL 匹配到具体 Servlet。如果这个 Servlet 是第一次被访问,容器会加载类、调 init(),然后才进 service()。service 方法根据请求方式分发给 doGet 或 doPost。请求结束,容器调 destroy() 回收。整个过程里,你的代码只在 doGet/doPost 里跑,其他都是容器在管。
有个坑我踩过:Servlet 实例是单例的。容器只创建一个对象,多个请求共用它。这意味着成员变量不安全。曾经我写了个计数器,把 count 定义成实例字段,每次 doGet 里 count++,结果并发一上来数字就乱。正确做法是把状态放数据库或 session 里,Servlet 本身保持无状态。
HttpServletRequest 和 HttpServletResponse 是核心工具。request 里能拿参数、头信息、cookie、session。response 用来写回数据、设状态码、加头。比如输出 JSON:
response.setContentType("application/json;charset=UTF-8"); PrintWriter out = response.getWriter(); out.write("{ \"name\":\"张三\"}"); 注意 setContentType 要在 getWriter() 之前调,否则编码不生效,中文变问号。这种细节文档不强调,但线上出问题就是它。
转发和重定向也容易混。转发是服务器内部跳,URL 不变,request 能带过去;重定向是告诉浏览器再发一次请求,URL 变,request 丢。写登录成功跳首页用重定向,查完数据渲染页面用转发。用错场景,要么表单重复提交,要么数据莫名丢失。
Servlet 现在很少单独用了,Spring MVC 底层还是它。但理解 Servlet 生命周期、请求响应模型、作用域,再看 Spring 的 DispatcherServlet 就透亮。跳过这层直接学框架,遇到过滤器链、监听器、session 共享这些问题,只能靠猜。
最后提一嘴:Servlet 的 load-on-startup 配置能让容器启动时就初始化,而不是等第一次请求。对初始化耗时的 Servlet 有用,比如加载缓存。配个正整数就行,数字越小优先级越高。不配的话,默认第一次访问才 init,用户得等。
