什么是JSP?
JSP 代表 JavaServer Pages。JSP 是用于创建动态网页的 Java 服务器端技术。JSP 是 Servlet 技术的扩展,可帮助开发人员创建具有类似 HTML 语法的动态页面。
用户也在 servlet 中创建用户视图,但代码变得丑陋且容易出错。而且,由于网页上的大部分元素都是静态的,因此 JSP 页面适用于网页。应避免 JSP 页面中的业务逻辑,并且必须仅用于查看目的。
最佳JSP面试题和答案合集
现在让我们看看流行的 JSP 面试问题和答案。
问:JSP有什么好处?
答:应避免使用 JSP 脚本元素在 JSP 页面中编写 Java 代码,而应使用 JSTL 标签、JSP 操作元素或自定义标签来实现相同的功能。
JSP 的另一个好处是大多数容器都支持 JSP 页面的热部署。在 JSP 页面中进行更改并将旧页面替换为部署目录中更新后的 JSP 页面,然后容器加载新的 JSP 页面。我们不需要编译我们的项目代码或重新启动服务器,不像在 servlet 代码中进行更改时,我们需要再次构建完整的项目并部署。尽管大多数容器仍然为应用程序提供热部署支持,但它比 JSP 页面的工作量更大。
问题:解释 JSP 的生命周期阶段
JSP常见面试题有哪些?一个典型的 JSP 页面代码看起来像 HTML,不像 Java 类。JSP 容器负责翻译 JSP 页面并创建在 Web 应用程序中使用的 servlet 类。以下是 JSP 生命周期的各个阶段:
- 翻译:检查和解析 JSP 代码以生成 servlet 源代码。例如,在Tomcat中,制作的servlet类文件位于名为TOMCAT/work/Catalina/localhost/WEBAPP/org/apache/JSP的目录中。如果 home.jsp 是 JSP 页面名称,那么通常生成的 servlet 类名称是 home_jsp,home_jsp.java 是文件名。
- 编译:在这个阶段,JSP容器编译JSP类源代码,并产生一个类文件。
- ClassLoading:在这个阶段,容器将类加载到内存中。
- 实例化:容器调用生成类的无参数构造函数,将其加载到内存中并实例化。
- 初始化:容器调用JSP类对象的init方法,使用部署描述符中配置的init params对servlet config进行初始化。在此阶段之后,JSP 已准备好处理客户端请求。通常,JSP 初始化的转换发生在第一个 JSP 请求到来时。不过,我们可以将其配置为在部署时加载和初始化,就像使用 load-on-startup 元素的 servlet。
- 请求处理: 这是处理客户端请求时 JSP 页面最长的生命周期。处理是多线程的,类似于 servlet,并且为每个应用程序生成一个新线程。创建 Servlet 请求和 ServletResponse 对象,并调用 JSP 服务方法。
- 销毁:它是 JSP 生命周期的最后阶段,在此阶段从内存中卸载 JSP 类。通常,它发生在应用程序未部署或服务器关闭时。
问题:讨论 JSP 生命周期
答: JSP 生命周期由以下方法组成:
- jspInit():是在JspPage中声明的一个方法,由JSP容器实现实现。该方法在 JSP 生命周期中被调用一次,以使用部署描述符中配置的配置参数对其进行初始化。我们可以使用 JSP 声明脚本元素覆盖这个方法来初始化我们想要在 JSP 页面中使用的任何资源。
- _jspService():它是JSP 容器为绕过请求和响应对象的每个客户端请求调用的JSP 方法。请注意,方法名称以下划线开头以区别于其他生命周期方法,因为此方法不能被覆盖。所有 JSP 代码都在方法内部,默认情况下会被替换。我们不应该尝试使用 JSP 声明脚本元素来替换它。该方法在 HttpJspPage 接口中定义。
- jspDestroy():当JSP从内存中卸载时,例如关闭应用程序或盒子时,容器会调用该方法。该方法在 JSP 生命周期中仅被调用一次,并且该方法被覆盖以释放在 JSP init 方法中创建的资源。
问题:是否可以覆盖 JSP 生命周期方法?如果是,哪些方法可以被覆盖?
答:是的,我们可以覆盖 JSP 生命周期方法。可以使用 JSP 声明脚本元素覆盖 jspInit() 和 jspDestroy() 等方法。我们覆盖 jspInit() 方法来创建我们想要在 JSP 服务方法中使用的公共资源,并覆盖 jspDestroy() 方法以释放公共资源。
问题:提及 JSP 中使用的字面量
答: JSP 使用以下文字;
- Null
- Boolean
- String
- Integer
- Float
问题:列出JSP Bean开发中用到的三个重要标签
答: JSP Bean开发使用如下三个标签:
- jsp:useBean
- jsp:setProperty
- jsp:getProperty
问题:JSP 中有哪些不同类型的注释?
答: JSP 页面提供了两种类型的注释,我们可以使用:
- HTML 注释:我们可以使用像 <!-- HTML Comment --> 这样的 HTML 注释,因为 JSP 页面就像 HTML。这些注释也会发送到客户端,并且可以在 HTML 源代码中看到。所以我们必须避免使用 HTML 注释来调试注释或代码级注释。
- JSP 注释:像 <%-- JSP Comment --%> 这样的 Scriptlet 用于编写 JSP 注释。这些注释不会发送到客户端,而是存在于生成的 servlet 源代码中。我们应该将 JSP 注释用于任何代码级别或调试信息注释。
问题:描述 JSP 中的脚本元素
回答:
表达式、Scriptlet 和声明是 JSP 页面中的脚本元素,使用它们在 JSP 页面中添加 java 代码。
在 scriptlet 标签内编写的任何代码都会进入 _jspService() 方法。scriptlet 标记以 <% 开头,以 %> 结尾。例如;
<%
Date dt = new Date( );
System.out.println("Current Date=" +dt);
%>
有一个快捷方式可以通过 JSP 表达式使用 out.print( ) 方法在 JSP 页面中打印动态数据。JSP 表达式以 <%= 开头,以 %> 结尾。
<% out.print("John"); %> can be written using JSP Expression as <%= "John" %>
请注意 <%= %> 内的任何内容都作为参数发送到 out.print() 方法。另请注意,scriptlet 可以包含多个 java 语句并且始终以分号 (;) 结尾,但表达式不以分号结尾。
servlet 类的成员变量和方法的声明是使用 JSP 声明进行的。JSP 声明分别以“<%!”、“%>”开始和结束。
例如,我们在 JSP 中在类级别创建一个 int 变量为 <%! 公共静态整数计数=0;%>。
问题:隐藏注释和输出注释的区别。
答: JSP 注释称为隐藏注释,而 HTML 注释称为输出注释。如果用户查看页面源代码,则不会显示 JSP 注释,而会显示 HTML 注释。
问题:为什么不鼓励在 JSP 中使用脚本元素?
答: JSP常见面试题有哪些 - JSP 页面用于查看目的,所有业务逻辑都应该在 servlet 或模型类中。我们应该通过属性将参数传递给 JSP 页面,然后使用它们在 JSP 页面中创建 HTML 响应。
大多数 JSP 页面都包含 HTML 代码,为了帮助 Web 设计人员理解 JSP 页面并快速开发它们,JSP 技术提供了操作元素、JSP 标准标记库、JSP EL 和我们使用的自定义标记而不是脚本元素来弥合差距JSP HTML 和 JSP java 部分之间。
问题:JSTL 标签的五种类型是什么?
答:根据JSTL的功能分为五类:
- 核心标签: 提供对迭代、条件逻辑、捕获异常、URL、转发或重定向响应等的支持。
- 格式和本地化标签: 通过资源包和语言环境提供日期、数字和 i18n 支持的格式。
- SQL 标签: 提供与 Oracle、MySql 等关系数据库交互的支持。
- XML 标签:用于处理 XML 文档,例如解析 XML、转换 XML 数据和 XPath 表达式评估。
- JSTL 函数标签: JSTL 标签提供了几个我们可以用来执行标准操作的函数;其中大部分用于字符串操作,例如字符串连接、拆分字符串等。
问题:什么是 JSP 自定义标记,JSP 自定义标记的组成部分是什么?
JSP面试题分析: Action Tags、JSP EL、JSTL 标签有时是不够的,它可能会诱使我们用Java 编写代码在JSP 页面上执行一些操作。幸运的是,JSP 是可扩展的,我们可以创建自定义标签来提供某些服务。
我们可以使用以下组件创建 JSP 自定义标签:
- JSP 自定义标记处理程序
- 创建标签库描述符 (TLD) 文件
- TLD 的部署描述符配置
我们可以使用 taglib 指令在 JSP 页面中添加自定义标记库,然后使用它。
问题:什么是 JSP 隐式对象?
答: 最佳JSP面试题和答案合集 - Web 容器在将 JSP 页面转换为 Servlet 源以帮助开发人员时创建的对象是 JSP 隐式对象。我们直接在进入服务方法的 scriptlet 中使用这些对象。但是,它们不能在 JSP 声明中使用,因为该代码将在类级别进行。
我们有九个可以直接在 JSP 页面上使用的隐式对象。其中七个在 _jspService() 方法开始时被声明为局部变量,而其中两个是我们可以使用的 _jspService() 方法参数的一部分。
- out
- request
- response
- config
- application
- session
- pageContext
- page
- exception
问题:我们可以在 JSP 声明中定义的方法中使用 JSP 隐式对象吗?对或错?证明合法
回答:错!因为这些对象是服务方法的本地对象,所以这些 JSP 隐式对象也是由 JSP Container 添加的。它还将 JSP 页面转换为 servlet 源代码。JSP 声明代码在服务方法之外,用于创建类级别的变量和方法。因此不能使用 JSP 隐式对象。
问题:如何在 JSP 中包含静态文件?
答:可以使用 include 指令将静态页面包含在 JSP 中。在翻译阶段以这种方式执行一次包含。必须为文件属性提供相对 URL。尽管可以包含静态资源,但它不是首选,因为每个请求都需要包含在内。
问题:解释客户端和服务器端验证。
答:验证是在浏览器内的客户端使用 JavaScript 和 HTML 进行的。客户端验证的主要优点是它不需要网络旅行,因为它发生在客户端的机器上,因此可以提供近乎即时的反馈。有一些客户端约束需要应用于 HTML 无法处理的输入。使用 JavaScript 验证表单。我们向表单添加了一个事件监听器,以便我们可以在表单提交之前执行一些 JavaScript。信用卡信息是 JavaScript 客户端验证的典型示例。
信任服务器端验证对所有输入执行而不会失败。客户端应该在向用户显示任何成功或错误消息之前等待服务器的响应,因为服务器在收到 HTTP 请求之前无法执行其验证。在验证失败的情况下,需要额外的网络旅行来重新发送表单以让客户端使用正确的数据填写表单。
问题:解释JSP声明
答:声明字段和方法是使用 JSP 声明标记完成的。代码被包裹在 <%!%> 标签内,并被放置在自动生成的 servlet 的 service() 方法之外。因此,它不会在每次请求时获得内存。
句法:
<%! field or method %>
Example
<html>
<body>
<%! int val=50; %>
<%= "Value of the variable is:"+val %>
</body>
</html>
问题:JSP Scriptlet 和JSP 声明的区别。
回答:
JSP Scriptlet | JSP声明 |
它只能声明变量而不能声明方法。 | 它可以声明方法和变量。 |
它位于 _jspService() 方法中。 | 它位于 _jspService() 方法之外。 |
问题:JSP 与 ASP 相比有哪些优势?
回答:
- 它功能强大且更易于使用,因为代码的动态部分是用Java编写的,而不是 Visual Basic 或 Microsoft 特定的语言。
- 它可移植到非 Microsoft Web 服务器和其他操作系统。
问题:定义 JSP 自定义标记及其组件。
答:自定义标签是用户自定义标签;我们可以用我们的功能定义我们的标签,并在 JSP 页面中使用这些标签。
它具有以下优点:
- 它消除了对 scriptlet 标记的需要。
- 业务逻辑与 JSP 页面的分离
- JSP 页面的可重用性。
它由以下组件组成:
- 自定义标签处理程序类。
- 创建 TLD(标签库描述符)文件。
- TLD 的部署描述符配置
我们可以使用 taglib 指令在 JSP 页面中添加自定义标记库,然后使用它。
问题:JavaScript 可以与 JSP 页面一起使用吗?
答:是的,我们可以,尽管 JSP 是一种服务器端技术,但它用于生成客户端响应,我们可以像添加任何其他 HTML 页面一样添加 javascript 或 CSS 代码。
问题:如何为 JSP 配置初始化参数?
答:我们可以像web.xml文件中的servlet一样为JSP配置init params;还需要使用 servlet 和 servlet-mapping 元素配置 JSP init 参数。与 servlet 唯一不同的是 jsp-file 元素,我们需要在其中提供 JSP 页面位置。
问题:在JSP中区分include Directive和include Action
回答:
include指令 | include操作 |
它在翻译时处理。 | 它在运行时处理。 |
它使用相对或绝对路径 | 它使用相对路径。 |
不能传递其他参数。 | 可以传递其他参数。 |
它只包含资源的内容,不会处理动态资源。 | 它处理动态资源,并将结果添加到调用JSP中 |
不允许将任何请求或响应对象传递给调用 jsp 到包含文件或 JSP,反之亦然。 | 允许将任何请求或响应对象传递给调用 jsp 到包含文件或 JSP,反之亦然。 |
问题:什么是 JSP 动作元素或动作标签?解释
答:标签提供了有用的功能,例如包含资源、使用 Java Bean、转发请求以及生成动态 XML 元素。Action 元素以 jsp: 开头,可以直接在 JSP 页面中使用,无需导入任何标签库或任何其他配置更改。JSP 标签是:
JSP 标签 | 描述 |
jsp:forward | 将响应和请求转发到另一个资源。 |
jsp:include | 包括另一个资源 |
Js:bean的使用 | 定位或创建 bean 对象 |
jsp:setProperty | 属性的值在 bean 对象中设置 |
jsp:getProperty | 打印 bean 的属性值 |
jsp:plugin | 嵌入另一个组件,如小程序 |
jsp:param | 设置参数值。它用于转发,主要包括。 |
jsp:fallback | 如果插件正在运行,可用于打印消息。它用于jsp:插件。 |
问题:什么是 JSP 表达式语言(EL)?
答: JSP EL 简化了存储在 Java bean 组件和其他对象(如请求、应用程序和会话)中的数据的可访问性。
句法:
$
问题:如何使用JSP EL获取HTTP方法名?
答: JSP常见面试题有哪些:pageContext JSP EL隐式对象用于获取请求对象引用,点运算符用于获取JSP页面中的HTTP方法名。
下面是相同的代码片段:
$
问题:一个 JSP 可以扩展另一个 java 类吗?如果是,如何?
答:是的,JSP 可以使用这个扩展另一个 JSP
<%@ include page extends= "classname" %>
这是正确的,因为当 JSP 转换为 servlet 时,它实现了 javax.servlet.jsp.HttpJspPage 接口,因此 jsp 页面扩展了另一个 java 类。
问题:JSP 如何与 Java 文件通信?
JSP面试题分析:导入标签
<%@ page import="market.stock.*" %>
像这样,我们把所有的java文件导入jsp,作为一个普通的类来使用。另一种方式是 servlet 可以将 java 类的实例发送到 jsp,并且可以从请求对象中检索该对象并在页面上使用它。
问题:JSP 自定义标记中使用了哪个指令?
答: JSP taglib 指令。
问题:说出 JSP 开发中使用的三个标签。
回答:
- jsp:useBean
- jsp:setProperty
- jsp:getProperty
问题:JSP 注释的语法是什么?
回答:
<%-- Comment --%>
问:JSP 技术是否可扩展?如何?
答:是的,JSP 技术可以通过开发封装在标签库中的标签或自定义操作来扩展。
问题:如何实现线程安全的JSP页面?
答:最佳JSP面试题和答案合集 - 通过让 JSP 实现 SingleThreadModel 接口,我们可以使它们成为线程安全的。这可以通过在 JSP 页面中添加指令<%@ page isThreadSafe="false" %> 来完成。
问题:定义 JSP 表达式
答案:包含在 JSP 表达式元素中的脚本语言表达式首先被求值,然后转换为字符串,然后插入表达式在 JSP 文件中出现的位置。
表达式元素可以包含根据 Java 语言规范有效的任何表达式,但不能使用分号来结束表达式。
句法:
<% expression %>
问题:定义 JSP 指令?
答: servlet 类的整体结构受 JSP 指令的影响。它具有以下形式:
<%@ directive attribute = "value" %>
问题:说明指令标签的类型?
回答:
指令标签 | 描述 |
<%@page ... %> | 定义页面相关属性。 |
<% @include ... %> | 文件包含在翻译阶段。 |
<% @taglib ... %> | 声明一个标签库,包含页面中使用的自定义操作。 |
问题:定义 JSP 文字
答案:文字被定义为作为代码一部分编写的值,例如文本字符串或数字。
JSP 文字是:
JSP 字面量 | 描述 |
布尔值 | 对或错 |
字符串 | 用单引号和双引号;"转义为\",'转义为\',\转义为\\。 |
整数 | 就像在 Java 中一样 |
浮点 | 就像在 Java 中一样 |
空值 | 空值 |
问题:如何处理 JSP 运行时异常?
答:异常定义为运行时抛出的异常,处理运行时错误的进程称为异常处理。
在 JSP 中,异常以两种方式处理:
- 通过 page 指令的 errorPage 和 isErrorPage 属性
- 通过 web.xml 文件中的 <error-page> 元素
问题:什么是页面指令?
答: page 指令向容器提供与当前 JSP 页面相关的指令。页面指令可以在 JSP 页面的任何地方编码。
问题:为什么 _jspService() 方法以“_”开头,而其他生命周期方法却没有?
答: jspInit() jspDestroy() 和 _jspService() 是主要的 JSP 生命周期方法,默认情况下,在 JSP 页面中写入的任何内容都会被容器放入 _jspService() 方法中,如果再次尝试覆盖此方法,JSP 编译器将给出一个错误,但我们可以覆盖其他两个生命周期方法,因为在 JSP 中实现这两个方法,因此使这个差异容器在 jspService() 方法中使用 _ 并表明该方法不能被覆盖。
问题:JSP在MVC模型中是如何使用的?
答: JSP 用于模型视图控制器模式(MVC)中的展示;这意味着它扮演了视图的角色。控制器调用模型和业务类,它们依次获取数据,然后将这些数据呈现给 JSP 以呈现给客户端。
问题:可以覆盖 jspInit()、_jspService() 和 jspDestroy() 方法吗?
答:我们不能覆盖_jspService() 方法,但可以覆盖jspinit() 和 jspDestroy() 方法。
问:什么时候使用应用范围?
答:当我们想让数据对整个应用程序可用时使用它。
问题:区分 JavaBeans 和 taglib 指令
答: JavaBeans 和 taglib 是为了可重用性而引入的。以下是它们之间的主要区别 -
- JavaBeans 用于存储信息和状态,而 Taglibs 用于生成表示元素。
- 使用自定义标签来实现操作,使用 JavaBeans 来呈现信息。
问题:信息如何从 JSP 传递到包含的 JSP?
答案:使用
<%jsp:param>
问题:定义自动刷新功能
答案:JSP常见面试题有哪些?想象一个网页显示实时游戏分数或股票市场状态或货币兑换率。对于所有此类页面,需要使用浏览器的刷新或重新加载按钮定期刷新网页。
JSP 提供了一种机制,在该机制中,网页可以在给定的时间间隔后自动刷新,从而使这项工作变得容易。
问:JSP 中如何实现自动刷新?
答:刷新网页最简单的方法是使用响应对象的setIntHeader()方法。以下是此方法的签名 -
public void setIntHeader(String header, int header value)
此方法将标头“Refresh”与整数值一起发送回浏览器,该值指示以秒为单位的时间间隔。
问题:定义JSTL SQL标签?
答: JSTL SQL 标记库提供了用于与关系数据库 (RDBMS)(例如 Oracle、MySQL 或 Microsoft SQL Server)交互的标记。
以下是在 JSP 中包含 JSTL SQL 库的语法 -
<%@ taglib prefix = "sql" uri = "http://java.sun.com/jsp/jstl/sql" %>
问题:JSP 代码会遇到什么类型的错误?
JSP面试题分析:
- 已检查异常:是用户错误或程序员无法预见的问题的异常。例如,如果要打开一个文件,但找不到该文件,则会发生异常。这些例外很难被忽视。
- 运行时异常:发生的异常可能已经被程序员避免了。编译时忽略运行时异常。
- 错误:这些不被视为异常,而是超出用户或程序员控制范围的问题。代码中的错误会被忽略,因为你很少对错误做任何事情。例如,如果发生堆栈溢出,则会出现错误。它们在编译时也会被忽略。
问题:如何禁用脚本?
答:最佳JSP面试题和答案合集 - 我们可以通过将部署描述符的 scripting-invalid 元素设置为 true 来禁用脚本。它是 jsp-property-group 的子元素。它的有效值为真和假。禁用脚本的语法是:
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
结论
准备面试可能会带来压力,因此我们在此向你展示最流行的 JSP 面试问题,以帮助你破解 JSP 面试。你还有什么问题要分享吗?或者有什么技巧可以破解这次面试?