Part 1:Servlet是什么?
1.1 大白话定义
Servlet是服务员:
→ 顾客(浏览器)点单(发送请求)
→ 服务员接收订单(处理HTTP请求)
→ 制作咖啡(生成HTML响应)
→ 端给顾客(返回响应)
1.2 技术定义
- 运行在Web服务器上的Java程序
- 用于处理HTTP请求(GET/POST等)
- 生成动态网页内容
Part 2:为什么需要Servlet?
2.1 静态网页 vs 动态网页
类型 | 示例 | 缺点 |
---|---|---|
静态HTML | 纯文字介绍页 | 内容固定无法个性化 |
Servlet | 登录验证/购物车 | 动态生成不同用户的内容 |
2.2 工作流程
浏览器 → HTTP请求 → Web服务器 → Servlet → 数据库 → 生成HTML → 返回浏览器
Part 3:Servlet生命周期(咖啡师的一天)
3.1 三阶段流程
初始化--->服务--->销毁
3.2 详细说明
-
init():出生培训(只执行一次)
public void init(ServletConfig config) { System.out.println("Servlet出生啦~"); }
-
service():接单干活(每次请求都执行)
protected void service(HttpServletRequest req, HttpServletResponse resp) { String method = req.getMethod(); // GET/POST if ("GET".equals(method)) { doGet(req, resp); } // 类似处理其他方法... }
-
destroy():下班收工(服务器关闭时执行)
public void destroy() { System.out.println("Servlet退休啦~"); }
Part 4:手把手写一个Servlet
4.1 基础版Servlet(继承HttpServlet)
@WebServlet("/hello") // 告诉服务器路径映射
public class HelloServlet extends HttpServlet {
// 处理GET请求
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>你好呀~曼波!(✪▽✪)</h1>");
}
}
4.2 部署方式
方式1:注解配置(推荐)
@WebServlet(urlPatterns = {"/hello", "/hi"}) // 多个访问路径
方式2:web.xml配置(传统方式)
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
Part 5:Servlet常见用法
5.1 获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
5.2 设置响应内容
response.setContentType("text/html"); // HTML格式
response.setCharacterEncoding("UTF-8"); // 中文不乱码
// 写HTML内容
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<p>欢迎" + username + "</p>");
out.println("</body></html>");
5.3 重定向
response.sendRedirect("https://www.baidu.com");
5.4 转发请求
request.getRequestDispatcher("/welcome.jsp").forward(request, response);
Part 6:Servlet vs JSP
特性 | Servlet | JSP |
---|---|---|
本质 | Java类 | HTML+Java代码混合 |
擅长领域 | 业务逻辑处理 | 页面展示 |
执行效率 | 稍高(已编译) | 首次需转译为Servlet |
代码可读性 | Java代码中拼接HTML(麻烦) | HTML中嵌入Java(直观) |
Part 7:注意事项
7.1 线程安全问题
public class DangerServlet extends HttpServlet {
private int count; // ❌ 实例变量有线程安全问题!
protected void doGet(...) {
count++; // 多个线程同时修改会出错
}
}
解决方案:
→ 使用局部变量
→ 加锁(synchronized
)
→ 避免修改共享数据
7.2 初始化参数配置
<!-- web.xml中 -->
<servlet>
<init-param>
<param-name>email</param-name>
<param-value>manbo@example.com</param-value>
</init-param>
</servlet>
// Servlet中获取
String email = getServletConfig().getInitParameter("email");
Part 8:现代开发中的Servlet
虽然现在流行Spring MVC等框架,但它们底层仍然使用Servlet!
比如:
DispatcherServlet
是Spring MVC的核心- Filter(过滤器)本质也是Servlet规范的一部分