一、Servlet 相关
- 什么是 Servlet?它是怎么工作的?
- Servlet 就是一个“专门处理 HTTP 请求的 Java 类”。你把它想象成 餐厅的前台服务员:顾客(浏览器)点菜(发送请求),服务员把菜单递给后厨(调用你的业务代码),再把做好的菜端回给顾客(返回响应)。
- 工作流程:
- 你在浏览器输入网址,比如
http://localhost:8080/myapp/login - Web 容器(比如 Tomcat)找到对应的 Servlet(比如
LoginServlet) - 容器调用 Servlet 的
service()方法,它再根据 GET/POST 调用doGet()或doPost() - 你在这些方法里写逻辑:取参数、查数据库、返回结果(HTML 或 JSON)
- 你在浏览器输入网址,比如
- Servlet 的生命周期(从生到死)
- 出生(加载和实例化):服务器启动时或第一次访问时,容器创建 Servlet 对象(调用构造方法)。
- 初始化(
init):只执行一次,用来加载配置、建立数据库连接等。好比“岗前培训”。 - 服务(
service→doGet/doPost):每次请求都执行,处理具体业务。就像每天上班干活。 - 销毁(
destroy):服务器关闭或应用卸载时调用,用来释放资源(关连接等)。好比“退休交接”。
- Servlet 是单例吗?线程安全吗?
- 是单例:整个应用只有一个 Servlet 实例。
- 线程不安全:因为多个请求会同时调用同一个 Servlet 实例的
service方法(每个请求一个线程),如果 Servlet 里有可变的成员变量,多线程修改就会出问题。 - 解决办法:
- 尽量不用成员变量,用局部变量(每个请求独一份)。
- 如果必须用,加
synchronized同步锁(但会影响性能)。 - 实现
SingleThreadModel接口(已废弃,不推荐)。
4. doGet 和 doPost 的区别?
| 对比 | doGet | doPost |
| 请求方式 | GET | POST |
| 参数位置 | URL 后面(?name=张三) | 请求体里(看不见) |
| 长度限制 | 有(浏览器/服务器限制,一般 2~8KB) | 无限制(可以传文件) |
| 安全性 | 低(参数暴露在地址栏) | 高 |
| 使用场景 | 查询数据、获取页面 | 提交表单、上传文件、修改数据 |
二、转发(Forward)与重定向(Redirect)
- 转发和重定向有什么区别?(必考题)
| 对比 | 转发(forward) | 重定向(sendRedirect) |
| 发生位置 | 服务器内部 | 浏览器(客户端) |
| 地址栏 | 不变 | 变成新地址 |
| 请求次数 | 1 次 | 2 次(第一次返回 302,第二次访问新地址) |
| 能否共享 request 数据 | 能(同一请求对象) | 不能(两次不同请求) |
| 代码示例 | request.getRequestDispatcher(“/target”).forward(req, resp); | response.sendRedirect(“/target”); |