Java Web应用技术
Servlet+Gradle实例:
plugins {
id 'war'
id "org.gretty" version "4.0.0"
}
repositories { mavenCentral() }
dependencies {
providedCompile 'jakarta.servlet:jakarta.servlet-api:5.0.0'
}
// 首页位置 - src/main/webapp/index.html
// http://localhost:8080/gradle-servlet-template/ss/any
@WebServlet(urlPatterns = {"/s", "/ss/*"})
public class NewServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try ( var out = response.getWriter()) {
out.println(request.getServletPath());
}
}
}
Servlet的异步和非阻塞:
// http://localhost:8080/gradle-servlet-template/aa/any
@WebServlet(asyncSupported = true, urlPatterns = {"/a", "/a/*"})
public class NewServlet extends HttpServlet {
private static final ExecutorService ES = Executors.newFixedThreadPool(9);
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
var ac = request.startAsync(request, response);
ac.setTimeout(10 * 1000);
//ac.addListener(new AsyncListener() {});
// 异步非阻塞方式读取或响应HTTP Body大尺寸内容
//var is = request.getInputStream();
//is.setReadListener(new MyRL(is, asyncContext));
//var os = response.getOutputStream();
//os.setWriteListener(new MyWL(os, asyncContext));
// 若业务线程需要Body参数可在MyRL的onAllDataRead()回调中拿取
// 或 new Thread(() -> {...}).start(); // 依然属于Servlet接待线程
ES.execute(() -> { // 或 ac.start(() -> {...});
try {
TimeUnit.SECONDS.sleep(2); // 模拟业务耗时
ac.getResponse().getWriter().write("ok");
ac.complete(); // 通知异步上下文请求处理完成
} catch (IOException | InterruptedException e) {
System.err.println(e);
}
});
}
}
启动 - gradle appRun