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 的
顶: 57374踩: 11328load-on-startup配置能让容器启动时就初始化,而不是等第一次请求。对初始化耗时的 Servlet 有用,比如加载缓存。配个正整数就行,数字越小优先级越高。不配的话,默认第一次访问才 init,用户得等。





评论专区