Servlets面试问题(Servlets Interview Questions)
亲爱的读者,这些Servlets Interview Questions专门设计用于让您熟悉在面试Servlets Programming时可能遇到的问题的本质。 根据我的经验,优秀的面试官在面试过程中几乎没有计划提出任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的内容:
Java Servlet是在Web或应用程序服务器上运行的程序,充当来自Web浏览器或其他HTTP客户端的请求与HTTP服务器上的数据库或应用程序之间的中间层。
与CGI相比,Servlet具有几个优点。
性能明显更好。
Servlet在Web服务器的地址空间内执行。 没有必要创建一个单独的进程来处理每个客户端请求。
Servlet是独立于平台的,因为它们是用Java编写的。
服务器上的Java安全管理器强制实施一组限制以保护服务器计算机上的资源。 所以servlet是值得信赖的。
servlet可以使用Java类库的完整功能。 它可以通过您已经看到的套接字和RMI机制与applet,数据库或其他软件进行通信。
Servlet执行以下主要任务:
读取客户端(浏览器)发送的显式数据。 这包括网页上的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()方法检查HTTP请求类型(GET,POST,PUT,DELETE等),并根据需要调用doGet,doPost,doPut,doDelete等方法。
GET请求来自对URL的正常请求或来自未指定METHOD的HTML表单,并且应由doGet()方法处理。
POST请求来自HTML表单,该表单专门将POST列为METHOD,它应该由doPost()方法处理。
destroy()方法仅在servlet生命周期结束时调用一次。
init()方法只是创建或加载一些将在servlet的整个生命周期中使用的数据。
此方法使您的servlet有机会关闭数据库连接,暂停后台线程,写入cookie列表或命中磁盘计数,以及执行其他此类清理活动。
应该使用此方法从服务器获取数据。
此方法应用于处理服务器上的数据。
service()方法是执行实际任务的主要方法。 servlet容器(即Web服务器)调用service()方法来处理来自客户端(浏览器)的请求,并将格式化的响应写回客户端。
每次服务器收到servlet请求时,服务器都会生成一个新线程并调用服务。 service()方法检查HTTP请求类型(GET,POST,PUT,DELETE等),并根据需要调用doGet,doPost,doPut,doDelete等方法。
这是此方法的签名:
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
}
service()方法由容器调用,service方法根据需要调用doGe,doPost,doPut,doDelete等方法。 因此,您与service()方法无关,但您可以覆盖doGet()或doPost(),具体取决于您从客户端收到的请求类型。
Servlet根据情况使用以下方法自动处理表单数据解析:
getParameter():您调用request.getParameter()方法来获取表单参数的值。
getParameterValues():如果参数出现多次并返回多个值(例如复选框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响应。
使用请求获取PrintWriter的对象。
PrintWriter out = response.getWriter();
现在打印html。
out.println("Hello World");
我们可以使用HttpServletResponse的setStatus(statuscode)方法发送身份验证错误。
// Set error code and reason.
response.sendError(407, "Need authentication!!!" );
页面重定向通常在文档移动到新位置时使用,我们需要将客户端发送到此新位置,或者可能是因为负载平衡或简单随机化。 将请求重定向到另一个页面的最简单方法是使用响应对象的sendRedirect()方法。
此方法生成302响应以及提供新文档的URL的Location标头。
此方法发送状态代码(通常为404)以及在HTML文档内自动格式化并发送到客户端的短消息。
Servlet过滤器是可用于Servlet编程的Java类,用于以下目的:
在客户端访问后端资源之前拦截客户端的请求。
在将服务器发送回客户端之前操纵服务器的响应。
规格建议有各种类型的过滤器:
验证过滤器。
数据压缩过滤器。
加密过滤器。
触发资源访问事件的过滤器。
图像转换滤镜。
记录和审核过滤器。
MIME-TYPE链过滤器。
标记过滤器。
转换XML内容的XSL/T过滤器。
过滤器部署在部署描述符文件web.xml中,然后映射到应用程序部署描述符中的servlet名称或URL模式。
Web容器调用此方法以向过滤器指示它正在投入使用。
每次由于客户端请求链末端的资源而请求/响应对通过链时,容器都会调用此方法。
Web容器调用此方法以向过滤器指示它正在停止服务。
是。
是。 web.xml中filter-mapping元素的顺序决定了Web容器将过滤器应用于servlet的顺序。 要反转过滤器的顺序,您只需要反转web.xml文件中的过滤器映射元素。
使用web.xml中的error-page元素指定servlet的调用以响应某些异常或HTTP状态代码。
如果您想为所有异常使用通用错误处理程序,那么您应该定义以下错误页面,而不是为每个异常定义单独的错误页面元素:
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/ErrorHandler</location>
</error-page>
Cookie是存储在客户端计算机上的文本文件,用于各种信息跟踪目的。 Java Servlets透明地支持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的末尾附加一些额外数据,并且服务器可以将该会话标识符与其存储的有关该会话的数据相关联。 例如,使用http://iowiki.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();
完成用户的会话数据后,您有以下几种选择:
Remove a particular attribute:您可以调用public void removeAttribute(String name)方法来删除与特定键关联的值。
Delete the whole session:您可以调用public void invalidate()方法来丢弃整个会话。 设置会话超时:您可以调用public void setMaxInactiveInterval(int interval)方法来单独设置会话的超时。
Log the user out:支持servlet 2.4的服务器,您可以调用logout将客户端记录到Web服务器之外,并使属于所有用户的所有会话无效。
HTTPSession对象的setAttribute(String name,Object value)使用指定的名称将对象绑定到此会话,并可用于更新会话中的属性。
HTTPSession对象的setMaxInactiveInterval(int interval)指定servlet容器使此会话无效之前的客户端请求之间的时间(以秒为单位)。
刷新网页的最简单方法是使用响应对象的方法setIntHeader()。
这意味着使网站能够提供翻译成访问者语言或国籍的不同版本的内容。
这意味着向网站添加资源以使其适应特定的地理或文化区域,例如将印地语翻译成网站。
这是一个特定的文化或地理区域。 它通常被称为语言符号,后跟一个由下划线分隔的国家/地区符号。 例如,“en_US”表示美国的英语语言环境。
以下是返回Locale对象的请求对象的方法。
java.util.Locale request.getLocale()
以下方法返回适合显示给用户的区域设置国家/地区的名称。
String getDisplayCountry()
接下来是什么 (What is Next?)
此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。