【servlet3.0新特性】Servlet 异步处理实例

Servlet3.0在MVC中作为控制器,控制器负责分发任务给MODEL完成,然后把结果交给JSP显示;

而如果有许多MODEL,其中有一个MODEL处理时间很长,则会导致整个页面的显示很慢;

异步处理关键点:将复杂业务处理另外开一个线程,而Servlet将执行好的业务先送往jsp输出,等到耗时业务做完后再送往JSP页面;

就是类似ajax的异步请求处理,避免页面加载时间过长。

servlet3.0异步处理注意点:需要在Annotation中注明 asyncSupported=true;

下面给出代码实例:

java代码:

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.*;

@WebServlet(name = "AsyncServlet", urlPatterns = {"/AsyncServlet"}, asyncSupported = true)
public class AsyncServlet extends HttpServlet {
	/** */
	private static final long serialVersionUID = 2432074905382867541L;

	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("GBK");
		response.setContentType("text/html;charset=GBK");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<body>");
		out.println("====页面加载开始====<hr />");
		AsyncContext actx = request.startAsync();
		actx.setTimeout(30 * 3000);
		actx.start(new MyThread(actx));
		out.println("====页面加载结束====<hr />");
		out.println("</body>");
		out.println("</html>");
		out.flush();
	}
}

class MyThread implements Runnable {
	private AsyncContext actx;

	public MyThread(AsyncContext actx) {
		this.actx = actx;
	}

	public void run() {
		try {
			Thread.sleep(5 * 1000); // 消耗5秒
			actx.dispatch("/index.jsp");
		}
		catch (Exception e) {
		}
	}
}

index.jsp页面:

<%@ page contentType="text/html;charset=GBK" pageEncoding="GBK" session="false"%>  
<html>  
       <body>  
       <%   out.println("======体验servlet3.0异步处理效果 ====");  
       		 out.println("======用户处理耗时业务 ====");  
       %>  
      </body>  
</html>

以上代码就是servlet3.0的异步处理代码,要使用tomcat7.0及以上版本才能支持servlet3.0,

要不然javax.servlet.annotation.*会报错,提示“The import javax.servlet.annotation cannot be resolved”

来源://作者:/更新时间:2013-11-14
相关文章
评论:
验证码:
匿名评论: