javawebday67(注解使用 servlet3.0 异步处理)

Servlet3.0
一、要求
    1、MyEclipse10.0或以上版本
    2、发布到Tomcat7.0或以上版本

二、
    1、创建JAVAEE6.0应用 

三、概述
    注解代替web.xml配额制文件
    异步处理
    对上传的支持

四、注解代替配置文件
1、删除web.xml
2、在Servlet类上添加@WebServlet(urlPatterns={"/AServlet"})

总结
    注解好处:配置信息少
    注解缺点:不方便修改

3、在filter类上添加@WebFilter(urlPatterns="/*")

4、在listener类上添加@WebListener【 AListener implements ServletContextListener】

五、异步处理
    1、什么是异步处理
        在服务器没有结束响应之前,浏览器是看不到响应内容的。只有响应结束时,浏览器才能显示结果。现在异步处理的结果,在服务器开始响应后,浏览器就可以看到响应内容,不用等待服务器响应结束    

    2、实现异步的步骤
        得到AsyncContext:异步上下文对象
            AsyncContext ac =request.startAsync(request,response)
        给上下文一个Runnable对象,启动它(给上下文一个任务,让它完成)
        ac.start(new Runnable(){
            public void run(){
                ...
            }
        })
@WebServlet(urlPatterns="/BServlet",asyncSupported=true)
resp.setContentType("text/html;charset=utf-8");

IE如果不能正常输出,说明响应体大小不足512B,需要多输出点废话

AsyncContext#complete();通知Tomcat 异步线程已经执行结束了,这让Tomcat及时断开与浏览器的连接,不然要一直等到超时不太好。
/*
 * <servlet>
 *  <servlet-name>AServlet</servlet-name>
 *  <servlet-class>my.web.servlet.AServlet</servlet-class>
 *  <init-param>
 *      <param-name>s1</param-name>
 *      <param-value>v1</param-value>
 *  </intit-param>
 *  <load-on-startup>1<load-on-startup>
 * </servlet>
 * <servlet-mapping>
 *  <servlet-name>AServlet</servlet-name>
 *  <url-pattern>/Aservlet</servlet-name>
 * </servlet-mapping>
 */
@WebServlet(urlPatterns="/AServlet",
    initParams={/*用的较少[直接在所需的地方搞]*/
            @WebInitParam(name="p1",value="v1"),
            @WebInitParam(name="p2",value="v2")
    },
    loadOnStartup=1
)
public class AServlet extends HttpServlet {

    public  void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("hello servlet3.0");
            resp.getWriter().print("hello servlet3.0");
    }

}
@WebFilter(urlPatterns="/*")
public class AFilter implements Filter {

    public AFilter() {
        super();
    }

    private FilterConfig filterConfig;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) {

        try {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
            HttpSession session = request.getSession();
            System.out.println("我在这");
            // 这里放到达目的地前(进入)处理代码                               
            filterChain.doFilter(req, res);
            // 这里放到达目的地(离开)的处理代码    

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ServletException e) {
            e.printStackTrace();
        }
    }
@WebListener
public class AListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("die啦啦啦");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("bornlalala ");
    }

}
/**
 * 添加WebServlet注解
 * @author Administrator
 *
 */
@WebServlet(urlPatterns="/BServlet",asyncSupported=true)
public class BServlet extends HttpServlet {

//  public static void main(String[] args) {
//      System.out.println("hel");
//      new Thread(){
//          public void run(){
//              
//          }
//      }.start();
//      System.out.println("不知道线程是否结束");
//  }
    @Override
    protected void doGet(final HttpServletRequest req,final HttpServletResponse resp) throws ServletException, IOException {
//      resp.getWriter().print("rrr");
//      resp.getWriter().flush();
//      try{
//          Thread.sleep(3000);
//      }catch(InterruptedException e){
//          
//      }
//      resp.getWriter().print("wor");
//      resp.getWriter().flush();
        //这样文本不乱码而且能开始异步
        resp.setContentType("text/html;charset=utf-8");
        //ie到512b才输出
        for (int i = 0; i <=512; i++) {
            resp.getWriter().print("a");
        }
        resp.getWriter().flush();
        /*
         * 1、得到异步上下文对象
         */
        final AsyncContext ac = req.startAsync(req, resp);

        /*
         * 2、给上下文对象一个Runnable对象,让它执行这个任务
         */
        ac.start(new Runnable(){
            public void run(){
                //匿名内部类加final
//                  resp.getWriter().print("开始<br/>");
//                  resp.getWriter().flush();
                    println("开始<br/>",resp);
                    sleep(2000);
                    for(char c = 'A';c<='Z';c++){
                        println(c+"", resp);
                        sleep(200);
                    }
                    //通知Tomcat已经执行结束了
                    ac.complete();
            }
        });
    }

    public void println(String text,HttpServletResponse resp){
        try {
            resp.getWriter().print(text);
            resp.getWriter().flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void sleep(long ms){
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值