Servlet GenericServlet 类,在讨论 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
类的所有方法的列表。
1. 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
方法传递给这个 servlet -
public String getServletName()
:返回 servlet 实例的名称。 -
public void log(String msg)
:在 servlet 日志文件中写入给定的消息。 -
public void log(String msg, Throwable t)
:在 servlet 日志文件中写入解释性消息,包括描述错误或异常的String
。