跳转到内容

Java Servlet

来自代码酷

Java Servlet[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

Java Servlet 是运行在Web服务器或应用服务器上的Java程序,用于扩展服务器的功能,动态生成Web内容。Servlet是Java EE(现Jakarta EE)规范的核心组件,主要用于处理HTTP请求(如GET、POST)并返回响应(如HTML、JSON)。与传统的CGI(Common Gateway Interface)相比,Servlet具有更高的性能和可移植性,因为它们在服务器启动时加载并常驻内存,无需为每个请求创建新进程。

核心特点[编辑 | 编辑源代码]

  • 平台无关性:基于Java编写,可在任何支持Java的服务器上运行。
  • 高效性:多线程处理请求,资源消耗低于CGI。
  • 生命周期管理:通过init()service()destroy()方法控制。
  • 集成性:与JSP、JDBC等技术无缝协作。

生命周期[编辑 | 编辑源代码]

Servlet生命周期由容器(如Tomcat)管理,分为三个阶段:

sequenceDiagram participant Client participant Container participant Servlet Client->>Container: HTTP请求 Container->>Servlet: init() (仅一次) Container->>Servlet: service() (每次请求) Container->>Servlet: destroy() (容器关闭时)

1. 初始化:容器调用init()方法,加载配置(如@WebServlet注解或web.xml)。 2. 请求处理:对每个请求,容器调用service()方法,后者根据请求类型(GET/POST)分发给doGet()doPost()。 3. 销毁:容器关闭时调用destroy()释放资源。

代码示例[编辑 | 编辑源代码]

以下是一个简单的Servlet实现,返回"Hello World":

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.*;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>Hello World!</h1>");
        out.println("</body></html>");
    }
}

输入与输出[编辑 | 编辑源代码]

实际应用场景[编辑 | 编辑源代码]

用户登录系统[编辑 | 编辑源代码]

Servlet常与HTML表单结合处理用户输入。例如,处理登录请求:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        if ("admin".equals(username) && "1234".equals(password)) {
            response.sendRedirect("welcome.jsp");
        } else {
            response.sendRedirect("error.html");
        }
    }
}

配合JSP使用[编辑 | 编辑源代码]

Servlet处理逻辑,JSP负责视图渲染,遵循MVC模式:

flowchart LR A[客户端] --> B(Servlet) B --> C{业务逻辑} C --> D[JSP] D --> A

高级特性[编辑 | 编辑源代码]

过滤器(Filter)[编辑 | 编辑源代码]

在请求到达Servlet前预处理数据(如日志记录、权限检查):

@WebFilter("/*")
public class LogFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("Request URI: " + ((HttpServletRequest)request).getRequestURI());
        chain.doFilter(request, response); // 传递给下一个过滤器或Servlet
    }
}

异步处理[编辑 | 编辑源代码]

处理长时间任务时不阻塞线程:

@WebServlet(urlPatterns="/async", asyncSupported=true)
public class AsyncServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        AsyncContext asyncCtx = request.startAsync();
        asyncCtx.start(() -> {
            // 模拟耗时操作
            try { Thread.sleep(5000); } catch (InterruptedException e) {}
            asyncCtx.getResponse().getWriter().write("Async Complete");
            asyncCtx.complete();
        });
    }
}

数学公式示例[编辑 | 编辑源代码]

Servlet吞吐量计算(假设每秒请求数为λ,平均处理时间为μ秒): Throughput=λ1+λμ

总结[编辑 | 编辑源代码]

Java Servlet是构建动态Web应用的基石,适合从简单页面到复杂企业级系统。初学者应掌握生命周期和HTTP方法处理,进阶用户可探索过滤器、异步处理等高级特性。