Servlet3.0 新特性

合集下载

servlet 3.0异步处理

servlet 3.0异步处理

2.15.3 Servlet

3.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.java

1.@WebServlet(urlPatterns="/async",asyncSupported=true)

2.public class AsyncServlet extends HttpServlet

关于eclipse环境启动不成功的问题解决方法

关于eclipse环境启动不成功的问题解决方法

关于eclipse环境启动不成功的问题解决⽅法

常信息补充:

Caused by: javassist.CannotCompileException: by ng.OutOfMemoryError: PermGen space

at javassist.ClassPool.toClass(ClassPool.java:1099)

at javassist.CtClass.toClass(CtClass.java:1265)

at com.taobao.hsf.bytecode.ClassGenerator.toClass(ClassGenerator.java:293)

... 37 more

Caused by: ng.OutOfMemoryError: PermGen space

at ng.ClassLoader.defineClass1(Native Method)

at ng.ClassLoader.defineClassCond(Unknown Source)

at ng.ClassLoader.defineClass(Unknown Source)

at sun.reflect.GeneratedMethodAccessor68.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at ng.reflect.Method.invoke(Unknown Source)

at javassist.ClassPool.toClass2(ClassPool.java:1112)

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

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

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

课程目标

javaee是目前大型企业级Web开发的主流技术

适用人群

在校计算机专业大专、本科生。

课程简介

课程目标:

javaee是目前大型企业级Web开发的主流技术。掌握Jsp/Servlet的应用与原理,理解MVC分层思想,了解EL与JSTL的技术。学会使用Servlet+Dao模型开发简单的Web应用程序。

适合对象:

在校计算机专业大专、本科生。

学习条件:

已经掌握javase、HTML、SQL、Javascript等基础知识。

课程

1

JavaWeb简介

[免费观看]

29分钟

什么是Web应用程序静态网页与动态网页JavaWeb简介搭建JavaWeb开发环境手工编写第一个JavaWeb程序

2

MyEclipse简介

[免费观看]

31分钟

JavaWeb目录结构Tomcat目录结构Tomcat后台管理修改Tomcat默认端口号MyEclipse 简介MyEclipse安装与注册

3

MyEclipse开发第一个JavaWeb项目

[免费观看]

20分钟

MyEclipse配置使用MyEclipse创建JavaWeb项目MyEclipse项目目录结构项目名与项目虚拟路径设置项目欢迎页

4

Jsp基础语法(一)

[免费观看]

27分钟

Jsp简介常见动态网站开发技术对比Jsp页面元素构成(指令、注释、声明、脚本、表达式)

5

Jsp基础语法(二)

[免费观看]

25分钟

Jsp生命周期阶段案例

6

Jsp内置对象(一)

[免费观看]

47分钟

Jsp内置对象简介四种作用范围out对象request对象

servlet通俗易懂的基本介绍

servlet通俗易懂的基本介绍

1、Servlet和JSP概述

1.1 Java Servlet及其特点

Servlet是Java技术对CGI编程的回答。Servlet程序在服务器端运行,动态地生成Web页面。与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资(更重要的是,Servlet程序员收入要比Perl程序员高:-):

⏹高效。

在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。

在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N 次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择,比如缓冲以前的计算结果,保持数据库连接的活动,等等。

⏹方便。

Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。

⏹功能强大。

在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。

⏹可移植性好。

Servlet用Java编写,Servlet API具有完善的标准。因此,为I-Planet Enterprise Server写的Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。

Java论文

Java论文

一.Web应用程序的复用、重用

软件复用是指在开发新的软件系统时,对已有的软件或软件模块重新使用,该软件可以是己经存在的软件,也可以是专门的可复用组件〔8〕。软件可复用性的高低影响到生产效率的高低、软件质量的好坏和系统可维护性的好坏。在软件工程中面临的问题不是缺乏复用,而是缺乏广泛的、系统的复用。软件复用包括构造可复用软件和用可复用软件进行构造。构造可复用软件,一方面可以从现存的软件系统中抽取,另一方面通过改写或重新设计来实施。

Jones将软件复用的对象分为4种数据复用、体系结构复用、设计复用和程序复用。这样,软件复用可在实现层、设计层和体系结构层三个层次上实现。实现层软件复用是指对己有的程序代码进行复用,它包括源代码组件形式。设计层软件复用是指对已有的软件系统的设计信息进行复用。而体系结构层软件复用是最有效的软件复用,它主要是软件体系结构形式化的复用,即将软件的框架组织,全局结构设计作为复用对象。可复用的软件体系结构则通常是显式地复用软件体系结构,并通过集成其他软件体系结构,建立新的更高层次的体系结构。

面向对象的软件复用机制主要有两种:继承和对象组合。

(1)继承

继承是指子类可以从父类中直接获得某些特征和行为的能力,继承可作为代码复用和概念复用的手段。作为代码复用的手段是指:子类通过继承父类的行为,一些代码就不必重写;作为概念复用的手段是指:子类共享父类的方法定义。作为代码复用和概念复用手段的继承机制,在面向对象技术中,通过面向对象技术的一些主要机制来实现对“支持可维护性的可复用性”的支持。这些面向对象的主要机制是:数据的抽象化、封装和多态性。通过运用这些机制,继承可以在高层次上提供(相对于传统的低层次复用)可复用性:数据的抽象化和继承关系使得概念或定义可以复用;多态性使得实现和应用可以复用;而抽象化和封装可以保持和促进系统的可维护性。这样一来,复用的焦点不再集中在函数和算法等具体实现细节上,而是集中在最重要的含有宏观商业逻辑的抽象层次上。换言之,复用的焦点发生了“倒转”。发生复用焦点的倒转并不是因为实现细节的复用并不重要,而是因为这些细节上的复用己经做的很好了,并且这种复用在提高复用性的同时提高了软件的可维护性。由于继承关系直接继承的是接口,同时也继承实现,因而实际上父类的内部实现对子类而言是可见的,属于白盒复用方式。

Servlet简介

Servlet简介

servlet

百科名片

Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java 应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。

目录

展开

编辑本段servlet由来

servlet是在服务器上运行的小程序。这个词是在Java applet的环境中创造的,Java applet是一种当作单独文件跟网页一起发送的小程序,它

通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务。

服务器上需要一些程序,常常是根据用户输入访问数据库的程序。这些通常是使用公共网关接口(CGI(Common Gateway Interface))应用程序完成的。然而,在服务器上运行Java,这种程序可使用Java编程语言实现。在通信量大的服务器上,Java servlet的优点在于它们的执行速度更快于CGI程序。各个用户请求被激活成单个程序中的一个线程,而无需创建单独的进程,这意味着服务器端处理请求的系统开销将明显降低。

最早支持Servlet技术的是JavaSoft的Java Web Server。此后,一些其它的基于Java的WebServer开始支持标准的ServletAPI。Servlet的主要功能在于交互式地浏览和修改数据,生成动态Web内容。这个过程为:客户端发送请求至服务器端;

符合openapi3.0

符合openapi3.0

符合openapi3.0

什么是OpenAPI3.0?

OpenAPI是一种用于描述和定义RESTful API的规范。它提供了一种标准化的方式来描述API的操作、参数、响应和安全信息,并且能够生成交互式文档和API客户端代码。OpenAPI规范最新的版本是3.0,它提供了一些重要的改进和新特性。

为什么要使用OpenAPI3.0?

OpenAPI规范有助于开发者更好地理解和使用API。它提供了一个统一的格式来描述API的功能和约束,以及相关的元数据。开发者可以通过查看API的OpenAPI文档来了解API的支持特性、可用的操作、可接受的参数以及预期的响应。这样可以提高开发效率和准确性,减少开发与后端API团队之间的交流成本。

OpenAPI3.0的新特性是什么?

OpenAPI3.0相对于以前的版本带来了一些重要的改进和新特性。其中最显著的包括:

1. 组件化架构:OpenAPI3.0引入了组件化架构的概念,允许开发者将

重复使用的定义和模型进行组件化,以便在不同的API规范中共享和重用。例如,可以定义一个通用的身份验证组件,在不同的API规范中引用它。

2. 更丰富的数据类型:OpenAPI

3.0引入了新的数据类型,包括一般对象、枚举、联合类型等。这些数据类型的引入使得API的描述更加准确和灵活,可以更好地满足不同的应用场景。

3. 强大的安全定义:OpenAPI3.0提供了更强大的安全定义,包括支持标准的OAuth 2.0和OpenID Connect等身份验证和授权协议。开发者可以在OpenAPI文档中明确指定每个操作所需的安全机制和权限要求。

Eclipse中创建Web项目无法自动创建web

Eclipse中创建Web项目无法自动创建web

Eclipse中创建W eb项目无法自动创建web.xml文件的问题

出现如题的情况,主要是由于创建的web项目中使用的servlet版本不同导致的!

如果是使用的servlet 3.0版本的话,eclipse在创建web项目时,默认情况下是不会自动创建web.xml文件的,因为servlet 3.0版本中,此配置文件不是必须得,例如servlet、filter 等的注解都可以直接在.java文件中直接进行配置了!

如果是使用的servlet 3.0以前的版本,则在创建web项目时就会自动创建web.xml文件!

好了,不说其他的了,其实我也找了好久,最终还是自己在创建时找到了原因所在,真的很简单哟!

1、创建项目,选择Dynamic Web Project了哈,如图:

2、点击Next下一步:

3、输入了项目名后,不要急着直接点Finish,而是要继续点击Next下一步:

4、继续点击Next下一步,记住一定要一步一步的点击Next:

到这个画面,呵呵原因找到了,默认情况下,这个复选框是不被选中的,这就是servlet 3.0版本的小特性了,web.xml文件不是必须得!我们勾选此复选框,点击Finish,看看图中所示:

Servlet工作原理解析

Servlet工作原理解析

Servlet⼯作原理解析

Tomcat中真正管理Servlet的是Context容器,⼀个Context对应⼀个Web⼯程,在Tomcat的配置⽂件中可以很容易发现:

<Context path-"" docBase="" reloadable="true"/>

Tomcat7开始⽀持嵌⼊式⽅式,通过添加⼀个启动类org.apache.catalina.startup.Tomcat,创建⼀个这个类的实例对象并调⽤start⽅法就可以很容易启动Tomcat(SpringBoot的内嵌Tomcat容器启动⼤概就基于此),还可以通过这个对象来添加和修改Tomcat的配置参数,如动态添加Context,Servlet 等

Servlet容器启动过程

添加⼀个Web应⽤时将会创建⼀个StandardContext对象,这个对象就是Tomcat中管理Servlet的Context具体对象了。并且会给这个容器对象设置必要的参数,如url和path分别对应这个应⽤在Tomcat中的访问路径和这个应⽤实际的物理路径

Tomcat的启⽤逻辑是基于观察者模式设计的,所有的容器都会继承Lifecycle(⽣命周期)接⼝,它管理着容器的整个⽣命周期,所有容器的修改和状态的改变都会由它去通知已经注册的观察者(Listener)

Web应⽤的初始化⼯作

Web应⽤的初始化⼯作是在ContextConfig的configureStart⽅法中实现的,引⽤⽤的初始化主要是解析web.xml⽂件,这个⽂件描述了⼀个Web 应⽤的关键信息,也是⼀个Web应⽤的⼊⼝

web.xml详解

web.xml详解

web.xml详解

写在前⾯:鄙⼈才学疏浅,关于这篇⽂章,鄙⼈也是在⽹上收集的。有两个⽬的。⼀是记录下来加深⾃⼰的理解,⼆是希望这篇⽂章能对⼤家有所帮助。最后欢迎⼤家⼀起讨论。

⼀:web.xml加载过程

简单说⼀下,web.xml的加载过程。当我们启动⼀个WEB项⽬容器时,容器包括(JBoss,Tomcat等)。⾸先会去读取web.xml配置⽂件⾥的配置,当这⼀步骤没有出错并且完成之后,项⽬才能正常的被启动起来。

启动WEB项⽬的时候,容器⾸先会去读取web.xml配置⽂件中的两个节点:<listener> </listener>和<context-param> </context-param>如图:

紧接着,容器创建⼀个ServletContext(application),这个web项⽬的所有部分都将共享这个上下⽂。容器以<context-param></context-param>的name作为键,value作为值,将其转化为键值对,存⼊ServletContext。

容器创建<listener></listener>中的类实例,根据配置的class类路径<listener-class>来创建监听,在监听中会有初始化⽅法,启动Web 应⽤时,系统调⽤Listener的该⽅法 contextInitialized(ServletContextEvent args),在这个⽅法中获得:

tomcat与resin

tomcat与resin

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。目前最新版本是7.0。

Tomcat运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。

Apache Tomcat 6.x在汲取 Tomcat 5.5.x优点的基础上,实现了Servlet 2.5和JSP 2.1等特性的支持。

Apache Tomcat 7.x是目前的开发焦点,仍基于Apache Software License v2.0标准,同时也是自2006年以来的首个主要发布版本。它在汲取了Tomcat 6.0.x

优点的基础上,实现了对于Servlet 3.0、JSP 2.2和Expression Language(EL)2.2等特性的支持。除此以外的改进列表如下:

• Web应用内存溢出侦测和预防

• 增强了管理程序和服务器管理程序的安全性

• 一般CSRF保护

• 支持web应用中的外部内容的直接引用

请求与响应

请求与响应

请求与响应

1、处理请求参数与标头

主要取得请求参数的方法:

·getParameter():指定请求参数名称对应的值。

例:String username = request.getParameter("name");

·getParameterV alues():同一个请求参数名称如果有多个值。

例:String[ ] values = request.getParameterV alues("param");

使用getParameterNames()方法获得请求参数。

Enumeration e = req.getParameterNames();

While(e.hasMoreElements()){String param = e.nextElement();...} ·getParameterMap():将请求参数以Map对象返回。

·getHeader():指定标头名称后可返回字符串值,代表浏览器所送出的标头信息。

·getHeaders():指定标头名称后可返回Enumerration,元素为字符串。

·getHeaderNames():取得所有标头名称,以Enumeration返回,内含所有标头字

符串名称。

2、请求参数编码处理

1.POST请求参数编码处理

如果客户端没有Content-Type标头中设置字符编码信息,此时使用

HttpServerletResponse的getCharacterEncoding()返回值会是null。

浏览器相当于做了这个操作:

String text = .URLEncoder.encode("value","UTF-8");

ServletRegistrationBean的源码摘要

ServletRegistrationBean的源码摘要

ServletRegistrationBean的源码摘要

感觉ServletRegistrationBean在Springboot中是⼀个可以看懂的类,好像作⽤就相当于@Controoller注解,package org.springframework.boot.web.servlet;

/**

* A {@link ServletContextInitializer} to register {@link Servlet}s in a Servlet 3.0+

* container. Similar to the {@link ServletContext#addServlet(String, Servlet)

* registration} features provided by {@link ServletContext} but with a Spring Bean

* friendly design.

* <p>

* The {@link #setServlet(Servlet) servlet} must be specified before calling

* {@link #onStartup}. URL mapping can be configured used {@link #setUrlMappings} or

* omitted when mapping to '/*' (unless

* {@link #ServletRegistrationBean(Servlet, boolean, String...) alwaysMapUrl} is set to

vue3.0的新特性

vue3.0的新特性

vue3.0的新特性

vue3新特性:

⼀、使⽤Proxy替换Object.defineProperty,重构响应式系统,使⽤Proxy优势:

1、可直接监听数组类型的数据变化

2、监听的⽬标为对象本⾝,不需要像Object.defineProperty⼀样遍历每个属性,有⼀定的性能提升

3、可拦截apply、ownKeys、has等13种⽅法,⽽Object.defineProperty不⾏

4、直接实现对象属性的新增/删除

proxy的缺点:

1、es6的proxy不⽀持低版本浏览器(IE11)

2、会针对IE11出⼀个特殊版本进⾏⽀持

⼆、源码使⽤ts重写,更好的类型推导

其实TypeScript并不是⼀门新的语⾔,它是 JavaScript 类型的超集,typeScript那并不是⼀个新语⾔,可以理解为加强JavaScript的

buff,TypeScript最⼤的优势源于强⼤的类型系统,还有就是在编写代码的时候就可以检测出我们可能因为粗⼼造成的不必要的错误。

所以建议学习⼀下ts:

为什么要学习TypeScript ?

未来趋势,⽬前来看发展,和应⽤趋势很快

vue3.0发布后,基本就离不开ts了

使⽤ TypeScript 可以帮助我们防⽌在编写 JavaScript 代码时因为数据类型的转换造成的意想不到的错误。提前帮我们发现代码出现错的风险。

团队成员使⽤ JavaScript 时很容易瞎写,不受规范约束。但是如果使⽤TypeScript那⼤家都不得不遵守规范。

TypeScript 紧跟 JavaScript 的发展,ES7 、ES8、ES9 相关语⾔的新特性都⽀持,⽐浏览器⽀持的速度更快。

Spring MVC 3.0实战指南

Spring MVC 3.0实战指南
@RequestMapping不但支持标准的URL,还支持Ant风格(即?、*和 **的字符,参见3.3.2节的内容)的和带{xxx}占位符的URL。以下URL都 是合法的:
/user/*/createUser 匹配/user/aaa/createUser、/user/bbb/createUser等URL。 /user/**/createUser 匹配/user/createUser、/user/aaa/bbb/createUser等URL。 /user/createUser?? 匹配/user/createUseraa、/user/createUserbb等URL。 /user/{userId} 匹配user/123、user/abc等URL。 /user/**/{userId} 匹配user/aaa/bbb/123、user/aaa/456等URL。 company/{companyId}/user/{userId}/detail 匹配company/123/user/456/detail等的URL。
示例2: @RequestMapping(value="/delete",method=RequestMethod.POST) public String test1(@RequestParam("userId") String userId){ return "user/test1"; } 所有URL为<controllerURI>/delete 且请求方法为POST 的请求由test1处理

springMVC配置文件详解

springMVC配置文件详解

web.xml的配置

web.xml应该是整个项目最重要的配置文件了,不过servlet3.0中已经支持注解配置方式了。在servlet3.0以前每个servlet必须要在web.xml中配置servlet及其映射关系。但是在spring框架中就不用了,因为Spring中是依赖注入(Dependency Injection)的也叫控制反转(Inversion of Control)。但是也要配置一个重要的servlet,就是前端控制器(DispatcherServlet)。配置方式与普通的servlet基本相似。

配置内容如下:

spring

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

WEB-INF/classes/spring/springmvc.xml

spring

/

这里需要注意,springmvc.xml是spring配置文件,将在后面讨论。在中url如果是.action,前端控制器就只会拦截以.action结尾的请求,并不会理会静态的文件。对静态页面的控制就要通过其他的手段。以/作为url的话就会拦截所有的请求,包括静态页面的请求。这样的话就可以拦截任何想要处理的请求,但是有一个问题。如果拦截了所有的请求,如果不在拦截器中做出相应的处理那么所有静态的js、css以及页面中用到的图片就会访问不到造成页面无法正常显示。但这可以通过静态资源的配置来解决这个问题。后面会提到。

配置spring容器:

相关主题
  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 EE5

Servlet 3.0 Tomcat7 1.6 Java EE6

servlet3.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 为 标签增加了 子标

签,该标签的默认取值为false,要启用异步处理支持,则将其设为true 即可。以Servlet 为例,其配置方式如下所示:

DemoServlet

footmark.servlet.Demo Servlet

true

2.对于使用Servlet

3.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 {

@Override

protected 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("
");

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 {

@Override

public 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() + ".
");

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() + ".
");

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() + ".
");

out.flush();

plete();

} catch (Exception e) {

e.printStackTrace();

}

}

}

相关文档
最新文档