A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Servlet3.0新特定之 --- Servlet异步支持

一、Servlet异步支持简介1.1、为什么要用异步处理
​ Servlet是用来处理客户端发送的请求和给客户端响应数据的业务逻辑的。如果,Servlet在处理用户请求数据的逻辑中调用了一个比较耗时的方法,势必会影响到给客户端响应数据。Servlet3.0为我们提供了一个异步支持,这样我们就可以把比较耗时的逻辑放在异步的方法中进行处理(相当于重新开启了一个线程来处理这个耗时的业务逻辑)。这样,就不会影响到给客户端响应数据了。
1.2、异步实现的原理
重新开一个线程单独去调用耗时的业务方法。
Servlet异步支持具体实现2.1、在@WebServlet注解中添加异步支持
@WebServlet(name = "MyAsyncServlet",urlPatterns = "/asyncServlet",asyncSupported = true)
2.2、调用异步方法
步骤:
1、通过request活的AsyncContent对象:AsyncContext actx = request.startAsync();
2、设置异步调用超时时长:actx.setTimeout(30*3000);
3、启动异步调用线程:actx.start(new MyThread(actx));
1 //通过request获得AsyncContent对象
2  AsyncContext actx = request.startAsync(); //重点方法**
3 //设置异步调用超时时长
4 actx.setTimeout(30*3000);  
5 //启动异步调用的线程
6 actx.start(new MyThread(actx));//重点方法**
2.3、应用实例
java代码】
1 package com.heima.servlet;
2 ​
3 import javax.servlet.AsyncContext;
4 import javax.servlet.ServletException;
5 import javax.servlet.ServletRequest;
6 import javax.servlet.annotation.WebServlet;
7 import javax.servlet.http.HttpServlet;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10 import java.io.IOException;
11 import java.io.PrintWriter;
12 ​
13 /**
14  * @author buguniao
15  * @date 2018-06-25 10:46
16  */
17 @WebServlet(name = "MyAsyncServlet", urlPatterns = "/asyncServlet", asyncSupported = true)
18 public class MyAsyncServlet extends HttpServlet {
19     @Override
20     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
21         //解决乱码
22         request.setCharacterEncoding("UTF-8");
23         response.setContentType("text/html;charset=UTF-8");
24         //通过request获得AsyncContent对象
25         AsyncContext actx = request.startAsync();
26         //设置异步调用超时时长
27         actx.setTimeout(30 * 3000);
28         //启动异步调用的线程
29         actx.start(new MyThread(actx));
30 ​
31         // 直接输出到页面的内容(不等异步完成就直接给页面)
32         //但这些内容必须放在标签内,否则会在页面输出错误内容,这儿反正我测试是这样,具体不知对不对??
33         PrintWriter out = response.getWriter();
34         out.println("<h1>不等异步返回结果就直接返到页面的内容</h1>");
35         out.flush();
36     }
37 ​
38     /**
39      * 异步处理业务的线程类
40      */
41     public class MyThread implements Runnable {
42         private AsyncContext actx;
43 ​
44         //构造
45         public MyThread(AsyncContext actx) {
46             this.actx = actx;
47         }
48 ​
49         @Override
50         public void run() {
51             try {
52                 //等待5秒,模拟处理耗时的业务
53                 Thread.sleep(4 * 1000);
54                 //获得request对象,添加数据给页面
55                 ServletRequest req = actx.getRequest();
56                 req.setAttribute("content", "异步获得的数据");
57                 //将请求dispathindex.jsp页面,该页面的session必须设为false
58                 actx.dispatch("/index.jsp");
59             } catch (Exception e) {
60                 e.printStackTrace();
61             }
62         }
63     }
64 ​
65     @Override
66     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
67         doGet(req, resp);
68     }
69 }
index.jsp
1 <%--
2   Created by IntelliJ IDEA.
3   User: buguniao
4   Date: 2018/6/25
5   Time: 10:59
6   To change this template use File | Settings | File Templates.
7 --%>
8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
9 <html>
10 <head>
11     <title>Title</title>
12 </head>
13 <body>
14         ${content}
15 </body>
16 </html>

1 个回复

倒序浏览
奈斯,棒棒哒
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马