小试 Servlet3.0 之异步

Servlet3.0貌似已经发布很久了,由于各种原因老是不能在项目中有所用武之地。所以只有自己先研究一下。

Servlet3.0主要特性 。

  1. 热插拨,注解,编程式插入 Servlet, Filter, Listener 等
  2. 支持异步,比较重要的特性(有点像 多线程 + Servlet的组合,个人感觉使用2.4的 Servlet + Thread 也可可以硬着头皮实现)
  3. 自定义 HTTP,自定方法机制等,高端用户可以去了解,发竟这并不是一个非标准的东西。
  4. 自定义权限管理。可以使用自己的应用创一个 Tomcat 页面上的 Manager, Host-manager 出来,也是高端用户用的吧。
  5. HttpServletRequest 对文件上传文件的支持.
  6. 个人关注的一个小特性,Cookie终于支持httpOnly了,如果是在大公司做项目,肯定会有安全部门介意这个。(每次的安全检查都会让人头痛)
  7. Websocket,当然这个不算Servlet3.0特性,

Servlet3.1主要特性 :非阻塞IO,暂时还没有研究过,不过看起来好像是以异步为基础的,听说在某些场景上性能会好很多。

感觉3.0最实用的就是异步Servlet,可能现在很多工程师们天天用Struts,Spring MVC之类的开发框架,基本的Servlet流程都忘的一干二净了。

异步有什么用,假设一个首页打开时,加加载新闻,评论,还有用户资料和热点等N个内容时,如果没有异步,则会一个一个去数据库进行查询,处理完一个再处理一个,响应时间就会大很多,如果有了异步,就相当于开了一个线程单独去查而不影响后面的动作(懂Ajax的的都应该非常清楚)。处理查询多的页面时,响应时间会少很多,现充分利用资源。

一个小最简单的异步小DEMO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.xdnote.socket;

import java.io.IOException;

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;

//@WebServlet(urlPatterns="/async",asyncSupported=true,description="",displayName="")
@WebServlet(urlPatterns={"/async","/async2"},asyncSupported=true,description="",displayName="")
public class AsyncServlet extends HttpServlet{

@Override
protected void service(final HttpServletRequest request,final HttpServletResponse response)
throws ServletException, IOException {
if(Boolean.TRUE == request.getAttribute("async")){
try {
Thread.sleep(1000*10);
} catch (InterruptedException e) {
e.printStackTrace();
}
response.getWriter().write(" async content");
}else{
response.setContentType("text/plain");
final AsyncContext async = request.startAsync();
async.setTimeout(Long.MAX_VALUE);
Runnable run=new Runnable(){
@Override
public void run() {
System.out.println(request);
request.setAttribute("async", true);
try {
response.getWriter().write("response");
} catch ( Exception e) {
}
async.dispatch();
}
};
new Thread(run).start();
}
}
}

其实这两版特性可能不会被多少人看得上,如果拿来和php,asp等来比较的话,差距就拉开了。高级功能比比上来看,Java确实还是强大很多。