Java Web应用技术
综合
Spring框架 SpringBoot内嵌Web Server容器 - Tomcat,Jetty,Undertow,Netty
JSF(Jakarta Server Faces/Java Server Faces) - https://jakarta.ee/specifications/faces/
注意 - HttpServletRequest.getInputStream()首次读取正常,再次读取会报 IllegalStateException ,可通过中间变量暂存。
Servlet+Gradle实例:
plugins {
id "java"
id "org.gretty" version "4.1.1"
}
repositories { mavenCentral() }
dependencies {
compileOnly 'jakarta.servlet:jakarta.servlet-api:6.0.0'
}
// 首页位置 - src/main/webapp/index.html
// http://localhost:8080/app/xx/any
@WebServlet(urlPatterns = {"/x", "/xx/*"})
public class NewClass 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
注意 - 执行前确保 src\main\webapp\ 网站根目录存在。
其他: 解决中文乱码(Java18后则不需要了/默认已是UTF-8) - response.setContentType("text/plain; charset=utf-8");