# Servlet 面试问答

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

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

**Q1. 什么是 servlet？**

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

**Q2. 静态网页与动态网页？**

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

**Q3. servlet 的生命周期？**

遵循 servlet 生命周期的各个阶段：

1）加载 Servlet 类：servlet 容器找到`web.xml`文件中提到的 servlet 类并加载它。

2）Servlet 实例化：在此阶段创建 servlet 类的对象。

3）初始化：通过调用`init()`方法初始化 Servlet。

4）处理请求：在此阶段，servlet 通过调用`service()`方法为客户端请求提供服务。

5）销毁：servlet 生命周期的最后阶段。`destroy()`方法释放 servlet 实例，以便可以对其进行垃圾回收。

**Q4.为什么我们使用 Servlets？**

1）处理用户从屏幕提交的输入数据。

2）根据请求生成并返回对用户的动态响应。

3）理想的编程语言，用于根据用户的请求与数据库进行交互。

4）servlet 可以同时处理多个请求，这使它们成为高性能应用的完美选择。

**Q5. 为什么 Servlet 优于 CGI？**

1）Servlet 响应比 CGI 更快，因为它使用多线程概念来为每个请求提供服务。 CGI 性能不是很好，因为它为每个请求创建一个新对象，而 servlet 为每个请求分配一个新线程。

2）与 CGI 相比，学习和实现 servlet 非常容易。

3）与 CGI 相比，servlet 中的内存消耗较低。

**Q6. 加载 Servlet 的时候？**

1）当 servlet 容器收到来自客户端（浏览器）的第一个请求时。

2）应用的管理员手动加载 servlet。

3）当 webserver（部署了 servlet）开始时。

**Q7. 什么是`Servlet`接口以及它的用途是什么？**

`Servlet`接口是 servlet 的 API。每个 Servlet 都应该实现`Servlet`接口或扩展已经实现接口的类。 `javax.servlet.GenericServlet`和`javax.servlet.http.HttpServlet`是实现`Servlet`接口的`Servlet`类，因此每个 servlet 应该直接实现`Servlet`接口，或者通过扩展任何这些类。

**Q8. 什么是`ServletConfig`？**

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

**Q9. 什么是`ServletContext`？**

每个 Web 应用都有一个共同的`ServletContext`。 Web 应用中的所有 servlet 都可以访问`ServletContext`。它有网络应用信息和 Web 应用中存在的所有 servlet 都可以访问的资源。

**Q10. `ServletConfig`与`ServletContext`？**

以下是`ServletConfig`和`ServletContext`之间的两个主要区别：

1）`ServletConfig`用于将配置信息传递给 Servlet，而`ServletContext`提供 Servlet 类可以使用的一组方法与 Servlet 容器通信。

2）每个 Servlet 都有一个单独的`ServletConfig`对象，而`ServletContext`对于 Web 应用中的所有 servlet 都是通用的。

3）`ServletConfig`的参数在`web.xml`文件中的标签`<init-param>`下定义。`ServletContext`的参数在`web.xml`中的标签`<context-param>`下定义。

**Q11. `GenericServlet`和`HTTPServlet`之间的区别？**

1）`GenericServlet`是一个实现 Servlet 接口的抽象类，而`HTTPServlet`抽象类扩展了`GenericServlet`类。简而言之：`GenericServlet`类是`HTTPServlet`的父类。

2）`GenericServlet`不支持任何协议。`HTTPSeervlet`支持 HTTP 和 HTTPS 协议。

3）`GenericServlet`无法处理`cookie`和会话，而`HTTPServlet`可以处理它们。

**Q12. `forward()`和`sendRedirect()`之间的区别？**

1）在`forward()`中，相同的请求被转发到另一个资源。在`sendRedirect()`中，新请求被发送到重定向资源。

2）`forward()`由 Servlet 容器处理，而`sendRedirect()`由浏览器处理。

3）在`forward()`中，URL（统一资源定位符）在 Web 浏览器上保持不变。在`sendRedirect()`中，URL 在 Web 浏览器地址栏中更改。

4）与`sendRedirect()`相比，`forward()`更快。

**Q13. 什么是部署描述符？ Web 应用的**

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

**Q14. `doGet()`对于`doPost()`方法？**

1）在`doGet()`中，参数在地址栏中可见，它们会附加到 URL。在`doPost()`中，参数在地址栏中不可见。

2）您可以通过`GET`请求最多传输 1024 个字符。`doPost()`没有任何限制。

3）`doGet()`不适合敏感数据，因为参数不会被加密。在`doPost()`中，参数是加密的，因此与`doGet()`相比更安全。

4）方法`doGet()`允许您为资源添加书签。`doPost()`不允许书签。

5）与`doPost()`方法相比，`doGet()`更快。

**Q15. `<load-on-startup>`有什么用？**

`<load-on-startup>`用于指定在服务器启动期间需要加载的 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>
```

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

**Q20. Servlets 支持哪些不同类型的会话跟踪机制？**

1）URL 重写

2）隐藏表单字段

3）Cookies

4）安全套接字层（SSL）会话

**Q21. URL 重写如何维持会话？**

在 URL 重写方法中，会话跟踪数据已附加在 URL 的末尾以跟踪会话。

**Q22. 解释 Servlet 链接？**

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

**Q23. 如何使 servlet 中的会话无效？**

通过调用`session.invalidate()`方法。

**Q24. Servlet 容器的主要功能是什么？**

1）Servlet 生命周期管理

2）维护 Servlet 和 Web 服务器之间的交互。

3）提供多线程支持，同时处理多个请求。

4）管理部署描述符`web.xml`文件。

**Q25. 什么是`<session-timeout>`？**

元素`<session-timeout>`用于指定会话的超时。这是在`web.xml`文件中定义的方式。

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

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

**Q26. 什么是 Servlet 延迟加载以及如何避免它？**

默认情况下，Servlet 容器在服务器启动时不初始化 Servlet。它仅在收到来自客户端的请求时初始化 servlet。这称为 Servlet 的延迟加载。
通过指定`<load-on-startup>`元素为 Servlet 我们可以避免延迟加载。`<load-on-startup>`中指定的 servlet 文件 Web 服务器启动后立即加载。

**Q27. 为什么我们在 servlet 中需要构造函数，即使我们有一个`init()`方法？**

`init()`方法用于初始化 servlet，但是为了实例化 Servlet 类，需要构造函数。 Servlet 容器实例化`Servlet`类。

**Q28. 什么时候卸载 Servlet？**

1）管理员手动卸载 servlet。

2）Web 服务器关闭。

**Q29. Servlet 如何使用`cookie`维护会话？**

`Cookie`是一小段信息，由 servlet 发送到 Web 浏览器。`Cookie`会存储在浏览器中，并在需要时返回给服务器。`Cookie`具有名称，单个值和少数其他属性。

**Q30. 为什么使用`cookie`进行会话跟踪是一种不好的做法？**

使用`cookie`进行会话跟踪有几个缺点。其中很少是：

1）由于`cookie`存储在客户端（在客户端的浏览器中），如果客户端浏览器清除或禁用`cookie`，它将不可用。

2）与其他会话管理机制相比，实现会话跟踪的`cookie`要困难得多。

3）`Cookie`仅适用于 HTTP 协议。

**Q31. 如何在 Servlets 中获取服务器信息？**

使用此：

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

**Q32. 如何在 Servlet 中获取客户端的 IP 地址？**

使用此：

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

**Q33. 为什么我们在 Servlet 中使用过滤器？**

我们使用过滤器：

1）安全检查

2）修改请求或响应

3）数据压缩

4）记录和审核

5）响应压缩

**Q34. `HTTPServlet`支持哪些协议？**

HTTP 和 HTTPS 协议。

**Q35. `GenericServlet`支持哪些协议？**

`GenericServlet`抽象类并不特定于任何协议。

**Q36. Servlet 3 增加了哪些新功能？**

1）Servlet 注释

2）Web 片段

3）Web 组件动态添加

4）异步处理

**Q37. 我们是否覆盖`service()`方法？**

不，我们不会覆盖`service()`方法。我们通常根据需求覆盖`doPost()`，`doGet()`方法。