黑马程序员技术交流社区
标题: 【上海校区】Servlet3.0新特定之 --- Servlet异步支持 [打印本页]
作者: yuchengmin 时间: 2018-8-1 13:26
标题: 【上海校区】Servlet3.0新特定之 --- Servlet异步支持
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 //将请求dispath到index.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>
作者: 不二晨 时间: 2018-8-2 17:31
奈斯,棒棒哒
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |