`

Servlet3.0新特性,Servlet3新特性,Servlet3注解,Servlet3异步处理【蕃薯耀】

阅读更多

 

 

 

Servlet3.0新特性:


异步处理支持:有了该特性,Servlet线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该Servlet线程。在接收到请求 之后,Servlet线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器 资源的占用,并且提高并发处理速度。

 

新增的注解支持:该版本新增了若干注解,用于简化Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml部署描述文件从该版本开始不再是必选的了。可插性支持:熟悉Struts2的开发者一定会对其通过插件的方式与包括Spring在内的各种 常用框架的整合特性记忆犹新。

 

将相应的插件封装成JAR包并放在类路径下,Struts2运行时便能自动加载这些插件。现在Servlet 3.0提供了类似的特性,开发者可以通过插件的方式很方便的扩充已有Web应用的功能,而不需要修改原有的应用。下面我们将逐一讲解这些新特性,通过下面 的学习,读者将能够明晰了解Servlet 3.0的变化,并能够顺利使用它进行日常的开发工作。


异步处理支持

 

Servlet 3.0之前,一个普通Servlet的主要工作流程大致如下:首先,Servlet接收到请求之后,可能需要对请求携带的数据进行一些预处理;接着,调用业务接口的某些方法,以完成业务处理;最后,根据处理的结果提交响应,Servlet线程结束。

 

其中第二步的业务处理通常是最耗时的,这主要体现在数据库操作,以及其它的跨网络调用等,在此过程中,Servlet线程一直处于阻塞状态,直到业 务方法执行完毕。在处理业务的过程中,Servlet资源一直被占用而得不到释放,对于并发较大的应用,这有可能造成性能的瓶颈。对此,在以前通常是采用 私有解决方案来提前结束Servlet线程,并及时释放资源。

 

Servlet 3.0针对这个问题做了开创性的工作,现在通过使用Servlet 3.0的异步处理支持,之前的Servlet处理流程可以调整为如下的过程:首先,Servlet接收到请求之后,可能首先需要对请求携带的数据进行一些 预处理;接着,Servlet线程将请求转交给一个异步线程来执行业务处理,线程本身返回至容器,此时Servlet还没有生成响应数据,异步线程处理完 业务以后,可以直接生成响应数据(异步线程拥有ServletRequest和ServletResponse对象的引用),或者将请求继续转发给其它 Servlet。如此一来,Servlet线程不再是一直处于阻塞状态以等待业务逻辑的处理,而是启动异步线程之后可以立即返回。

 

异步处理特性可以应用于Servlet和过滤器两种组件,由于异步处理的工作模式和普通工作模式在实现上有着本质的区别,因此默认情况下,Servlet和过滤器并没有开启异步处理特性,如果希望使用该特性,则必须按照如下的方式启用:

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

 

 

异步处理案例:

 

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
  </head>
  
  <body>
  	<div>
  		<span>
  			<input type="button" value="提交" onclick="request();"/>
  		</span>
  	</div>
  	
  	<div id="result">
  	</div>
  </body>
  <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
  <script type="text/javascript">
  	function request(){
  		$.post("toDo", function(data){
		   $("#result").append("<div>"+data+"</div>");
		 });
  	};
  </script>
</html>

 

 

Servlet3.java

package com.lqy.servlet3;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lqy.thread.MyThread;

@WebServlet(name="testServlet",urlPatterns="/toDo",asyncSupported=true)
public class Servlet3 extends HttpServlet {

	private static final long serialVersionUID = 3678767769884185779L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("begin");
		AsyncContext asyncContext = request.startAsync();
		asyncContext.setTimeout(10000);
		MyThread myThread = new MyThread(asyncContext);
		myThread.start();
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		out.println("end");
		out.flush();
		out.close();
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.doGet(req, resp);
	}
	
	
}

 

 

MyThread.java

package com.lqy.thread;

import java.io.PrintWriter;
import javax.servlet.AsyncContext;
import javax.servlet.ServletResponse;

public class MyThread extends Thread {

	private AsyncContext asyncContext = null;

	public MyThread(AsyncContext asyncContext) {
		this.asyncContext = asyncContext;
	}

	@Override
	public void run() {
		try {
			ServletResponse response = asyncContext.getResponse();
			PrintWriter printWriter = response.getWriter();
			printWriter.println("threadBegin");
			Thread.sleep(1000);
			printWriter.println("threadEnd");
			asyncContext.complete();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public AsyncContext getAsyncContext() {
		return asyncContext;
	}

	public void setAsyncContext(AsyncContext asyncContext) {
		this.asyncContext = asyncContext;
	}	
}

 

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"> 

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>

 

执行结果:(附件为完整项目)

 

POST http://localhost:8090/servlet3/toDo
200 OK
3.04s
jquery....min.js (第 4 行)
begin

threadBegin

threadEnd

end

 


有错误的话,请参考以下的文章:

 

http://fanshuyao.iteye.com/blog/1688315

java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet


http://fanshuyao.iteye.com/blog/1688314

org.apache.jasper.JasperException: java.lang.ClassCastException: org.apache.catalina.core.DefaultInstanceManager cannot be cast to org.apache.tomcat.InstanceManager


http://fanshuyao.iteye.com/blog/1688305

java.lang.IllegalArgumentException: Invalid <url-pattern> toDo in servlet mapping

 


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

蕃薯耀 2012年9月29日 01:46:25 星期六

分享到:
评论

相关推荐

    servlet 3.0新增功能详解

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

    annotaction

    Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。...下面我们将逐一讲解这些新特性,通过下面的学习,读者将能够明晰了解 Servlet 3.0 的变化,并能够顺利使用它 进行日常的开发工作

    Java™ Servlet 规范.

    1.6.2 注解处理 .........................................................................................................................................14 Servlet 接口 ...................... 15 2.1 ...

    纯servlet+jsp后台管理 无任何框架

    公司要求的,只用servlet和jsp,不能...servlet使用注解方式,另外一个servlet可以处理多个请求,方式和spring mvc类似。这点和网上其他人写的servlet处理多方法加一个method参数不一样。其它也不算难的技术,一看就懂

    Spring注解驱动开发实战-servlet

    Spring注解驱动开发实战-servlet ServletContainerInitializer的使用 ServletContext注册三大组件 异步请求

    Tomcat 8 软件及源码

    5. JSP 2.3支持:Tomcat 8 支持最新的JSP 2.3规范,包括对新特性和改进的支持,如EL 3.0、标签文件的静态引入等。 6. HTTP/2支持:Tomcat 8 支持HTTP/2协议,可以提供更快的页面加载速度和更高的性能。 7. NIO2支持...

    Ajax下拉框级联查询(JDBC+Servlet+XMLHttpRequest异步对象)

    文件包括了:项目工程(关键部分注解详细),以及sql文件。功能:选中第一个下拉框,局部刷新第二个下拉框的值,且...主要使用了MySQL,jdbc,servlet,jsp,而异步是使用了原生的JS和XMLHttpRequest异步对象实现的。

    Servlet3.1规范(最终版) PDF

    1.6.1 监听器(Listener)顺序 ...............................................................................................................14 1.6.2 注解处理 ...............................................

    通俗易懂的Spring注解驱动开发教程(含配套资料)

    本教程为授权出品教程 《Spring注解驱动开发》是一套帮助我们深入了解Spring原理... 3).web原理 1).Servlet3.0标准新增特性 2).异步请求相关 本视频使用了maven构建程序,需要同学们有对Spring.SpringMVC的基本

    springboot学习思维笔记.xmind

    Servlet3.0+异步方法处理 Spring MVC的测试 MockMVC MockHttpServlerRequest MockHttpServletResponse MockHttpSession SpringBoot基础 SpringBoot概述 什么是SpringBoot SpringBoot核心...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    SpringBoot新手学习手册

    十一、 2.0版本新特性 45 以Java 8 为基准 45 内嵌容器包结构调整 45 Servlet-specific 的server properties调整 45 Actuator 默认映射 46 Spring Loaded不再支持 46 支持Quartz Scheduler 46 OAuth 2.0 支持...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    8.1.4 异常处理 247 8.2 Spring Data JPA 248 8.2.1 点睛Spring Data JPA 248 8.2.2 Spring Boot 的支持 258 8.2.3 实战 260 8.3 Spring Data REST 284 8.3.1 点睛Spring Data REST 284 8.3.2 Spring Boot 的支持 ...

    java开源包3

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

    Spring API

    2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...

    Spring中文帮助文档

    2.4.4. 异步的JMS 2.4.5. JDBC 2.5. Web层 2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于Annotation的控制器 2.5.4. Spring MVC的表单标签库 2.5.5. 对Tiles 2 支持 2.5.6. 对JSF 1.2支持...

    SpringMVC环境下实现的Ajax异步请求JSON格式数据

    首先是常规的spring mvc环境搭建,不用多说,需要注意的是,这里需要引入jackson相关jar包,然后在spring配置文件“springmvc-servlet.xml”中添加json解析相关配置,我这里的完整代码如下: &lt;?xml version=1.0 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    8.1.4 异常处理 247 8.2 Spring Data JPA 248 8.2.1 点睛Spring Data JPA 248 8.2.2 Spring Boot 的支持 258 8.2.3 实战 260 8.3 Spring Data REST 284 8.3.1 点睛Spring Data REST 284 8.3.2 Spring Boot 的支持 ...

Global site tag (gtag.js) - Google Analytics