在讨论 Servlet API 时,我已经讨论了一些关于GenericServlet的内容。在本文中,我将详细讨论GenericServlet。
GenericServlet是一个独立于协议的 Servlet,它应该始终覆盖service()方法来处理客户端请求。service()方法接受两个参数ServletRequest对象和ServletResponse对象。请求对象告诉 servlet 客户端发出的请求,而响应对象用于将响应返回给客户端。
GenericServlet如何工作?

GenericServlet的层次结构
java.lang.Object|_extended byjavax.servlet.GenericServlet
GenericServlet是一个抽象类,它只有一个抽象方法,即service()。这就是为什么当我们通过扩展GenericServlet类来创建GenericServlet时,我们必须覆盖service()方法。
使用GenericServlet的优点:
GenericServlet更容易编写- 具有简单的生命周期方法
- 要编写
GenericServlet,您只需要扩展javax.servlet.GenericServlet并覆盖service()方法(请查看下面的示例)。
使用GenericServlet的缺点:
使用GenericServlet并不是那么容易,因为我们在GenericServlet中没有像doGet(),doPost(),doHead()等方便的方法可以在HttpServlet中使用。
在HttpServlet中,我们需要为特定请求覆盖特定的便捷方法,例如,如果您需要获取信息,则覆盖doGet(),如果要向服务器发送信息覆盖doPost()。但是在GenericServlet中,我们只为每种类型的请求覆盖service()方法,这很麻烦。
我总是建议你使用HttpServlet而不是GenericServlet。HttpServlet更易于使用,并且具有比GenericServlet更多的方法。
GenericServlet的示例
我在这个例子中使用 Eclipse IDE。从 Eclipse 文件菜单中创建新的Dynamic Web Project。
我已经解释了在 Eclipse IDE 中创建 Servlet 的每一步,但是如果您刚接触 Eclipse 并且没有在系统上安装它,那么请参考本指南:如何安装 Eclipse,设置 Tomcat 并使用 Eclipse IDE运行第一个 servlet 程序。
完成后,在 IDE 中创建以下所有文件后,项目结构(或层次结构)将如下所示。

index.htm
我们正在创建一个 html 文件,一旦我们点击网页上的链接就会调用 servlet。在WebContent文件夹中创建此文件。该文件的路径应如下所示:WebContent/index.html
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Generic Servlet Demo</title></head><body><a href="welcome">Click to call Servlet</a></body></html>
ExampleGeneric.java
现在,我们通过扩展GenericServlet类来创建GenericServlet。创建GenericServlet时,应始终覆盖service()方法。右键单击src文件夹并创建一个新的类文件,将该文件命名为ExampleGeneric。文件路径应如下所示:Java Resouces/src/default package/ExampleGeneric.java
import java.io.*;import javax.servlet.*;public class ExampleGeneric extends GenericServlet{public void service(ServletRequest req,ServletResponse res)throws IOException,ServletException{res.setContentType("text/html");PrintWriter pwriter=res.getWriter();pwriter.print("<html>");pwriter.print("<body>");pwriter.print("<h2>Generic Servlet Example</h2>");pwriter.print("<p>Hello BeginnersBook Readers!</p>");pwriter.print("</body>");pwriter.print("</html>");}}
web.xml
此文件可在此路径WebContent/WEB-INF/web.xml中找到。在此文件中,我们将使用特定 URL 映射 Servlet。由于我们在单击index.html页面上的链接时调用欢迎页面,因此我们将欢迎页面映射到我们上面创建的 Servlet 类。
<web-app><display-name>BeginnersBookServlet</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><servlet-name>MyGenericServlet</servlet-name><servlet-class>ExampleGeneric</servlet-class></servlet><servlet-mapping><servlet-name>MyGenericServlet</servlet-name><url-pattern>/welcome</url-pattern></servlet-mapping></web-app>
输出:

点击第一个屏幕中的链接后的屏幕:

GenericServlet类的方法:
以下是GenericServlet类的所有方法的列表。
public void init():这是一种方便的方法。可以重写此方法,因此无需调用super.init(config)。public void init(ServletConfig config):由 servlet 容器调用以指示 servlet 正在投入使用,此方法用于初始化 servlet。public String getInitParameter(String name):返回包含给定初始化参数值的String,如果参数不存在,则返回null。public Enumeration getInitParameterNames():返回web.xml文件中定义的所有参数的名称,如果web.xml没有任何参数,则返回null。public abstract void service(ServletRequest request, ServletResponse response):由 Servlet 容器调用,允许 servlet 响应客户端发出的请求。public void destroy():servlet 容器在 servlet 生命周期结束时调用一次,表明 servlet 正在被销毁。public ServletConfig getServletConfig():返回初始化此 servlet 的ServletConfig对象public String getServletInfo():返回有关 servlet 的信息。public ServletContext getServletContext():返回ServletContext对象,由init方法传递给这个 servletpublic String getServletName():返回 servlet 实例的名称。public void log(String msg):在 servlet 日志文件中写入给定的消息。public void log(String msg, Throwable t):在 servlet 日志文件中写入解释性消息,包括描述错误或异常的String。
