Servlet3.0 新特性

合集下载

使用异步servlet提升性能

使用异步servlet提升性能

本文发布之后, 收到了很多的反馈。

基于这些反馈,我们更新了文中的示例,使读者更容易理解和掌握, 如果您发现错误和遗漏,希望能给我们提交反馈,帮助我们改进。

本文针对当今webapp 中一种常碰到的问题,介绍相应的性能优化解决方案。

如今的WEB程序不再只是被动地等待浏览器的请求, 他们之间也会互相进行通信。

典型的场景包括在线聊天, 实时拍卖等——后台程序大部分时间与浏览器的连接处于空闲状态, 并等待某个事件被触发。

这些应用引发了一类新的问题,特别是在负载较高的情况下。

引发的状况包括线程饥饿, 影响用户体验、请求超时等问题。

基于这类应用在高负载下的实践, 我会介绍一种简单的解决方案。

在Servlet 3.0成为主流以后, 这是一种真正简单、标准化并且十分优雅的解决方案。

在演示具体的解决方案前,我们先了解到底发生了什么问题。

请看代码:@WebServlet(urlPatterns = "/BlockingServlet")public class BlockingServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) {waitForData();writeResponse(response, "OK");}public static void waitForData() {try {Thread.sleep(ThreadLocalRandom.current().nextInt(2000));} catch (InterruptedException e) {e.printStackTrace();}}}此servlet 所代表的情景如下:每2秒会有某些事件发生, 例如, 报价信息更新, 聊天信息抵达等。

简述servlet3.0技术

简述servlet3.0技术

一、servlet3.0技术简介Servlet3.0是JavaEE6规范中的一部分,它引入了许多新特性,丰富了Servlet的功能和灵活性。

在之前的Servlet版本中,开发者需要通过web.xml文件配置Servlet的映射关系和其他参数,而在Servlet3.0中,可以为Servlet提供注解方式的配置,简化了开发流程。

Servlet3.0还支持异步处理请求、动态注册Servlet和过滤器等功能,使得Servlet在处理Web请求方面更加高效、灵活。

二、Servlet3.0的新特性1. 注解配置在Servlet3.0中,可以使用注解方式来配置Servlet和Filter,不再需要在web.xml文件中进行繁琐的配置。

开发者只需在Servlet类或者Filter类上使用WebServlet或WebFilter注解,并指定相关的配置参数,即可在应用启动时自动注册Servlet和Filter。

2. 异步处理请求Servlet3.0引入了异步处理请求的功能,通过调用HttpServletRequest的startAsync方法,将请求分发给另一个线程去处理,同时当前线程可以处理其他请求,提高了服务器的并发处理能力。

3. 动态注册Servlet和Filter在Servlet3.0中,可以通过ServletCont本人nerInitializer接口来动态注册Servlet和Filter,无需在web.xml中配置,使得应用的灵活性和可扩展性得到了增强。

4. 文件上传Servlet3.0提供了新的Part接口,用于处理文件上传,开发者可以通过HttpServletRequest的getParts方法获取上传的文件,简化了文件上传的处理流程。

5. 长时间连接Servlet3.0支持长时间连接,可以在Servlet中处理长时间的连接请求,例如WebSocket等。

6. 无部署描述符在Servlet3.0中,支持无部署描述符的部署方式,即可以在不使用web.xml文件的情况下部署应用。

51CTO学院-深入浅出之-JavaEE基础视频教程

51CTO学院-深入浅出之-JavaEE基础视频教程

51cto学院-深入浅出之-JavaEE基础视频教程课程目标javaee是目前大型企业级Web开发的主流技术适用人群在校计算机专业大专、本科生。

课程简介课程目标:javaee是目前大型企业级Web开发的主流技术。

掌握Jsp/Servlet的应用与原理,理解MVC分层思想,了解EL与JSTL的技术。

学会使用Servlet+Dao模型开发简单的Web应用程序。

适合对象:在校计算机专业大专、本科生。

学习条件:已经掌握javase、HTML、SQL、Javascript等基础知识。

课程1JavaWeb简介[免费观看]29分钟什么是Web应用程序静态网页与动态网页JavaWeb简介搭建JavaWeb开发环境手工编写第一个JavaWeb程序2MyEclipse简介[免费观看]31分钟JavaWeb目录结构Tomcat目录结构Tomcat后台管理修改Tomcat默认端口号MyEclipse 简介MyEclipse安装与注册3MyEclipse开发第一个JavaWeb项目[免费观看]20分钟MyEclipse配置使用MyEclipse创建JavaWeb项目MyEclipse项目目录结构项目名与项目虚拟路径设置项目欢迎页4Jsp基础语法(一)[免费观看]27分钟Jsp简介常见动态网站开发技术对比Jsp页面元素构成(指令、注释、声明、脚本、表达式)5Jsp基础语法(二)[免费观看]25分钟Jsp生命周期阶段案例6Jsp内置对象(一)[免费观看]47分钟Jsp内置对象简介四种作用范围out对象request对象7Jsp内置对象(二)[免费观看]48分钟response对象请求重定向与请求转发的区别session对象8Jsp内置对象(三)[免费观看]33分钟session的生命周期application对象使用application实现计数器9Jsp内置对象(四)[免费观看]38分钟page对象pageContext对象config对象exception对象10Jsp内置对象(五)[免费观看]30分钟阶段案例-实现用户登录小例子11JavaBeans(一)41分钟什么是javabeans javabeans设计原则在Jsp页面中使用javabeans <jsp:useBean> <jsp:s etProperty> <jsp:getProperty>12JavaBeans(二)47分钟Javabeans四个作用域Model1模型简介阶段案例-使用Model1实现用户登录13Jsp状态管理(一)44分钟http的无状态性保存用户状态的两大机制session与Cookie Cookie简介Jsp中创建与使用C ookie 使用Cookie实现自动登录效果14Jsp状态管理(二)53分钟Session与Cookie对比阶段案例—使用Cookie实现商品浏览记录15Jsp指令与动作(一)37分钟include指令include动作include指令与include动作的区别<jsp:forward>动作<jsp:par am>动作<jsp:plugin>动作16Jsp指令与动作(二)39分钟阶段案例-实现易买网页面布局效果17Servlet基础(一)42分钟Servlet简介Tomcat容器等级手工编写第一个servlet Servlet生命周期18Servlet基础(二)58分钟使用MyEclipse创建Servlet Servlet与九大内置对象关系Servlet获取表单信息Servlet路径跳转问题19Servlet基础(三)42分钟获取初始化参数MVC简介Model2简介阶段案例—使用Model2模型实现易买网用户注册20Servlet高级(一)43分钟过滤器简介使用过滤器解决中文乱码问题监听器简介使用监听器实现统计在线人数过滤器与监听器对比21Servlet高级(二)39分钟Servlet3.0新特征使用注解定义Servlet 使用注解定义Filter 使用注解定义Listener22Servlet高级(三)45分钟Apache Commons-fileupload组件介绍使用Apache Commons-fileupload实现上传使用Apache Commons-fileupload实现用户注册功能23Servlet高级(四)48分钟阶段案例-使用Servlet实现验证码功能24EL表达式(一)42分钟EL表达式简介基本语法 .运算符[]运算符隐式对象Empty运算符25EL表达式(二)35分钟获取数组元素获取序列元素获取Set元素获取Map元素逻辑运算符数学运算符关系运算符26EL表达式(三)56分钟阶段案例—MVC中使用EL表达式27数据源与JNDI36分钟JNDI简介JNDI简单应用数据库连接池数据源简介访问数据源28JSTL(一)31分钟JSTL简介自定义标签JSP使用自定义标签自定义标签处理流程29JSTL(二)56分钟定义带属性的标签TagSupport的生命周期迭代标签30JSTL(三)38分钟BodyTagSupport类BodyTagSupport类生命周期BodyTagSupport与TagSupport的区别SimpleTagSupport类31JSTL(四)53分钟第一个JSTL小例子JSTL核心标签库32JSTL(五)51分钟JSTL标签库类别格式化标签库SQL标签库33JSTL(六)38分钟XML标签库函数标签库34Ajax(一)30分钟Web2.0简介Ajax简介Ajax工作原理Ajax第一个小例子35Ajax(二)32分钟阶段案例-使用ajax实现搜索自动提示功能36Ajax(三)38分钟JSON简介JSON语法JSON与XML对比Java对象数组转JSON 37Ajax(四)48分钟Ajax返回JSON数据演示案例Ajax返回XML数据演示案例Ajax总结38易买网商城项目(一)21分钟实现用户注册时检查用户名是否已经存在39易买网商城项目(三)即将发布40易买网商城项目(四)即将发布课程地址:/course/course_id-1898.html。

servlet 3.0异步处理

servlet 3.0异步处理

2.15.3 Servlet3.0提供的异步处理(1)在以前的Servlet规范中,如果Servlet作为控制器调用了一个耗时的业务方法,那么Servlet必须等到业务方法完全返回之后才会生成响应,这将使得Servlet 对业务方法的调用变成一种阻塞式的调用,因此效率比较低。

Servlet 3.0规范引入了异步处理来解决这个问题,异步处理允许Servlet重新发起一条新线程去调用耗时的业务方法,这样就可避免等待。

Servlet 3.0的异步处理是通过AsyncContext类来处理的,Servlet可通过ServletRequest的如下两个方法开启异步调用、创建AsyncContext对象:AsyncContext startAsync()AsyncContext startAsync(ServletRequest, ServletResponse)重复调用上面的方法将得到同一个AsyncContext对象。

AsyncContext对象代表异步处理的上下文,它提供了一些工具方法,可完成设置异步调用的超时时长,dispatch用于请求、启动后台线程、获取request、response对象等功能。

下面是一个进行异步处理的Servlet类。

程序清单:codes\02\2.15\servlet3\WEB-INF\src\lee\AsyncServlet.java1.@WebServlet(urlPatterns="/async",asyncSupported=true)2.public class AsyncServlet extends HttpServlet3.{4. @Override5. public void doGet(HttpServletRequest request6. , HttpServletResponse response)throws IOException,ServletException7. {8. response.setContentType("text/html;charset=GBK");9. PrintWriter out = response.getWriter();10. out.println("<title>异步调用示例</title>");11. out.println("进入Servlet的时间:"12. + new java.util.Date() + ".<br/>");13. out.flush();14. //创建AsyncContext,开始异步调用15. AsyncContext actx = request.startAsync();16. //设置异步调用的超时时长17. actx.setTimeout(30*1000);18. //启动异步调用的线程19. actx.start(new Executor(actx));20. out.println("结束Servlet的时间:"21. + new java.util.Date() + ".<br/>");22. out.flush();23. }24.}上面的Servlet类中粗体字代码创建了AsyncContext对象,并通过该对象以异步方式启动了一条后台线程。

servlet在web.xml中配置方法

servlet在web.xml中配置方法

一、介绍servlet在web.xml中的配置方法Servlet是Java编写的服务器端程序,它可以响应客户端的请求并生成动态内容。

在Java Web开发中,通常会使用Servlet来处理用户的请求并生成响应。

而在配置Servlet时,web.xml文件是一个重要的配置文件,其中包含了Servlet的配置信息。

本文将介绍Servlet在web.xml中的配置方法。

二、创建Servlet类在配置Servlet之前,首先需要创建一个Servlet类。

可以通过继承javax.servlet.网络协议.HttpServlet类来创建Servlet类,该类必须实现doGet()或doPost()方法来处理请求。

下面是一个简单的Servlet 类的代码:```javaimport javax.servlet.网络协议.HttpServlet;import javax.servlet.网络协议.HttpServletRequest;import javax.servlet.网络协议.HttpServletResponse;public class HelloWorldServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) {//处理GET请求的逻辑}protected void doPost(HttpServletRequest request, HttpServletResponse response) {//处理POST请求的逻辑}}```三、在web.xml中配置Servlet在web.xml文件中使用<servlet>和<servlet-mapping>元素来配置Servlet。

首先在<servlet>元素中指定Servlet的名称和Servlet类的完整路径,例如:```xml<servlet><servlet-name>HelloWorldServlet</servlet-name><servlet-class.example.HelloWorldServlet</servlet-class></servlet>```其中,<servlet-name>用于标识Servlet的名称,<servlet-class>指定了Servlet类的完整路径。

getmapping注解用法

getmapping注解用法

getmapping注解用法Getmapping注解是JavaEE5规范中--Servlet规范版本3.0中提供的注解,它是组合注解,用于对特定的GET请求的处理。

该注解引入的原因是,当我们想要将一个特定的URL映射到某个类或方法时,比使用XML文件配置要简单的多,可以使用@GetMapping注解进行映射。

Getmapping注解可以帮助开发者定义特定的HTTP GET请求,并将其映射到特定的方法。

## 二、getmapping注解用法### 2.1 @GetMapping释使用方法使用@GetMapping注解可以定义HTTP GET请求以及将某个URL 请求映射到某个方法。

@GetMapping注解具有以下属性:(1)value:用于设置一组不同的URL。

(2)path:用于设置单个URL。

(3)params:用于设置URL的参数,它可以与value属性或path属性一起使用,以指定参数必须符合的条件。

(4)headers:用于设置HTTP请求头的参数。

(5)produces:用于设置HTTP请求的内容类型(例如:application/json,text/html,application/xml)。

下面是使用@GetMapping注解的示例:```java@GetMapping(value=user/{id} produces=application/json public ResponseEntity<User> getUser(@PathVariable(id Long id) {tUser user = userService.getUser(id);treturn ResponseEntity.ok(user);}```上面的示例代码将URL中的id参数映射到getUser()方法,该方法返回一个JSON格式的User对象。

### 2.2 @PostMapping释使用方法@PostMapping注解与@GetMapping注解的使用方法类似,它也具有相同的属性,只不过它用于定义HTTP POST请求。

Servlet3.0实现文件上传的方法

Servlet3.0实现文件上传的方法

Servlet3.0实现⽂件上传的⽅法Servlet 实现⽂件上传所谓⽂件上传就是将本地的⽂件发送到服务器中保存。

例如我们向百度⽹盘中上传本地的资源或者我们将写好的博客上传到服务器等等就是典型的⽂件上传。

Servlet 3.0上次完成⽂件下载功能使⽤的是 Servlet 2.5,但是想要完成⽂件上传,那么继续使⽤Servlet 2.5 肯定不是⼀个好的选择,因此我们使⽤ Servlet 3.0 来完成⽂件上传。

下⾯我来简单介绍⼀下 Servlet 3.0 的新特性:1、新增的注解⽀持该版本新增了若⼲注解,⽤于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述⽂件从该版本开始不再是必选的了。

2、HttpServletRequest 对⽂件上传的⽀持此前,对于处理上传⽂件的操作⼀直是让开发者头疼的问题,因为 Servlet 本⾝没有对此提供直接的⽀持,需要使⽤第三⽅框架来实现,⽽且使⽤起来也不够简单。

如今这都成为了历史,Servlet 3.0 已经提供了这个功能,⽽且使⽤也⾮常简单。

Servlet 3.0 的新特性当然肯定不⽌这些,但是其他的新特性在这⾥我们暂时还⽤不到,也就不做过多了解了。

必要条件想要完成⽂件上传,肯定不是这么简单,它对浏览器端和服务器端都有许多的要求。

对浏览器的要求:1. ⼀个⽂件的⼤⼩⼀般肯定不⽌ 1 KB,既然这样,那么要上传⼀个⽂件肯定不能使⽤get⽅式了,所以上传⽂件时必须采⽤post ⽅式。

2. 2.表单中必须有⼀个⽂件上传项<input type="file"> ,⽽且必须有 name 属性。

3. 必须设置表单的enctype 属性值为multipart/form-data。

对服务器的要求:1. 当然,我们肯定得使⽤ Servlet 3.0。

2. Servlet3.0 中接收普通上传组件(除了⽂件上传组件)通过 request.getParameter(String)接收,⽽⽂件上传组件通过request.getPart(String)接收。

Servlet传统配置方式和Servlet3.0使用注解的方式

Servlet传统配置方式和Servlet3.0使用注解的方式

Servlet传统配置⽅式和Servlet3.0使⽤注解的⽅式⼀、Servlet的传统配置⽅式 在JavaWeb开发中,每次编写⼀个Servlet都需要在web.xml⽂件中进⾏配置,如下所⽰:<servlet><servlet-name>ActionServlet</servlet-name><servlet-class>com.web.controller.ActionServlet</servlet-class></servlet><servlet-mapping><servlet-name>ActionServlet</servlet-name><url-pattern>/servlet/ActionServlet</url-pattern></servlet-mapping>发⼀个Servlet,都要在web.xml中配置Servlet才能够使⽤,这实在是很头疼的事情,所以Servlet3.0之后提供了注解(annotation),使得不再需要在web.xml⽂件中进⾏Servlet的部署描述,简化开发流程。

本⽂所讲的基于注解⽅式配置Servlet不是针对Servlet3.0的,⽽是基于Servlet2.5的,通过开发⾃定义注解和注解处理器来模拟实现类似于Servlet3.0的注解⽅式配置Servlet。

⼆、基于注解的⽅式配置Servlet JDK1. 5版本之后, JAVA提供了⼀种叫做Annotation的新数据类型,中⽂译为注解或标注,它的出现为铺天盖地的XML配置⽂件提供了⼀个完美的解决⽅案,让 JAVA EE开发更加⽅便快速,也更加⼲净了。

不过Servlet2.5默认情况下是不⽀持注解⽅式的配置的,但是我们可以开发⾃定义注解,然后将注解标注到Servlet上,再针对我们⾃定义的注解写⼀个注解处理器.原理: ⾸先,浏览器发出请求后,经过过滤器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、概述Servlet 是Java EE 规范体系的重要组成部分,也是Java 开发人员必须具备的基础技能,Servlet 3.0 引入的若干重要新特性,包括异步处理、新增的注解支持、可插性支持等,为读者顺利向新版本过渡扫清障碍。

Tomcat 支持servlet版本Servlet版本Tomcat版本Jdk最小版本JA V A EE版本Servlet 2.5 Tomcat 6 1.5 Java EE5Servlet 3.0 Tomcat7 1.6 Java EE6servlet3.0 的新特性包括如下方面 :1.异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该Servlet 线程。

在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。

针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。

2.新增的注解支持:该版本新增了若干注解,用于简化Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得web.xml 部署描述文件从该版本开始不再是必选的了。

3.可插性支持:开发者可以通过插件的方式很方便的扩充已有Web 应用的功能,而不需要修改原有的应用。

二、异步处理支持异步处理特性可以应用于Servlet 和过滤器两种组件,由于异步处理的工作模式和普通工作模式在实现上有着本质的区别,因此默认情况下,Servlet 和过滤器并没有开启异步处理特性。

异步处理关键是在于将复杂业务处理另外开一个线程,而Servlet将执行好的业务先送往jsp输出,等到耗时业务做完后再送往JSP页面,即先显示一部分,好事业务处理完后再显示一部分。

1.对于使用传统的部署描述文件(web.xml) 配置Servlet 和过滤器的情况,Servlet 3.0 为<servlet> 和<filter> 标签增加了<async-supported> 子标签,该标签的默认取值为false,要启用异步处理支持,则将其设为true 即可。

以Servlet 为例,其配置方式如下所示:<servlet><servlet-name>DemoServlet</servlet-name><servlet-class>footmark.servlet.Demo Servlet</servlet-class><async-supported>true</async-supported></servlet>2.对于使用Servlet3.0 提供的@WebServlet 和@WebFilter 进行Servlet 或过滤器配置的情况,这两个注解都提供了asyncSupported 属性,默认该属性的取值为false,要启用异步处理支持,只需将该属性设置为true 即可。

以@WebFilter 为例,其配置方式如下所示:@WebFilter(urlPatterns = "/demo",asyncSupported = true)public class DemoFilter implements Filter{...}同步情况例子:@WebServlet(name = "syncServlet1", urlPatterns = "/sync1")public class SyncServlet1 extends HttpServlet {@Overrideprotected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("Connection", "Keep-Alive");resp.setHeader("Proxy-Connection", "Keep-Alive");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();out.write("hello sync");out.write("<br/>");out.flush();//假设是个耗时任务,此时必须等待try {Thread.sleep(2L * 1000);} catch (InterruptedException e) {e.printStackTrace();}out.write("over");}}模拟异步处理的Servlet 示例:@WebServlet(urlPatterns = "/demo", asyncSupported = true)public class AsyncDemoServlet extends HttpServlet {@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp)throws IOException, ServletException {resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();out.println("进入Servlet的时间:" + new Date() + ".<br>");out.flush();//在子线程中执行业务调用,并由其负责输出响应,主线程退出AsyncContext ctx = req.startAsync();//设置超时时间asyncContext.setTimeout(10L * 1000);//开始任务//new Thread(new Executor(ctx)).start();//ctx.start(new Executor(ctx));//这样也可以out.println("结束Servlet的时间:" + new Date() + ".<br>");out.flush();}}public class Executor implements Runnable {private AsyncContext ctx = null;public Executor(AsyncContext ctx){this.ctx = ctx;}public void run(){try {//等待十秒钟,以模拟业务方法的执行Thread.sleep(10000);PrintWriter out = ctx.getResponse().getWriter();out.println("业务处理完毕的时间:" + new Date() + ".<br>");out.flush();plete();} catch (Exception e) {e.printStackTrace();}}}除此之外,Servlet 3.0 还为异步处理提供了一个监听器,使用AsyncListener 接口表示。

它可以监控如下四种事件:●异步线程开始时,调用AsyncListener 的onStartAsync(AsyncEvent event) 方法;●异步线程出错时,调用AsyncListener 的onError(AsyncEvent event) 方法;●异步线程执行超时,则调用AsyncListener 的onTimeout(AsyncEvent event) 方法;●异步执行完毕时,调用AsyncListener 的onComplete(AsyncEvent event) 方法;监听器例子:AsyncContext ctx = req.startAsync();ctx.addListener(new AsyncListener() {@Overridepublic void onComplete(AsyncEvent event) throws IOException {// TODO Auto-generated method stubSystem.out.println("--------complitet----");}@Overridepublic void onTimeout(AsyncEvent event) throws IOException {// TODO Auto-generated method stub}@Overridepublic void onStartAsync(AsyncEvent event) throws IOException {// TODO Auto-generated method stub}@Overridepublic void onError(AsyncEvent event) throws IOException {// TODO Auto-generated method stub}});三、新增注解支持Servlet3.0新增了@WebServlet、@WebFilter、@WebListener、@WebInitParam、@MultipartConfig注解。

Servlet 3.0 的部署描述文件web.xml 的顶层标签<web-app> 有一个metadata-complete 属性,该属性指定当前的部署描述文件是否是完全的。

metadata-complete默认值为false。

如果设置为true,则容器在部署时将只依赖部署描述文件,忽略所有的注解。

1.@WebServlet@WebServlet 用于将一个类声明为Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为Servlet。

@WebServlet 主要属性列表:例子:@WebServlet(name = "servlet1", urlPatterns = {"/s1", "/s1/*"}, loadOnStartup = 1)public class Servlet1 extends HttpServlet {private String msg;public Servlet1() {System.out.println("load on startup");}@Overridepublic void init() throws ServletException {super.init();msg = this.getInitParameter("msg");}@Overrideprotected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {System.out.println(msg);}}2.@WebInitParam该注解不单独使用,而是配合@WebServlet 或者@WebFilter 使用。

相关文档
最新文档