🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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()`方法。