Servlet 面试问题



尊敬的读者们,这些 **Servlet 面试问题** 特别设计用于让您熟悉在 **Servlet 编程** 面试中可能遇到的问题类型。根据我的经验,优秀的面试官很少会提前计划好要问哪些特定问题,通常问题会从该主题的一些基本概念开始,然后根据后续讨论和您的回答继续下去。

Java Servlet 是运行在 Web 或应用服务器上的程序,充当来自 Web 浏览器或其他 HTTP 客户端的请求与 HTTP 服务器上的数据库或应用程序之间的中间层。

与 CGI 相比,Servlet 提供了几项优势。

  • 性能显著提升。

  • Servlet 在 Web 服务器的地址空间内执行。无需为每个客户端请求创建单独的进程。

  • Servlet 因为是用 Java 编写的,所以是平台无关的。

  • 服务器上的 Java 安全管理器强制执行一组限制以保护服务器机器上的资源。因此 Servlet 是受信任的。

  • Servlet 可以使用 Java 类库的全部功能。它可以通过您已经了解的套接字和 RMI 机制与 applet、数据库或其他软件进行通信。

Servlet 执行以下主要任务:

  • 读取客户端(浏览器)发送的显式数据。这包括 Web 页面上的 HTML 表单,也可能来自 applet 或自定义 HTTP 客户端程序。

  • 读取客户端(浏览器)发送的隐式 HTTP 请求数据。这包括 cookie、浏览器理解的媒体类型和压缩方案等等。

  • 处理数据并生成结果。此过程可能需要与数据库对话、执行 RMI 或 CORBA 调用、调用 Web 服务或直接计算响应。

  • 将显式数据(即文档)发送到客户端(浏览器)。此文档可以用多种格式发送,包括文本(HTML 或 XML)、二进制(GIF 图像)、Excel 等。

  • 将隐式 HTTP 响应发送到客户端(浏览器)。这包括告诉浏览器或其他客户端返回什么类型的文档(例如 HTML),设置 cookie 和缓存参数以及其他此类任务。

Servlet 生命周期可以定义为从其创建到销毁的整个过程。以下是 Servlet 遵循的路径。

  • 通过调用 init() 方法初始化 Servlet。

  • Servlet 调用 service() 方法来处理客户端的请求。

  • 通过调用 destroy() 方法终止 Servlet。

  • 最后,Servlet 由 JVM 的垃圾收集器进行垃圾回收。

init 方法设计为仅调用一次。它在 Servlet 首次创建时被调用,并且不会为每个用户请求再次调用。因此,它用于一次性初始化,就像 applet 的 init 方法一样。

每次服务器接收到对 Servlet 的请求时,服务器都会生成一个新线程并调用 service。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等)并根据需要调用 doGet、doPost、doPut、doDelete 等方法。

GET 请求来自对 URL 的正常请求或来自没有指定 METHOD 的 HTML 表单,它应该由 doGet() 方法处理。

POST 请求来自明确列出 POST 作为 METHOD 的 HTML 表单,它应该由 doPost() 方法处理。

destroy() 方法仅在 Servlet 生命周期结束时调用一次。

init() 方法只是创建或加载一些将在 Servlet 的整个生命周期中使用的数。

此方法使您的 Servlet 有机会关闭数据库连接、停止后台线程、将 cookie 列表或点击计数写入磁盘以及执行其他此类清理活动。

此方法应该用于从服务器获取数据。

此方法应该用于处理服务器上的数据。

service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求并将格式化的响应写回客户端。

每次服务器接收到对 Servlet 的请求时,服务器都会生成一个新线程并调用 service。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等)并根据需要调用 doGet、doPost、doPut、doDelete 等方法。

此方法的签名如下:

public void service(ServletRequest request, 
                    ServletResponse response) 
   throws ServletException, IOException{
}

service() 方法由容器调用,service 方法根据需要调用 doGet、doPost、doPut、doDelete 等方法。因此您无需处理 service() 方法,但您可以根据从客户端接收到的请求类型覆盖 doGet() 或 doPost()。

Servlet 根据情况使用以下方法自动处理表单数据解析:

  • **getParameter():**您调用 request.getParameter() 方法来获取表单参数的值。

  • **getParameterValues():**如果参数出现多次并返回多个值(例如复选框),则调用此方法。

  • **getParameterNames():**如果您想要当前请求中所有参数的完整列表,则调用此方法。

HttpServletRequest 的 getParameterNames() 方法返回当前请求中所有参数的完整列表。此方法返回一个 Enumeration,其中包含参数名称,顺序未指定。

获得 Enumeration 后,我们可以使用标准方式循环遍历 Enumeration,使用 hasMoreElements() 方法确定何时停止,并使用 nextElement() 方法获取每个参数名称。

我们可以使用 HttpServletRequest 的 getHeaderNames() 方法读取 HTTP 头信息。此方法返回一个 Enumeration,其中包含与当前 HTTP 请求关联的头信息。

获得 Enumeration 后,我们可以使用标准方式循环遍历 Enumeration,使用 hasMoreElements() 方法确定何时停止,并使用 nextElement() 方法获取每个参数名称。

当浏览器请求网页时,它会向 Web 服务器发送大量信息,这些信息无法直接读取,因为这些信息作为 HTTP 请求头的部分进行传输。HttpServletRequest 表示此 HTTP 请求。

当 Web 服务器响应浏览器对 HTTP 的请求时,响应通常由状态行、一些响应头、空行和文档组成。HttpServletResponse 表示此 HTTP 响应。

使用 request 获取 PrintWriter 对象。

PrintWriter out = response.getWriter();

现在打印 HTML。

out.println("Hello World");

我们可以使用 HttpServletResponse 的 setStatus(statuscode) 方法发送身份验证错误。

// Set error code and reason.
response.sendError(407, "Need authentication!!!" );

页面重定向通常在文档移动到新位置时使用,我们需要将客户端发送到这个新位置,或者可能是由于负载均衡,或者是为了简单的随机化。将请求重定向到另一个页面的最简单方法是使用 response 对象的 sendRedirect() 方法。

此方法生成 302 响应以及包含新文档 URL 的 Location 头。

此方法发送状态码(通常为 404)以及一条短消息,该消息会自动在 HTML 文档内格式化并发送到客户端。

Servlet 过滤器是可以用于 Servlet 编程的 Java 类,用于以下目的:

  • 在客户端访问后端资源之前拦截客户端的请求。

  • 在服务器响应发送回客户端之前操作服务器响应。

规范建议有各种类型的过滤器:

  • 身份验证过滤器。

  • 数据压缩过滤器。

  • 加密过滤器。

  • 触发资源访问事件的过滤器。

  • 图像转换过滤器。

  • 日志记录和审核过滤器。

  • MIME 类型链过滤器。

  • 标记过滤器。

  • 转换 XML 内容的 XSLT 过滤器。

过滤器部署在部署描述符文件 web.xml 中,然后映射到应用程序部署描述符中的 Servlet 名称或 URL 模式。

此方法由 Web 容器调用,以指示过滤器正在被投入服务。

由于客户端请求链末端的资源,每次请求/响应对通过链传递时,容器都会调用此方法。

此方法由 Web 容器调用,以指示过滤器正在被停止服务。

可以。

可以。web.xml 中 filter-mapping 元素的顺序决定了 Web 容器将过滤器应用于 Servlet 的顺序。要反转过滤器的顺序,只需反转 web.xml 文件中的 filter-mapping 元素即可。

使用 web.xml 中的 error-page 元素指定响应某些异常或 HTTP 状态码时 Servlet 的调用。

如果您想要为所有异常拥有一个通用的错误处理程序,那么您应该定义以下 error-page,而不是为每个异常定义单独的 error-page 元素。

<error-page>
   <exception-type>java.lang.Throwable</exception-type >
   <location>/ErrorHandler</location>
</error-page>

Cookie 是存储在客户端计算机上的文本文件,它们用于各种信息跟踪目的。Java Servlet 透明地支持 HTTP Cookie。

使用 Servlet 设置 Cookie 包括三个步骤:

(1) 创建 Cookie 对象:您使用 Cookie 构造函数调用 Cookie 名称和 Cookie 值,两者都是字符串。

Cookie cookie = new Cookie("key","value");

请记住,名称和值都不应包含空格或以下任何字符:[ ] ( ) = , " / ? @ : ;

(2) 设置最大年龄:您使用 setMaxAge 指定 Cookie 的有效时间(以秒为单位)。以下将设置一个持续 24 小时的 Cookie。

cookie.setMaxAge(60*60*24); 

(3) 将 Cookie 发送到 HTTP 响应头:您可以使用 response.addCookie 在 HTTP 响应头中添加 Cookie,如下所示

response.addCookie(cookie);

要读取 Cookie,您需要通过调用 HttpServletRequest 的 getCookies() 方法创建一个 javax.servlet.http.Cookie 对象数组。然后遍历该数组,并使用 getName() 和 getValue() 方法访问每个 Cookie 及其关联的值。

删除 Cookie 非常简单。如果您想删除 Cookie,您只需按照以下三个步骤操作:

  • 读取已存在的 Cookie 并将其存储在 Cookie 对象中。

  • 使用 setMaxAge() 方法将 Cookie 的生存期设置为零以删除现有 Cookie。

  • 将此 Cookie 添加回响应头。

会话提供了一种跨多个页面请求或访问网站来识别用户并存储有关该用户信息的方法。会话在一个指定的时间段内持续存在,跨越用户来自的多个连接或页面请求。

您可以在每个 URL 的末尾附加一些额外的数据来标识会话,服务器可以将该会话标识符与它已存储的有关该会话的数据关联起来。例如,对于 https://tutorialspoint.com/file.htm;sessionid=12345,会话标识符附加为 sessionid=12345,可以在 Web 服务器上访问以识别客户端。

您可以通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象,如下所示

// Create a session object if it is already not  created.
HttpSession session = request.getSession();

完成用户会话数据后,您可以选择以下几种方法:

  • 删除特定属性:您可以调用公共方法 public void removeAttribute(String name) 来删除与特定键关联的值。

  • 删除整个会话:您可以调用公共方法 public void invalidate() 来丢弃整个会话。设置会话超时:您可以调用公共方法 public void setMaxInactiveInterval(int interval) 来单独设置会话的超时时间。

  • 注销用户:支持 servlet 2.4 的服务器,您可以调用 logout 方法将客户端注销 Web 服务器并使属于所有用户的全部会话失效。

HttpSession 对象的 setAttribute(String name, Object value) 将对象绑定到此会话,使用指定的名称,并可用于更新会话中的属性。

HttpSession 对象的 setMaxInactiveInterval(int interval) 指定客户端请求之间的时间(以秒为单位),在此时间之后,servlet 容器将使此会话失效。

刷新网页最简单的方法是使用 response 对象的 setIntHeader() 方法。

这意味着使网站能够提供翻译成访问者语言或国籍的不同版本的内容。

这意味着向网站添加资源以使其适应特定的地理区域或文化区域,例如,将网站翻译成印地语。

这是一个特定的文化或地理区域。它通常被称为语言符号后跟一个国家/地区符号,两者之间用下划线分隔。例如,“en_US”代表美国的英语区域设置。

以下是 request 对象的方法,它返回 Locale 对象。

java.util.Locale request.getLocale() 

以下方法返回适合向用户显示的区域设置国家/地区的名称。

String getDisplayCountry()

接下来是什么?

此外,您可以回顾一下您以前完成的科目作业,并确保您可以自信地谈论它们。如果您是应届毕业生,面试官并不期望您能回答非常复杂的问题,而是您必须使自己的基础概念非常牢固。

其次,如果您无法回答一些问题,这实际上并不重要,重要的是您回答的任何问题都必须充满信心。所以在面试时要有信心。我们在 tutorialspoint 祝您面试顺利,并祝您未来的事业一切顺利。干杯 :-)

servlets-questions-answers.htm
广告