# Servlet 面试问答

> 原文： [https://beginnersbook.com/2013/05/servlet-interview-questions/](https://beginnersbook.com/2013/05/servlet-interview-questions/)

以下是有关 Servlet 的常见问题。我已经提供了每个问题的简要和答案，这将有助于您在技术面试轮次中被选中。

**问 1.什么是 servlet？**
Servlet 是一种服务器端编程语言，用于生成动态网页。它生成网页作为从客户端（浏览器）收到的请求的响应。

**Q 2.静态网页与动态网页？**
对所有用户都相同的网页是静态网页，根据用户的请求动态生成的网页（根据请求可能因用户而异）被称为动态网页。 Servlet 主要用于动态网页。

**Q 3\. servlet 的生命周期？**
遵循 servlet 生命周期的各个阶段：
1）加载 Servlet 类：servlet 容器找到 web.xml 文件中提到的 servlet 类并加载它。
2）Servlet 实例化：在此阶段创建 servlet 类的对象。
3）初始化：通过调用`init()`方法初始化 Servlet。
4）处理请求：在此阶段，servlet 通过调用`service()`方法为客户端请求提供服务。
5）Destroy：servlet 生命周期的最后阶段。 destroy（）方法释放 servlet 实例，以便可以对其进行垃圾回收。

**问 4.为什么我们使用 Servlets？**
1）处理用户从屏幕提交的输入数据。
2）根据请求生成并返回对用户的动态响应。
3）理想的编程语言，用于根据用户的请求与数据库进行交互。
4）servlet 可以同时处理多个请求，这使它们成为高性能应用程序的完美选择。

**问 5.为什么 Servlet 优于 CGI？**
1）Servlet 响应比 CGI 更快，因为它使用多线程概念来为每个请求提供服务。 CGI 性能不是很好，因为它为每个请求创建一个新对象，而 servlet 为每个请求分配一个新线程。
2）与 CGI 相比，学习和实现 servlet 非常容易。
3）与 CGI 相比，servlet 中的内存消耗较低。

**问 6.加载 Servlet 的时候？**
1）当 servlet 容器收到来自客户端（浏览器）的第一个请求时。
2）应用程序的管理员手动加载 servlet。
3）当 webserver（部署了 servlet）开始时。

**问 7.什么是 Servlet 接口以及它的用途是什么？**
Servlet 接口是 servlet 的 API。每个 Servlet 都应该实现 servlet 接口或扩展已经实现接口的类。 `javax.servlet.GenericServlet`和`javax.servlet.http.HttpServlet`是实现 Servlet 接口的 Servlet 类，因此每个 servlet 应该直接实现 Servlet 接口，或者通过扩展任何这些类。

**问 8.什么是 ServletConfig？**
`ServletConfig`接口属于包`javax.servlet.ServletConfig`。它用于将配置参数传递给 servlet。 Servlet 容器隐式实例化它。

**Q 9.什么是 ServletContext？**
每个 Web 应用程序都有一个共同的`ServletContext`。 Web 应用程序中的所有 servlet 都可以访问 ServletContext。它有网络应用信息和 Web 应用程序中存在的所有 servlet 都可以访问的资源。

**问 10\. ServletConfig 与 ServletContext？**
以下是`ServletConfig`和`ServletContext`之间的两个主要区别：
1）ServletConfig 用于将配置信息传递给 Servlet，而 ServletContext 提供 Servlet 类可以使用的一组方法与 Servlet 容器通信。
2）每个 Servlet 都有一个单独的 ServletConfig 对象，而 ServletContext 对于 Web 应用程序中的所有 servlet 都是通用的。
3）ServletConfig 的参数在＆lt; init-param＆gt;下定义。 web.xml 文件中的标签。 ServletContext 的参数在＆lt; context-param＆gt;下定义。 web.xml 中的标签。

**Q 11\. GenericServlet 和 HTTPServlet 之间的区别？**
1）GenericServlet 是一个实现 Servlet 接口的抽象类，而 HTTPServlet 抽象类扩展了 GenericServlet 类。简而言之：GenericServlet 类是 HTTPServlet 的父类。
2）GenericServlet 不支持任何协议。 HTTPSeervlet 支持 HTTP 和 HTTPS 协议。
3）GenericServlet 无法处理 cookie 和会话，而 HTTPServlet 可以处理它们。

**问 12\. forward（）和 sendRedirect（）之间的区别？**
1）在`forward()`中，相同的请求被转发到另一个资源。在`sendRedirect()`中，新请求被发送到重定向资源。
2）forward（）由 Servlet 容器处理，而 sendRedirect（）由浏览器处理。
3）在 forward（）中，URL（统一资源定位符）在 Web 浏览器上保持不变。在 sendRedirect（）中，URL 在 Web 浏览器地址栏中更改。
4）与 sendRedirect（）相比，forward（）更快。

**Q 13.什么是部署描述符？ Web 应用程序的**
web.xml 文件称为部署描述符。它通常放在应用程序的 WEB-INF 文件夹中。它具有 Servlet 名称，Servlet 映射等信息。该文件告诉 Servlet 容器需要为给定的 URL 模式调用哪个 Servlet 类。

**Q 14\. doGet（）对于 doPost（）方法？**
1）在 doGet（）中，参数在地址栏中可见，它们会附加到 URL。在 doPost（）中，参数在地址栏中不可见。
2）您可以通过 GET 请求最多传输 1024 个字符。 doPost（）没有任何限制。
3）doGet（）不适合敏感数据，因为参数不会被加密。在 doPost（）中，参数是加密的，因此与 doGet（）相比更安全。
4）方法 doGet（）允许您为资源添加书签。 doPost（）不允许书签。
5）与 doPost（）方法相比，doGet（）更快。

**问 15.＆lt; load-on-startup＆gt;有什么用？**
`&lt;load-on-startup&gt;`用于指定在服务器启动期间需要加载的 Servlet 文件。一旦服务器启动，就会加载此元素中指定的 servlet 文件，它不会等待第一个加载它们的请求。这是在 web.xml 文件中指定的方式。

```java
<servlet>
   <servlet-name>MyServletNameHere</servlet-name>
   <servlet-class>ServletClassHere-FullyQualified</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>
```

如果指定了多个文件，则文件将按照在其中指定的顺序加载。

**问 20\. Servlets 支持哪些不同类型的会话跟踪机制？**
1）URL 重写
2）隐藏表单字段
3）Cookies
4）安全套接字层（SSL）会话

**问 21\. URL 重写如何维持会话？**
在 URL 重写方法中，会话跟踪数据已附加在 URL 的末尾以跟踪会话。

**问 22.解释 Servlet 链接？**
Servlet 链接是一个在一系列 servlet 中处理请求的概念。 First Servlet 部分处理请求并传递给第二个请求，然后第二个 servlet 处理它并传递给第三个请求，依此类推。最后一个 servlet 将响应返回给客户端（浏览器）。

**Q 23.如何使 servlet 中的会话无效？**
通过调用`session.invalidate()`方法。

**问 24\. Servlet 容器的主要功能是什么？**
1）Servlet 生命周期管理
2）维护 Servlet 和 Web 服务器之间的交互。
3）提供多线程支持，同时处理多个请求。
4）管理部署描述符 web.xml 文件。

**Q 25.什么是＆lt; session-timeout＆gt; ？**
元素＆lt; session-timeout＆gt;用于指定会话的超时。这是在 web.xml 文件中定义的方式。

```java
<session-config>
       <session-timeout>35</session-timeout>
</session-config>
```

它会将会话超时设置为 25 分钟。

**问 26.什么是 Servlet 延迟加载以及如何避免它？**
默认情况下，Servlet 容器在服务器启动时不初始化 Servlet。它仅在收到来自客户端的请求时初始化 servlet。这称为 Servlet 的延迟加载。
通过指定**＆lt; load-on-startup＆gt;** 元素为 Servlet 我们可以避免延迟加载。 ＆lt; load-on-startup＆gt;中指定的 servlet 文件 Web 服务器启动后立即加载。

**问 27.为什么我们在 servlet 中需要构造函数，即使我们有一个 init（）方法？**
**init（）**方法用于初始化 servlet，但是为了实例化 Servlet 类，需要构造函数。 Servlet 容器实例化 Servlet 类。

**问 28.什么时候卸载 Servlet？**
1）管理员手动卸载 servlet。
2）Web 服务器关闭。

**问 29\. Servlet 如何使用 cookie 维护会话？**
Cookie 是一小段信息，由 servlet 发送到 Web 浏览器。 Cookie 会存储在浏览器中，并在需要时返回给服务器。 Cookie 具有名称，单个值和少数其他属性。

**问 30.为什么使用 cookie 进行会话跟踪是一种不好的做法？**
使用 cookie 进行会话跟踪有几个缺点。其中很少是：
1）由于 cookie 存储在客户端（在客户端的浏览器中），如果客户端浏览器清除或禁用 cookie，它将不可用。
2）与其他会话管理机制相比，实现会话跟踪的 cookie 要困难得多。
3）Cookie 仅适用于 HTTP 协议。

**问 31.如何在 Servlets 中获取服务器信息？**
使用此：

```java
getServletContext().getServerInfo()
```

**问 32.如何在 Servlet 中获取客户端的 IP 地址？**
使用此：

```java
request.getRemoteAddr()
```

**问 33.为什么我们在 Servlet 中使用过滤器？**
我们使用过滤器：
1）安全检查
2）修改请求或响应
3）数据压缩
4）记录和审核
5）响应压缩

**问 34\. HTTPServlet 支持哪些协议？**
HTTP 和 HTTPS 协议。

**问 35\. GenericServlet 支持哪些协议？**
GenericServlet 抽象类并不特定于任何协议。

**问 36\. Servlet 3 增加了哪些新功能？**
1）Servlet 注释
2）Web 片段
3）Web 组件动态添加
4）异步处理

**问 37.我们是否覆盖 service（）方法？**
不，我们不会覆盖 **service（）**方法。我们通常根据需求覆盖 doPost（），doGet（）方法。