当前位置: 首页 > article >正文

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 3.0 新特性:异步处理与注解配置

 <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、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);

    }

}


http://www.kler.cn/a/585405.html

相关文章:

  • 上下左右移动的悬浮框/气泡
  • 基础知识《Redis解析》
  • Linux常用命令速查手册
  • MATLAB中edit函数用法
  • qt style-sheet样式不起作用问答
  • 什么是 Redis
  • HiPixel开源AI驱动的图像超分辨率的原生macOS 应用程序,使用 SwiftUI 构建并利用 Upscayl 强大的 AI 模型
  • 【6】拓扑排序学习笔记
  • Unity | 工具类:消息管理器-延迟分发
  • 如何解决 制造企业“一物多码”
  • Chrome 扩展开发 API实战:Proxy(七)
  • 呵护斜颈老人:解锁护理关键,重塑健康生活
  • 网站域名解析怎么更换DNS服务器?需要注意什么?
  • 抽象工厂模式的C++实现示例
  • 前端笔试常见的选择题目整理(HTML/CSS、JavaScript、框架、性能优化)
  • VIC模型率定验证
  • 从零基础到能独立设计单片机产品,一般需要经历哪些学习阶段?
  • 鸿蒙初级考试备忘
  • SmartFormat:轻量级文本模板库,轻松替代 string.Format
  • 如何上传文件到github