从此
上网
📄文章 #️⃣专题 🌐上网 📺 🛒 📱

Java Web应用技术


综合

Spring框架

SpringBoot内嵌Web Server容器 - Tomcat,Jetty,Undertow,Netty

Nginx集成Java模块 - nginx-clojure

JSF(Jakarta Server Faces/Java Server Faces) - https://jakarta.ee/specifications/faces/

注意 - HttpServletRequest.getInputStream()首次读取正常,再次读取会报 IllegalStateException ,可通过中间变量暂存。


Servlet+Gradle实例:

  Java Servlet 技术入门


                    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");