启动Tomcat7的代码
编写的Servlet
运行的效果
测试AsyncContext
package com.tan.util; import org.apache.catalina.startup.Bootstrap; /**Tomcat util for start or stop the tomcat.*/ public class TomcatUtil { public static void main(String[] args) { if (args.length == 0) { info("Starting up the tomcat 7!"); Bootstrap.main(args); } else if ("stop".equalsIgnoreCase((args[0]))) { info("Stopping the tomcat 7!"); Bootstrap.main(new String[]{"stop"}); } } private final static void info(Object o) { if (o != null) { System.out.println(o.toString()); } } }

编写的Servlet
package com.tan.servlet3; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * * @author administrator * * 2010-5-29 上午10:44:27 */ @WebServlet("/firstservlet3") public class FirstServlet3 extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); out.println("The first web application for the servlet 3"); } }
运行的效果

测试AsyncContext
@WebServlet(urlPatterns="/second", asyncSupported=true) public final class SecondServlet3 extends HttpServlet{ private static final long serialVersionUID = -7545111408599552911L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); out.println("进入servlet的时间是:" + format(new Date()) + "<br/>"); out.flush(); AsyncContext ctx = req.startAsync(); new Thread(new Executor(ctx)).start(); out.println("结束Servlet的时间:" + format(new Date()) + "<br/>"); out.flush(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
public class Executor implements Runnable{ private AsyncContext ctx = null; public Executor(AsyncContext ctx) { this.ctx = ctx; } public void run() { try { // 等待三秒钟,模拟业务方法执行. Thread.sleep(3000); PrintWriter out = ctx.getResponse().getWriter(); out.println("<span style=\"background-color: #006600; color: #FFFFFF\">业务处理完毕的时间:" + format(new Date()) + "</span>"); out.println("<a href=\"javascript:history.go(-1);\">返回</a>"); out.flush(); ctx.complete(); } catch (Exception e) { e.printStackTrace(); } } }

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端