Servlet版本
Oracle将Java EE(Java SE还自己保留)交给开源组织,Eclipse基金会接手。但Oracle不允许开源组织使用Java名号,所以Jakarta EE名称于2018.02.26应运而生。
正是因为组织变化,Servlet被割裂为了2个版本,javax.servlet
和jakarta.servlet
。
javax.servlet
已经停止维护,但它仍然是一个非常有用和重要的技术,特别是在许多现有项目中,学习和使用它将为你提供坚实的Web开发基础。
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>
如果希望使用Jakarta EE 9或更高版本的Servlet API,则需要切换到javax.servlet
。
<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>provided</scope>
</dependency>
本文将基于javax.servlet
来介绍Servlet,从Usages来看,它仍然是使用最广泛的。
Servlet API
Servlet API主要有2个包,javax.servlet
包含了servlet和web container使用的接口和类。javax.servlet.http
包含了http相关的接口和类。
javax.servlet
接口列表:
- Servlet
- ServletRequest
- ServletResponse
- RequestDispatcher
- ServletConfig
- ServletContext
- SingleThreadModel
- Filter
- FilterConfig
- FilterChain
- ServletRequestListener
- ServletRequestAttributeListener
- ServletContextListener
- ServletContextAttributeListener
javax.servlet
类列表:
- GenericServlet
- ServletInputStream
- ServletOutputStream
- ServletRequestWrapper
- ServletResponseWrapper
- ServletRequestEvent
- ServletContextEvent
- ServletRequestAttributeEvent
- ServletContextAttributeEvent
- ServletException
- UnavailableException
javax.servlet.http
接口列表:
- HttpServletRequest
- HttpServletResponse
- HttpSession
- HttpSessionListener
- HttpSessionAttributeListener
- HttpSessionBindingListener
- HttpSessionActivationListener
- HttpSessionContext (deprecated now)
javax.servlet.http
类列表:
- HttpServlet
- Cookie
- HttpServletRequestWrapper
- HttpServletResponseWrapper
- HttpSessionEvent
- HttpSessionBindingEvent
- HttpUtils (deprecated now)
Servlet接口
Servlet Interface定义了所有servlet必须具有的行为。主要方法如下:
-
public void init(ServletConfig config) 初始化,只会被web container调用1次
-
public void service(ServletRequest request, ServletResponse response) 接收请求,返回响应,每次请求都会调用1次
-
public void destroy() 销毁,只会被web container调用1次
-
public ServletConfig getServletConfig() Servlet配置
-
public String getServletInfo() Servlet信息
以下是代码示例:
import java.io.*;
import javax.servlet.*;public class First implements Servlet {ServletConfig config = null;/*** 初始化* @param config*/public void init(ServletConfig config) {this.config = config;System.out.println("servlet is initialized");}/*** 服务* @param req* @param res* @throws IOException* @throws ServletException*/public void service(ServletRequest req, ServletResponse res)throws IOException, ServletException {res.setContentType("text/html");PrintWriter out = res.getWriter();out.print("<html><body>");out.print("<b>hello simple servlet</b>");out.print("</body></html>");}/*** 销毁*/public void destroy() {System.out.println("servlet is destroyed");}/*** 配置* @return*/public ServletConfig getServletConfig() {return config;}/*** 信息* @return*/public String getServletInfo() {return "copyright 2007-1010";}
}
GenericServlet类
GenericServlet是个抽象类,实现了Servlet, ServletConfig, Serializable接口,能处理任何请求,支持任何协议。主要方法如下:
- public void init(ServletConfig config) 初始化
- public abstract void service(ServletRequest request, ServletResponse response) 接收请求,返回响应,每次请求都会调用1次
- public void destroy() 销毁,只会被web container调用1次
- public ServletConfig getServletConfig() Servlet配置
- public String getServletInfo() Servlet信息
- public void init() 无参初始化
- public ServletContext getServletContext() Servlet上下文
- public String getInitParameter(String name) 根据参数name返回value
- public Enumeration getInitParameterNames() web.xml所有参数
- public String getServletName() Servlet名称
- public void log(String msg) 记录Servlet日志
- public void log(String msg,Throwable t) 记录Servlet日志和异常堆栈
以下是代码示例:
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class First extends GenericServlet {public void service(ServletRequest req, ServletResponse res)throws IOException, ServletException {res.setContentType("text/html");PrintWriter out = res.getWriter();out.print("<html><body>");out.print("<b>hello generic servlet</b>");out.print("</body></html>");}
}
HttpServlet类
HttpServlet继承了GenericServlet抽象类。主要方法如下:
-
public void service(ServletRequest req,ServletResponse res) dispatches the request to the protected service method by converting the request and response object into http type.(这里结合英文解释比较清楚,转换类型后,调用第2个service)
-
protected void service(HttpServletRequest req, HttpServletResponse res) receives the request from the service method, and dispatches the request to the doXXX() method depending on the incoming http request type.(这里结合英文解释比较清楚,根据不同method,调用doXXX()方法)
-
protected void doGet(HttpServletRequest req, HttpServletResponse res) 处理GET请求,web container调用
-
protected void doPost(HttpServletRequest req, HttpServletResponse res) 处理POST请求,web container调用
-
protected void doHead(HttpServletRequest req, HttpServletResponse res) 处理HEAD请求,web container调用
-
protected void doOptions(HttpServletRequest req, HttpServletResponse res) 处理OPTIONS请求,web container调用
-
protected void doPut(HttpServletRequest req, HttpServletResponse res) 处理PUT请求,web container调用
-
protected void doTrace(HttpServletRequest req, HttpServletResponse res) 处理TRACE请求,web container调用
-
protected void doDelete(HttpServletRequest req, HttpServletResponse res) 处理DELETE请求,web container调用
-
protected long getLastModified(HttpServletRequest req) 上次修改时间
如果想深入学习Servlet API,可以在Maven pom.xml引入servlet包依赖,External Libraries查看源码。
参考资料:
https://www.javatpoint.com/servlet-api
https://www.javatpoint.com/Servlet-interface
https://www.javatpoint.com/GenericServlet-class
https://www.javatpoint.com/HttpServlet-class
ChatGPT