【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 3.0 新特性:异步处理与注解配置
<前文回顾>
<今日更新>
一、Servlet 3.0:JavaWeb 的“新纪元”
Servlet 3.0 在 2009 年发布,是 JavaWeb 开发的“新纪元”。它引入了两大新特性:异步处理 和 注解配置。异步处理让 Servlet 能“一心多用”,注解配置让 Servlet 能“轻装上阵”。
1. 异步处理:Servlet 的“一心多用”
异步处理是 Servlet 3.0 的“杀手锏”,它让 Servlet 能“一心多用”,处理多个请求。异步处理的核心是 AsyncContext,它能让 Servlet 把请求“挂起”,等处理完了再“唤醒”。
Java Code |
@WebServlet(urlPatterns = "/async", asyncSupported = true) public class AsyncServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { AsyncContext asyncContext = request.startAsync(); asyncContext.start(() -> { try { Thread.sleep(5000); // 模拟耗时操作 asyncContext.getResponse().getWriter().write("异步处理完成!"); } catch (Exception e) { e.printStackTrace(); } finally { asyncContext.complete(); } }); } } |
2. 注解配置:Servlet 的“轻装上阵”
注解配置是 Servlet 3.0 的“轻装上阵”,它让开发者能用注解配置 Servlet,不用再写 web.xml 了。注解配置的核心是 @WebServlet,它能定义 Servlet 的 URL 模式、初始化参数啥的。
Java Code |
@WebServlet(name = "MyServlet", urlPatterns = "/myServlet", initParams = { @WebInitParam(name = "param1", value = "value1"), @WebInitParam(name = "param2", value = "value2") }) public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String param1 = getInitParameter("param1"); String param2 = getInitParameter("param2"); response.getWriter().write("param1: " + param1 + ", param2: " + param2); } } |
二、异步处理的“实战演练”
异步处理虽然“高大上”,但用起来得“小心”。异步处理的核心是 AsyncContext,它能让 Servlet 把请求“挂起”,等处理完了再“唤醒”。
1. 启动异步处理
异步处理得用 request.startAsync() 启动,启动后 Servlet 就能“一心多用”了。
Java Code |
AsyncContext asyncContext = request.startAsync(); |
2. 处理异步请求
异步处理得用 asyncContext.start() 处理,处理完后得用 asyncContext.complete() 结束。
Java Code |
asyncContext.start(() -> { try { // 模拟耗时操作 Thread.sleep(5000); asyncContext.getResponse().getWriter().write("异步处理完成!"); } catch (Exception e) { e.printStackTrace(); } finally { asyncContext.complete(); } }); |
3. 设置超时时间
异步处理得设置超时时间,防止请求“卡死”。超时时间得用 asyncContext.setTimeout() 设置。
Java Code |
asyncContext.setTimeout(10000); // 10秒 |
三、注解配置的“实战演练”
注解配置虽然“轻装上阵”,但用起来得“灵活”。注解配置的核心是 @WebServlet,它能定义 Servlet 的 URL 模式、初始化参数啥的。
1. 定义 Servlet
Servlet 得用 @WebServlet 定义,定义后 Servlet 就能“轻装上阵”了。
Java Code |
@WebServlet(name = "MyServlet", urlPatterns = "/myServlet") public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("Hello, World!"); } } |
2. 定义初始化参数
Servlet 的初始化参数得用 @WebInitParam 定义,定义后 Servlet 就能“灵活配置”了。
Java Code |
@WebServlet(name = "MyServlet", urlPatterns = "/myServlet", initParams = { @WebInitParam(name = "param1", value = "value1"), @WebInitParam(name = "param2", value = "value2") }) public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String param1 = getInitParameter("param1"); String param2 = getInitParameter("param2"); response.getWriter().write("param1: " + param1 + ", param2: " + param2); } } |
3. 定义过滤器
过滤器得用 @WebFilter 定义,定义后过滤器就能“轻装上阵”了。
Java Code |
@WebFilter(urlPatterns = "/*") public class MyFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 过滤逻辑 chain.doFilter(request, response); } } |
四、Servlet 3.0 的“历史”:从 Servlet 2.5 到 Servlet 4.0
Servlet 3.0 从 Servlet 2.5 开始就有了,虽然现在 Servlet 4.0 已经“普及”了,但 Servlet 3.0 的“核心功能”依然没变。
1. Servlet 2.5:初代“老黄牛”
Servlet 2.5 在 2005 年发布,是 Servlet 的“初代老黄牛”。虽然功能简单,但已经能满足大部分开发需求了。
2. Servlet 3.0:引入异步处理与注解配置
Servlet 3.0 在 2009 年发布,引入了异步处理与注解配置,让 Servlet 的“玩法”更加丰富。
3. Servlet 4.0:支持 HTTP/2
Servlet 4.0 在 2017 年发布,支持 HTTP/2[1],让 Servlet 的性能更上一层楼。HTTP/2 的引入,让 Servlet 的“玩法”更加高效。
五、Servlet 3.0 的“骚操作”
1. 异步处理的“超时处理”
异步处理得设置超时时间,防止请求“卡死”。超时时间得用 asyncContext.setTimeout() 设置,超时后得用 asyncContext.complete() 结束。
Java Code |
asyncContext.setTimeout(10000); // 10秒 asyncContext.addListener(new AsyncListener() { public void onTimeout(AsyncEvent event) throws IOException { event.getAsyncContext().getResponse().getWriter().write("请求超时!"); event.getAsyncContext().complete(); } }); |
2. 注解配置的“多 URL 模式”
Servlet 的 URL 模式能定义多个,用 urlPatterns 数组定义。
Java Code |
@WebServlet(urlPatterns = {"/myServlet", "/myServlet2"}) public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("Hello, World!"); } } |
3. 注解配置的“过滤器链”
过滤器能定义多个,用 @WebFilter 定义,过滤器链的顺序得根据类名的字母顺序决定。
Java Code |
@WebFilter(urlPatterns = "/*") public class MyFilter1 implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 过滤逻辑 chain.doFilter(request, response); } } @WebFilter(urlPatterns = "/*") public class MyFilter2 implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 过滤逻辑 chain.doFilter(request, response); } } |