Servlet API定义了一些接口和类,开发者可以通过实现这些接口或继承这些类来编写自己的Servlet。常见的接口和类包括:
- Servlet、GenericServlet和HttpServlet接口和类:它们是所有Servlet的基础,并提供了处理客户端请求、生成响应等核心功能;
- ServletContext接口:它代表了当前Web应用程序的上下文环境,开发者可以使用它来获取Web应用程序的信息、共享数据等;
- ServletConfig接口:它代表了当前Servlet的配置信息,开发者可以使用它来读取Servlet初始化参数等;
- RequestDispatcher接口:它负责将请求转发给其他Servlet或JSP页面;
- HttpServletResponse和HttpServletRequest接口:它们分别代表了HTTP响应和请求,提供了处理请求和生成响应的方法。
1、GenericServlet
GenericServlet是Java Servlet API中的一个抽象类,它提供了Web服务器和servlet之间所需的最基本的通信功能。
- 继承:GenericServlet类是所有Servlet的父类,并且实现了ServletConfig和Serializable接口。
- 方法:GenericServlet类具有三个常用的方法:init()、service() 和destroy(),分别代表初始化、服务和销毁方法。其中,init() 方法用于执行一些初始化操作,service() 方法用于处理请求,而 destroy() 方法用于在Servlet卸载时清理所有资源并释放内存等重要操作。
- Servlet生命周期:Servlet的整个生命周期由容器(例如Tomcat)管理。当Servlet容器首次调用一个Servlet时,会立即创建该Servlet的实例,并调用其init()方法进行初始设置。在此之后,Servlet容器可能会多次调用service()方法来响应浏览器发起的每个请求。最终,在关闭Web服务器或从Web服务器中卸载Servlet时,Servlet容器会调用该Servlet的destory()方法以释放相应的资源。
- 支持协议的可插拔性:GenericServlet可以使用不同的协议进行通信,例如HTTP和FTP。
- 线程安全性:Servlet容器可能同时处理多个请求,因此千万不要修改Servlet状态,否则可能引发竞态条件问题。但是,GenericServlet天生是线程安全的,因为它的service()方法是线程安全的。
下面是一个简单的示例代码,演示如何使用 GenericServlet 来接收 HTTP GET 请求并返回一个 HTML 页面:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>MyServlet</title></head>");
out.println("<body>");
out.println("<h1>Hello, world!</h1>");
out.println("</body>");
out.println("</html>");
}
}
该示例代码中,MyServlet 继承自 GenericServlet,并重写了其 service() 方法。在 service() 方法内部,它设置了输出类型为 text/html,并输出一个简单的 HTML 页面。
2、 HttpServlet
HttpServlet 是 GenericServlet 的子类,专门用于处理基于 HTTP 协议的请求。与 GenericServlet 类似,它也提供了一些生命周期管理方法和抽象方法,由开发者来实现这些方法来处理请求和生成响应。
下面是一些关键特性和方法:
-
doGet() 和 doPost() 方法:这两个方法是 HttpServlet 中最重要的抽象方法。当浏览器发送 GET 或 POST 请求时,这些方法会被容器调用以便为客户端返回响应。
-
service() 方法:HttpServ