Servlet是Java EE的一个非常重要的主题,所有Web应用程序框架(例如Spring和Struts)都建立在它之上。 这使servlet成为Java访谈中的热门话题。
在这里,我提供了50个servlet面试问题的列表,并提供了答案,以帮助您解决与Java中的servlet和Web应用程序有关的大多数面试问题。
- Web服务器和应用程序服务器之间有什么区别?
- 哪种HTTP方法不是幂等的?
- GET和POST方法有什么区别?
- 什么是MIME类型?
- 什么是Web应用程序,它的目录结构是什么?
- 什么是servlet?
- Servlet比CGI有什么优势?
- Servlet容器执行哪些常见任务?
- 什么是ServletConfig对象?
- 什么是ServletContext对象?
- ServletConfig和ServletContext有什么区别?
- 什么是请求分派器?
- PrintWriter和ServletOutputStream有什么区别?
- 我们可以同时在Servlet中获得PrintWriter和ServletOutputStream吗?
- 我们如何在servlet中创建死锁情况?
- servlet包装器类有什么用?
- 什么是SingleThreadModel接口?
- 我们是否需要重写service()方法?
- 创建servlet构造函数是个好主意吗?
- GenericServlet和HttpServlet有什么区别?
- servlet间的通信是什么?
- Servlet线程安全吗? 如何在servlet中实现线程安全?
- 什么是servlet属性及其范围?
- 我们如何从另一个servlet调用一个servlet?
- 我们如何在不同的应用程序中调用另一个servlet?
- ServletResponse sendRedirect()和RequestDispatcher forward()方法之间有什么区别?
- 为什么HttpServlet类被声明为抽象的?
- Servlet生命周期的哪些阶段?
- Servlet的生命周期方法是什么?
- 为什么我们应该只覆盖no-agrs init()方法。
- 什么是网址编码?
- Servlet中的会话管理有哪些不同的方法?
- 什么是URL重写?
- Cookies如何在Servlet中工作?
- 当会话无效或超时时,如何通知会话中的对象?
- encodeRedirectUrl和encodeURL有什么区别?
- 为什么我们有servlet过滤器?
- 确保仅当用户具有有效会话时才可访问所有servlet的有效方法是什么?
- 为什么我们有servlet侦听器?
- 如何处理应用程序使用另一个Servlet引发的异常?
- 什么是部署描述符?
- 如何确保在应用程序启动时加载了servlet?
- 如何获取服务器中servlet的实际路径?
- 如何在servlet中获取服务器信息?
- 编写一个servlet以在服务器上上传文件。
- 我们如何进行servlet中的数据库连接和log4j集成?
- 如何在servlet中获取客户端的IP地址?
- Servlet 3的重要功能是什么?
- servlet身份验证有哪些不同的方法?
- 我们如何为我们的Web应用程序实现传输层安全性?
-
Web服务器和应用程序服务器之间有什么区别?
Web服务器的职责是处理来自客户端浏览器的HTTP请求并以HTML响应进行响应。 Web服务器可以理解HTTP语言并可以在HTTP协议上运行。
Apache Web Server是一种Web服务器,然后我们有可以执行servlet和JSP(称为servlet容器)的特定容器,例如Tomcat。
Application Server提供了其他功能,例如Enterprise JavaBeans支持,JMS Messaging支持,事务管理等。因此,可以说Application Server是一个Web服务器,它具有其他功能来帮助开发人员使用企业应用程序。 -
哪种HTTP方法不是幂等的?
如果HTTP方法每次都返回相同的结果,则它被认为是幂等的。 HTTP方法GET,PUT,DELETE,HEAD和OPTIONS是幂等方法,我们应该实现应用程序以确保这些方法始终返回相同的结果。 HTTP方法POST是非幂等方法,在实现随每个请求更改的内容时,我们应该使用post方法。
例如,要访问HTML页面或图像,我们应该使用GET,因为它将始终返回相同的对象,但是如果我们必须将客户信息保存到数据库中,则应该使用POST方法。 幂等方法也称为安全方法,我们不在乎客户端对安全方法的重复请求。
-
GET和POST方法有什么区别?
- GET是一种安全的方法(幂等),其中POST是非幂等方法。
- 我们可以使用GET方法发送有限的数据,并将其发送到标头请求URL中,而我们可以使用POST发送大量数据,因为它是正文的一部分。
- GET方法不安全,因为数据在URL中公开,我们可以轻松地对其添加书签并再次发送类似的请求,而POST是安全的,因为数据是在请求正文中发送的,因此我们不能对其添加书签。
- GET是默认的HTTP方法,而我们需要将方法指定为POST才能使用POST方法发送请求。
- 页面中的超链接使用GET方法。
-
什么是MIME类型?
“ Content-Type”响应头被称为MIME类型。 服务器将MIME类型发送给客户端,以使客户端知道其发送的数据类型。 它可以帮助客户端为用户呈现数据。 一些最常用的mime类型是text / html,text / xml,application / xml等。
我们可以使用ServletContext getMimeType()方法来获取文件的正确MIME类型,并使用它来设置响应内容类型。 在通过servlet从服务器下载文件时非常有用。
-
什么是Web应用程序,它的目录结构是什么?
Web应用程序是在服务器上运行的模块,用于向客户端浏览器提供静态和动态内容。 Apache Web服务器支持PHP,我们可以使用PHP创建Web应用程序。 Java通过可在Servlet容器中运行并向客户端浏览器提供动态内容的Servlet和JSP提供Web应用程序支持。
Java Web应用程序打包为Web存档(WAR),并且具有如下图所示的已定义结构。
在Java Web Application上了解有关Web应用程序的更多信息。
-
什么是servlet?
Java Servlet是服务器端技术,通过提供对动态响应和数据持久性的支持来扩展Web服务器的功能。
javax.servlet和javax.servlet.http包提供用于编写我们自己的servlet的接口和类。
所有servlet必须实现javax.servlet.Servlet接口,该接口定义了servlet生命周期方法。 在实现通用服务时,我们可以扩展Java Servlet API随附的GenericServlet类。 HttpServlet类提供用于处理HTTP特定服务的方法,例如doGet()和doPost()。大多数时候,使用HTTP协议访问Web应用程序,这就是为什么我们主要扩展HttpServlet类的原因。 Servlet API层次结构如下图所示。
在Servlet教程中内容。
-
Servlet比CGI有什么优势?
引入Servlet技术是为了克服CGI技术的缺点。
- Servlet在处理时间,内存利用率方面提供了比CGI更好的性能,因为Servlet利用了多线程的优势,并且为每个请求创建了一个新线程,这比为CGI为每个请求加载创建新对象要快。
- 用Servlet开发的Web应用程序与Servlet和平台和系统无关,可以在任何标准Web容器(例如Tomcat,JBoss,Glassfish服务器)上运行,也可以在Windows,Linux,Unix,Solaris,Mac等操作系统上运行。
- Servlet的功能强大,因为容器负责Servlet的生命周期,因此我们无需担心内存泄漏,安全性,垃圾回收等问题。
- Servlet是可维护的,学习曲线很小,因为我们需要注意的是应用程序的业务逻辑。
-
Servlet容器执行哪些常见任务?
Servlet容器也称为Web容器,例如Tomcat。 Servlet容器的一些重要任务是:
- 通讯支持 :Servlet容器提供了Web客户端(浏览器)与Servlet和JSP之间的简便通讯方式。 由于容器的原因,我们不需要构建服务器套接字来侦听来自Web客户端的任何请求,解析请求并生成响应。 所有这些重要而复杂的任务都是由容器完成的,我们需要关注的只是应用程序的业务逻辑。
- 生命周期和资源管理 :Servlet容器负责管理 Servlet的生命周期。 从将Servlet加载到内存中,初始化Servlet,调用Servlet方法并销毁它们。 容器还提供实用程序(如JNDI)进行资源池和管理。
- 多线程支持 :容器为对Servlet的每个请求创建新线程,并为它们提供请求和响应对象以进行处理。 因此,不必为每个请求初始化servlet,这样可以节省时间和内存。
- JSP支持 :JSP看起来不像普通的Java类,但是应用程序中的每个JSP都是由容器编译并转换为Servlet,然后容器像其他Servlet一样管理它们。
- 杂项任务 :Servlet容器管理资源池,执行内存优化,执行垃圾收集器,提供安全配置,支持多个应用程序,热部署以及其他一些后台任务,从而使开发人员的工作变得更轻松。
-
什么是ServletConfig对象?
javax.servlet.ServletConfig
用于将配置信息传递给Servlet。 每个servlet都有自己的ServletConfig对象,并且servlet容器负责实例化此对象。 我们可以在web.xml文件中或通过使用WebInitParam批注提供servlet初始化参数。 我们可以使用getServletConfig()方法来获取Servlet的ServletConfig对象。 -
什么是ServletContext对象?
javax.servlet.ServletContext
接口提供对servlet的Web应用程序参数的访问。 ServletContext是唯一的对象,可用于Web应用程序中的所有Servlet。 当我们希望某些初始化参数可用于Web应用程序中的多个或所有Servlet时,我们可以使用ServletContext对象,并使用<context-param>元素在web.xml中定义参数。 我们可以通过ServletConfig的getServletContext()方法获取ServletContext对象。 Servlet容器还可以提供一组Servlet唯一的上下文对象,并与主机的URL路径名称空间的特定部分绑定。ServletSpec 3中增强了ServletContext,以引入一些方法,通过这些方法,我们可以以编程方式向应用程序添加侦听器,过滤器和Servlet。 它还提供了一些实用程序方法,例如getMimeType() , getResourceAsStream()等。
-
ServletConfig和ServletContext有什么区别?
ServletConfig和ServletContext之间的一些区别是:
- ServletConfig是每个Servlet的唯一对象,而ServletContext是完整应用程序的唯一对象。
- ServletConfig用于向Servlet提供初始化参数,而ServletContext用于提供所有其他Servlet可以使用的应用程序级初始化参数。
- 我们不能在ServletConfig对象中设置属性,而可以在ServletContext中设置其他servlet可以在其实现中使用的属性。
-
什么是请求分派器?
RequestDispatcher接口用于将请求转发到另一个资源,该资源可以是HTML,JSP或同一应用程序中的另一个servlet。 我们还可以使用它来将另一个资源的内容包括到响应中。 此接口用于同一上下文中的servlet间通信。
此接口中定义了两种方法:
- void forward(ServletRequest请求,ServletResponse响应)–将请求从Servlet转发到服务器上的另一个资源(Servlet,JSP文件或HTML文件)。
- void include(ServletRequest request,ServletResponse response)–在响应中包含资源的内容(Servlet,JSP页面,HTML文件)。
我们可以使用ServletContext getRequestDispatcher(String path)方法在Servlet中获取RequestDispatcher。 该路径必须以/开头,并被解释为相对于当前上下文根。
-
PrintWriter和ServletOutputStream有什么区别?
PrintWriter是字符流类,而ServletOutputStream是字节流类。 我们可以使用PrintWriter将基于字符的信息(如字符数组和String)写入响应,而我们可以使用ServletOutputStream将字节数组数据写入响应。
我们可以使用ServletResponse getWriter()获取PrintWriter实例,而我们可以使用ServletResponse getOutputStream()方法获取ServletOutputStream对象引用。
您可以在Java IO Tutorial中阅读有关Java的更多信息。
-
我们可以同时在Servlet中获得PrintWriter和ServletOutputStream吗?
如果我们同时调用两个方法,则无法在单个servlet方法中获得PrintWriter和ServletOutputStream的实例。 响应时为getWriter()和getOutputStream(); 我们将在运行时通过消息获取
java.lang.IllegalStateException
,因为已经为此响应调用了其他方法。 -
我们如何在servlet中创建死锁情况?
我们可以通过循环调用方法来在Servlet中创建死锁,只需从doGet()方法和doGet()方法中的doPost()方法调用doPost()方法即可在Servlet中创建死锁情况。
在Java Deadlock Example中阅读有关多线程中死锁的更多信息。
-
servlet包装器类有什么用?
Servlet HTTP API提供了两个包装器类–
HttpServletRequestWrapper
和HttpServletResponseWrapper
。 提供这些包装器类可帮助开发人员自定义实现Servlet请求和响应类型。 我们可以扩展这些类,并仅覆盖为自定义请求和响应对象需要实现的特定方法。 在普通的servlet编程中不使用这些类。 -
什么是SingleThreadModel接口?
提供SingleThreadModel接口是为了确保线程安全,它确保在servlet的service方法中不会同时执行两个线程。 但是,SingleThreadModel不能解决所有线程安全问题。 例如,即使使用SingleThreadModel servlet,会话属性和静态变量仍然可以被多个线程上的多个请求同时访问。 此外,它还充分利用了Servlet的多线程支持的所有优点,这就是Servlet 2.4中不推荐使用此接口的原因。
-
我们是否需要重写service()方法?
当Servlet容器接收到客户端请求时,它会调用service()方法,该方法又会基于请求的HTTP方法来调用doGet()和doPost()方法。 我看不到要覆盖service()方法的任何用例。 service()方法的全部目的是转发请求到相应的HTTP方法实现。 如果必须对请求进行一些预处理,则可以始终使用Servlet过滤器和侦听器。
-
创建servlet构造函数是个好主意吗?
我们可以为servlet定义一个构造函数,但我认为它没有任何用处,因为除非容器初始化servlet,否则我们将无法访问ServletConfig对象。 理想情况下,如果必须初始化Servlet的任何资源,则应该重写init()方法,在此方法中,我们可以使用ServletConfig对象访问servlet的初始化参数。
-
GenericServlet和HttpServlet有什么区别?
GenericServlet是Servlet接口的协议独立实现,而HttpServlet是HTTP协议特定的实现。 大多数时候,我们使用servlet来创建Web应用程序,这就是我们扩展HttpServlet类的原因。 HttpServlet类扩展了GenericServlet,还提供了一些其他特定于HTTP协议的方法。
-
servlet间的通信是什么?
当我们想从servlet服务方法中调用另一个servlet时,我们使用servlet间通信机制。 我们可以使用RequestDispatcher forward()和include()方法调用另一个servlet,并在请求中提供其他属性以供其他servlet使用。
-
如何在servlet中实现线程安全?
HttpServlet的init()方法和destroy()方法在servlet生命周期中仅被调用一次,因此我们不必担心它们的同步。 但是在每个客户端请求中都会调用诸如doGet()或doPost()之类的服务方法,并且由于servlet使用多线程,因此我们应该在这些方法中提供线程安全性。
如果服务方法中有任何局部变量,则无需担心它们的线程安全性,因为它们特定于每个线程,但是如果我们拥有共享资源,则可以在使用共享时使用同步来实现Servlet中的线程安全性。资源。
线程安全性机制类似于独立Java应用程序中的线程安全性,请在Thread Safety in Java中阅读有关它们的更多信息。
-
什么是servlet属性及其范围?
Servlet属性用于Servlet间的通信,我们可以在Web应用程序中设置,获取和删除属性。 servlet属性有三个范围-请求范围,会话范围和应用程序范围。
ServletRequest,HttpSession和ServletContext接口分别提供了从请求,会话和应用程序范围获取/设置/删除属性的方法。
Servlet属性与在web.xml中为ServletConfig或ServletContext定义的初始化参数不同。
-
我们如何从另一个servlet调用一个servlet?
我们可以使用RequestDispatcher forward()方法将请求的处理转发到另一个servlet。 如果要在响应中包含另一个servlet输出,则可以使用RequestDispatcher include()方法。
-
我们如何在不同的应用程序中调用另一个servlet?
我们不能使用RequestDispatcher从另一个应用程序调用servlet,因为它是特定于该应用程序的。 如果必须将请求转发到另一个应用程序中的资源,则可以使用ServletResponse sendRedirect()方法并提供另一个Servlet的完整URL。 这会将响应发送给客户端,响应代码为302,以将请求转发到另一个URL。 如果还必须发送一些数据,则可以使用cookie,它将作为servlet响应的一部分,并将请求发送到另一个servlet。
-
ServletResponse sendRedirect()和RequestDispatcher forward()方法之间有什么区别?
- RequestDispatcher forward()用于将同一请求转发到另一个资源,而ServletResponse sendRedirect()是一个两步过程。 在sendRedirect()中,Web应用程序使用状态码302(重定向)和URL将响应返回给客户端,以发送请求。 发送的请求是一个全新的请求。
- forward()由容器内部处理,而sednRedirect()由浏览器处理。
- 访问同一应用程序中的资源时,我们应该使用forward(),因为它比需要额外网络调用的sendRedirect()方法要快。
- 在forward()中,浏览器不了解实际的处理资源,并且地址栏中的URL保持不变,而在sendRedirect()中,地址栏中的URL更改为转发的资源。
- forward()不能用于在另一个上下文中调用servlet,在这种情况下,我们只能使用sendRedirect()。
-
为什么HttpServlet类被声明为抽象的?
HttpServlet类提供Servlet的HTTP协议实现,但由于在诸如getGet()和doPost()之类的服务方法中没有实现逻辑,因此它仍然是抽象的,我们应该重写至少一个服务方法。 这就是为什么拥有HttpServlet实例并被声明为抽象类毫无意义的原因。
阅读有关抽象类的更多信息。
-
Servlet生命周期的哪些阶段?
我们知道,Servlet容器管理着Servlet的生命周期,Servlet生命周期分为四个阶段。
- Servlet类加载–当容器收到对Servlet的请求时,它首先将该类加载到内存中,并调用其默认的no-args构造函数。
- Servlet类初始化–加载Servlet类后,容器将初始化Servlet的ServletContext对象,然后通过传递servlet配置对象来调用其init方法。 这是servlet类从普通类转换为servlet的地方。
- 请求处理–初始化servlet后,就可以处理客户端请求了。 对于每个客户端请求,servlet容器都会生成一个新线程,并通过传递请求和响应对象引用来调用service()方法。
- 从服务中删除–当容器停止或我们停止应用程序时,servlet容器通过调用它的destroy()方法来破坏该servlet类。
-
Servlet的生命周期方法是什么?
Servlet生命周期包含三种方法:
- public void init(ServletConfig config)–容器使用此方法初始化servlet,此方法在servlet的生命周期中仅被调用一次。
- 公共无效服务(ServletRequest请求,ServletResponse响应)–对于每个请求都调用一次此方法,除非执行init()方法,否则容器不能调用service()方法。
- public void destroy()–当从内存中卸载servlet时,将调用此方法一次。
-
为什么我们应该只覆盖no-agrs init()方法。
如果要在我们的servlet处理客户端请求之前必须初始化一些资源,则应重写init()方法。 如果我们重写init(ServletConfig config)方法,则第一个语句应为super(config),以确保首先调用超类init(ServletConfig config)方法。 这就是为什么GenericServlet提供了另一个帮助程序init()方法,该方法没有在init(ServletConfig config)方法末尾调用的参数。 我们应该始终利用此方法来覆盖init()方法,以避免出现任何问题,因为我们可能会忘记在使用ServletConfig参数的覆盖init方法中添加super()调用。
-
什么是网址编码?
URL编码是将数据转换为CGI格式的过程,以便它可以在网络中传播而不会出现任何问题。 URL编码去除空格,并用转义符替换特殊字符。 我们可以使用java.net.URLEncoder.encode(String str,String unicode)对String进行编码。 URL解码是编码的反向过程,我们可以使用java.net.URLDecoder.decode(String str,String unicode)对编码的字符串进行解码。 例如,“ Pankaj的数据”被编码为“ Pankaj%27s + Data”。
-
Servlet中的会话管理有哪些不同的方法?
会话是客户端和服务器之间的转换状态,它可以包含客户端和服务器之间的多个请求和响应。 由于HTTP和Web Server都是无状态的,因此维护会话的唯一方法是在每次请求和响应中在服务器和客户端之间传递有关会话的某些唯一信息(会话ID)时。
Servlet中会话管理的一些常用方法是:
- 用户认证
- HTML隐藏字段
- 饼干
- URL重写
- 会话管理API
在Servlet会话管理教程中详细了解有关这些会话管理方法的更多信息。
-
什么是URL重写?
我们可以在servlet中使用HttpSession进行会话管理,但是它可以与Cookies一起使用,并且可以在客户端浏览器中禁用cookie。 Servlet API提供了对URL重写的支持,在这种情况下,我们可以使用它来管理会话。
从编码的角度来看,最好的部分是,它非常易于使用,并且涉及一个步骤-编码URL。 Servlet URL编码的另一个好处是,它是一种后备方法,只有在禁用浏览器cookie的情况下,它才能启动。
我们可以使用HttpServletResponse encodeURL()方法对URL进行编码,如果必须将请求重定向到另一个资源,并且想要提供会话信息,则可以使用encodeRedirectURL()方法。
在Servlet URL Rewriting上内容。
-
Cookies如何在Servlet中工作?
Cookie在Web客户端与服务器之间的通信中被大量使用,它不是Java特有的。 Cookies是服务器发送到客户端的文本数据,并保存在客户端本地计算机上。
Servlet API通过实现Serializable和Cloneable接口的javax.servlet.http.Cookie类提供cookie支持。
提供HttpServletRequest getCookies()方法可从请求中获取Cookie数组,由于没有向请求添加Cookie的意义,因此没有设置或向请求添加Cookie的方法。
类似地,提供了HttpServletResponse addCookie(Cookie c)方法来将cookie附加到响应头中,没有用于cookie的getter方法。
在Servlet中的Cookies中了解更多信息。
-
当会话无效或超时时,如何通知会话中的对象?
如果必须确保在销毁会话时通知对象,则该对象应实现
javax.servlet.http.HttpSessionBindingListener
接口。 该接口定义了两个回调方法– valueBound()和valueUnbound(),当将对象作为属性添加到会话中以及销毁会话时,我们可以定义这些回调方法来实现处理逻辑。建议阅读Servlet Listener 。
-
encodeRedirectUrl和encodeURL有什么区别?
HttpServletResponse提供了在HTML超链接中对URL进行编码的方法,以便转义特殊字符和空格并将会话ID附加到URL。 它的行为类似于URLEncoder编码方法,但具有额外的过程以在URL末尾附加jsessionid参数。
但是,HttpServletResponse encodeRedirectUrl()方法专门用于对响应中的重定向URL进行编码。
因此,当我们提供URL重写支持时,对于HTML响应中的超链接,我们应该使用encodeURL()方法,而对于重定向URL,我们应该使用encodeRedirectUrl()方法。
-
为什么我们有servlet过滤器?
Servlet过滤器是可插入的Java组件,我们可以使用它们来拦截和处理请求,然后再将请求发送到Servlet,并在Servlet代码完成之后以及容器将响应发送回客户端之前进行响应。
我们可以使用过滤器执行的一些常见任务是:
- 记录请求参数以记录文件。
- 对资源请求的身份验证和授权。
- 在将请求正文或报头发送到servlet之前进行格式化。
- 压缩发送给客户端的响应数据。
- 通过添加一些cookie,标头信息等来更改响应。
在Servlet Filter中阅读有关过滤器的更多信息。
-
确保仅当用户具有有效会话时才可访问所有servlet的有效方法是什么?
我们知道servlet过滤器可用于拦截servlet容器和servlet之间的请求,我们可以利用它来创建身份验证过滤器并检查请求是否包含有效会话。
在Servlet筛选器示例中查看Authentication Filter的示例。
-
为什么我们有servlet侦听器?
我们知道,使用ServletContext,我们可以创建一个应用程序范围内的属性,所有其他servlet都可以访问该属性,但是我们只能在部署描述符(web.xml)中将ServletContext初始化参数初始化为String。 如果我们的应用程序是面向数据库的,并且我们想在ServletContext中为数据库连接设置一个属性,该怎么办?
如果您的应用程序只有一个入口点(用户登录),那么您可以在第一个servlet请求中进行操作,但是如果我们有多个入口点,那么在任何地方都进行操作将导致大量代码冗余。 另外,如果数据库已关闭或配置不正确,我们将直到第一个客户端请求到达服务器时才知道。 为了处理这些情况,Servlet API提供了侦听器接口,我们可以将其实现和配置为侦听事件并执行某些操作。
在Servlet Listener上了解有关不同类型的侦听器和示例的更多信息。
-
如何处理应用程序使用另一个Servlet引发的异常?
如果您注意到,doGet()和doPost()方法将抛出ServletException和IOException。 由于浏览器仅了解HTML,因此当我们的应用程序引发异常时,servlet容器将处理该异常并生成HTML响应。 其他错误代码(例如404、403等)也是如此。
Servlet API支持可在部署描述符中配置的自定义Exception和Error Handler servlet,这些servlet的全部目的是处理应用程序引发的Exception或Error并发送对用户有用HTML响应。 我们可以提供指向应用程序主页的链接或一些详细信息,以使用户知道出了什么问题。
我们可以在web.xml中配置它们,如下所示:
<error-page><error-code>404</error-code><location>/AppExceptionHandler</location> </error-page><error-page><exception-type>javax.servlet.ServletException</exception-type><location>/AppExceptionHandler</location> </error-page>
在Servlet异常处理中内容。
-
什么是部署描述符?
部署描述符是Web应用程序的配置文件,名称是web.xml,位于WEB-INF目录中。 Servlet容器使用此文件来配置Web应用程序Servlet,Servlet配置参数,上下文初始化参数,过滤器,侦听器,欢迎页面和错误处理程序。
使用Servlet 3.0批注,通过使用批注配置Servlet,过滤器和侦听器,我们可以从web.xml中消除很多混乱。
-
如何确保在应用程序启动时加载了servlet?
通常,servlet容器会在第一个客户端请求上加载servlet,但是有时当servlet很重并且加载时间很长时,我们可能希望在应用程序启动时加载它。 我们可以将load-on-startup元素与web.xml文件中的servlet配置一起使用,或者使用WebServlet批注loadOnStartup变量来告诉容器在系统启动时加载servlet。
<servlet><servlet-name>foo</servlet-name><servlet-class>com.foo.servlets.Foo</servlet-class><load-on-startup>5</load-on-startup> </servlet>
启动时加载的值应为int,如果为0或负整数,则servlet容器将根据客户端请求和要求加载servlet,但如果为正数,则容器将在应用程序启动时加载它。
如果有多个servlet,其启动时加载值为1,2,3,则将首先加载较低的整数值servlet。
-
如何获取服务器中servlet的实际路径?
我们可以使用以下代码片段获取文件系统中servlet的实际路径。
getServletContext().getRealPath(request.getServletPath())
-
如何在servlet中获取服务器信息?
我们可以使用下面的代码片段通过servlet上下文对象获取servlet中的servlet信息。
getServletContext().getServerInfo()
-
编写一个servlet以在服务器上上传文件。
Java Web应用程序中的文件上传和下载以及常见任务。 不幸的是,Servlet API没有提供在服务器上上传文件的简便方法,因此我们可以使用Apache FileUpload jar来简化我们的生活。
请阅读“ 文件上传Servlet”一文 ,其中提供了所有必要的详细信息以及示例程序,以使用Servlet上传和下载文件。
-
我们如何进行servlet中的数据库连接和log4j集成?
如果您在Web应用程序中使用大量数据库连接,则最好在Servlet上下文侦听器中对其进行初始化,并将其设置为其他Servlet使用的上下文属性。
在Web应用程序中,集成Log4j也非常容易,我们需要的是一个log4j配置XML或属性文件,然后在servlet上下文侦听器中对其进行配置。
有关完整的示例,请查看Servlet数据库和Log4j示例 。
-
如何在servlet中获取客户端的IP地址?
我们可以使用
request.getRemoteAddr()
获取Servlet中的客户端IP地址。 -
Servlet 3的重要功能是什么?
Servlet Specs 3.0是一个主要版本,其中一些重要功能包括:
- Servlet注释 :在Servlet 3之前,所有servlet映射及其init参数都已在web.xml中定义,当应用程序中的servlet数量很大时,这样做不方便且更容易出错。
Servlet 3引入了使用Java批注来定义servlet,过滤器和侦听器servlet以及init参数的方法。 一些重要的Servlet API批注是WebServlet,WebInitParam,WebFilter和WebListener。 在Servlet 3注释中阅读有关它们的更多信息。 - Web Fragments : Prior to servlet specs 3.0, all the web application configurations are required to be present in the web.xml that makes it cluttered with lot of elements and chances of error increases. So servlet 3 specs introduced web fragments where we can have multiple modules in a single web application, all these modules should have web-fragment.xml file in META-INF directory. We can include all the elements of web.xml inside the web-fragment.xml too. This helps us in dividing our web application into separate modules that are included as JAR file in the web application lib directory.
- Adding Web Components dynamically : We can use ServletContext object to add servlets, filters and listeners programmatically. This helps us in building dynamic system where we are loading a component only if we need it. These methods are addServlet(), addFilter() and addListener() defined in the servlet context object.
- Asynchronous Processing : Asynchronous support was added to delegate the request processing to another thread rather than keeping the servlet thread busy. It can increase the throughput performance of the application. This is an advance topic and I recommend to read Async Servlet tutorial.
- Servlet注释 :在Servlet 3之前,所有servlet映射及其init参数都已在web.xml中定义,当应用程序中的servlet数量很大时,这样做不方便且更容易出错。
-
What are different ways for servlet authentication?
Servlet Container provides different ways of login based servlet authentication:
- HTTP Basic Authentication
- HTTP Digest Authentication
- HTTPS Authentication
- Form Based Login : A standard HTML form for authentication, advantage is that we can change the login page layout as our application requirements rather than using HTTP built-in login mechanisms.
-
How can we achieve transport layer security for our web application?
We can configure our servlet container to use SSL for message communication over the network. To configure SSL on Tomcat, we need a digital certificate that can be created using Java keytool for development environment. For production environment, you should get the digital certificate from SSL certificate providers, for example, Verisign or Entrust.
Read more at Configure SSL on Tomcat article.
-
That's all for the servlet interview questions and answers. I will keep on adding more servlet based interview questions to the list in future, so don't forget to bookmark it for future reference.
翻译自: https://www.javacodegeeks.com/2013/08/50-servlet-interview-questions-and-answers.html