X.d 笔记

小Web,大世界

0%

小试 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:

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确实还是强大很多。