亲爱的读者,这些 JSP 面试问题是专门设计来让你了解问题的本质的,而这些问题都是在你面试时对 JSP 主题可能遇到的。根据我的经验,在你面试的过程中,好的面试官并不打算问你任何特殊的问题,通常的问题是以一些基本的概念为开始的,而后他们会继续在之前的基础上进行进一步的讨论以及你的回答:
答:JavaServer Pages(JSP) 是一项支持动态内容的 Web 网页的开发技术,它可以帮助开发人员通过利用特殊的 JSP 标签在 HTML 页面中插入Java代码,这些标签大部分都是以 <% 和 %> 为开始。
答:JSP 提供了如下所列的几个优势:
答:JSP 的优势是双重的。
首先,动态的部分是用 Java 中编写的,而不是 Visual Basic 或者其他 MS 特定的语言,所以它用来更强大也更容易。
其次,它可以很方便的移植到其他操作系统,并且是非微软 web 服务器。
答:与通过使用大量的 println 语句生成的 HTML 相比,JSP 在编写(和修改)常规的 HTML上更方便。其他的优点是:
答:SSI 只是用于简单的包裹体,而不是用于“真正的”使用表格数据的应用程序,建立数据库连接,等等。
答:JavaScript 可以在客户端生成动态的 HTML,却不能和 web 服务器进行交互来完成复杂的任务,例如数据库的访问和图像处理等等。
答:当然,常规的 HTML 不能包含动态信息。
答:一个 JSP 的生命周期包含以下步骤:
编译:当浏览器请求一个 JSP 时,JSP 引擎首先检查是否需要编译这个页面。如果这个页面从来没有被编译过,或者 JSP 在最后一次被编译后已经被修改了,那么 JSP 引擎会编译这个页面。
编译过程包括三个步骤:
答:一个 sciptlet 可以包含任意数量的 JAVA 语言的语句、变量或者方法声明,或者在页面脚本语言中有效地表达式。
Scriptlet 的语法如下:
<% code fragment %>
答:一个声明可以声明一个或者多个变量或者方法,这些变量和方法你可以在后面的 JSP 文件中的 Java 代码里使用。你必须在你使用之前在 JSP 文件中定义这些 变量或方法。
<%! declaration; [ declaration; ]+ ... %>
答:一个 JSP 表达式元素包含一个被求值的脚本语言表达式,转换成一个字符串,并插入到表达式在 JSP 文件中出现的位置。
根据 Java 语言规范,表达式元素可以包含任何有效地表达式,但是你不能使用一个分号来结束一个表达式。
它的语法是:
<%= expression %>
答:JSP 注释标记的是 JSP容器忽略的文本或者语句。一个 JSP 注释在你想要隐藏或者“注释掉”你 JSP 页面的一部分时是很有用的。
下面的 JSP 注释的语法:
<%-- This is JSP comment --%>
答:一个 JSP 指令影响着 servlet 类的总体结构。它通常具有以下形式:
<%@ directive attribute="value" %>
答:指令标签的类型如下:
答:JSP 操作使用 XML 语法结构来控制 servlet 引擎的行为。你可以动态插入一个文件、重用 JavaBeans 组件、转发用户到另一个网页,或者为 Java 插件生成 HTML。
它的语法如下:
答:jsp:include, jsp:useBean, jsp:setProperty, jsp:getProperty, jsp:forward, jsp:plugin,jsp:element, jsp:attribute, jsp:body, jsp:text
答:字面值是一些值,例如一个数字或者一个文本字符串,编写程序代码的一部分。JSP 表达式语言定义以下字面值:
答:**页面**指令用于为属于当前 JSP 页面的容器提供指示。你可能会在你的 JSP 页面的任何位置编写页面指令。
答:页面指令包含以下13个属性。
答:缓冲属性为服务器输出响应对象指定缓冲特性。
答:当缓冲区设置为“空”时,servlet 输出会直接定向到响应输出对象。
答:当一个缓冲区已满时,autoFlush 属性会指定缓冲输出是否会被自动溢出,还是应该抛出一个异常来指示缓冲区已满。
真(默认)值说明自动缓冲溢出,假值将抛出一个异常。
答:contentType 属性为 JSP 页面和生成的响应页面设置字符编码。默认的内容类型是 text/html,这是 HTML 页面里标准的内容类型。
答:如果当前运行的页面中有一个错误的话,errorPage 属性通知 JSP 引擎显示的是哪一个页面。errorPage 属性的值是相对的 URL。
答:isErrorPage 属性表明当前的 JSP 可以被另一个页面用于错误页面。 isErrorPage 的值不是真就是假。isErrorPage 属性的默认值是假。
答:extends 属性指定一个超级类,该类中生成的 servlet 必须被扩展。
答:import 属性和 Java 导入语句有着相同的作用和表现。导入选项的值是你想要导入的包的名称。
答:info 属性让你提供对 JSP 的描述。
答:isThreadSafe 选项标志着一个页面是线程安全的。默认情况下,所有的 JSPS 都被认为是线程安全的。如果你设置 isThreadSafe 选项的值为假,JSP引擎确保一次只有一个线程在执行你的 JSP。
答:language 属性表明在 JSP 脚本语言中使用的编程语言。
答:session 属性表明 JSP 页面使用的是否是 HTTP 会话。真值意味着 JSP 页面有权访问一个内置命令的会话对象,假值则意味着 JSP 页面无权访问内置命令的会话对象。
答:isElIgnored 选项使你可以禁用表达式语言(EL)表达式的值。该属性的默认值为真,意味着表达式 ${...} 的值是由 JSP 规范决定的。如果属性的值设置为假,那么表达式不会被赋值而是被认为是静态文本。
答:isScriptingEnabled 属性决定是否允许使用脚本元素。
默认值(真)可以使用脚本片段、表达式,和声明。如果这个属性值被设置为假,如果 JSP 使用任何脚本片段、表达式(non-EL),或者声明,那么将会出现一个 translation-time 错误。
答:包含命令被用于在翻译阶段包含一个文件。这个指令告诉容器在翻译阶段将当前的 JSP和其他外部文件的内容进行合并。你可以在你的 JSP页面的任何位置编写包含指令。
一般使用该指令是形式如下:
<%@ include file="relative url" >
答:taglib 指令遵循以下语法:
<%@ taglib uri="uri" prefix="prefixOfTag">
Uri 属性值解析一个容器理解的位置。
Prefix 属性通知一个容器标记位是一个自定义动作。
Taglib 指令遵循以下语法:
<%@ taglib uri="uri" prefix="prefixOfTag">
答:
动作的功能是什么?答:该操作允许你将文件插入到生成的页面中。语法如下:
其中,page 是页面中包含的相对应的 URL。
Flush 是一个布尔型的属性,决定被包含的资源在被包含之前它的缓冲区是否被刷新。
答:include 指令是在 JSP 页面被翻译成一个 servlet 时插入一个文件,而include 操作是在页面被请求使插入文件。
操作?答:useBean 操作是非常通用的。它首先利用 id 和 scope 变量搜索一个现有的对象。如果没有找到一个对象,那么它试图创建一个指定的对象。
加载一个 bean 最简单的方法如下:
操作?答:setProperty 操作设置一个 Bean 的属性。Bean 必须在该操作之前被定义。
答:getProperty 操作被用于检索一个给定的属性值,并且将其转换为一个字符串,最后将它插入到输出。
操作?答:forward 操作终止当前的页面,并将请求转发给另一个资源,例如一个静态页面、另一个 JSP 页面,或者一个 Java Servlet。
该操作的一个简单的语法如下:
操作?答:plugin 操作用于将 Java 组件插入到一个 JSP 页面。它决定了浏览器的类型和需要插入的 或者 标签。
如果所需要的插件不存在,下载插件,然后执行 Java 组件。Java 组件可以是一个 Applet 或者是一个 JavaBean。
答:scope 属性标识了一个动作元素的生命周期。它有四个可能的值:(a)页面,(b)请求,(c)会话,和(d)应用程序。
答:JSP 隐式对象是在每一个页面中 JSP 容器为开发人员提供的可用的 Java 对象,开发人员可以直接调用它们,而不需要显式的声明。JSP 隐式对象还被称为预定义的变量。
答:request, response, out,session, application, config, pageContext, page, Exception。
答:request 对象是 javax.servlet.http.HttpServletRequest 对象的一个实例。每次客户端请求一个页面时,JSP 引擎都会创建一个新的对象来表示这个请求。
request 对象为获取 HTTP 头信息提供方法,这些头信息包括表单数据、 cookie、 HTTP 方法等等。
答:使用HttpServletRequest 的 getHeaderNames() 方法来读取 HTTP 头信息。该方法返回一个枚举,包含与当前请求相关的头信息。
答:response 对象是 javax.servlet.http.HttpServletRequest 对象的一个实例。正如服务器创建请求对象,它还创建了一个对象来表示对客户端的响应。
response 对象还定义了处理创建新的 HTTP 头的接口。通过这个对象,JSP 程序员可以添加新的 cookies 或者日期戳, HTTP 状态码等等。
答:外部隐式对象是 javax.servlet.jsp.JspWriter 对象的一个实例,它被用于在一个响应里发送内容。
答:**JspWriter** 对象包含大部分与 java.io.PrintWriter 相同的方法。然而,JspWriter 有一些额外的方法用来处理缓冲。和 PrintWriter 对象不同,JspWriter 抛出 IOExceptions 异常。
答:session 对象是 javax.servlet.http.HttpSession 的一个实例,它被用于在客户端请求之间跟踪客户端会话。
答:应用程序对象是为生成的 Servlet 围绕 ServletContext 对象的直接包装器,实际上是 javax.servlet.ServletContxet 对象的一个实例。
这个对象是 JSP 页面的在整个生命周期上的一个表示。该对象的创建是在 JSP 页面初始化的时候,并且是在 JSP 页面被删除时通过 JSPDestroy() 方法删除的。
答:config 对象是 javax.servlet.ServletConfig 的一个实例,是为生成的 Servlet 围绕 ServletConfig 对象的直接包装器。
该对象允许 JSP 程序员有权访问 Servlet 或者 JSP 引擎初始化参数,比如路径或文件位置等等。
答:pageContext 对象是 javax.servlet.jsp.PageContext 对象的一个实例。pageContext 对象被用于表示整个 JSP 页面。
该对象存储每一个请求的请求和响应对象的引用。应用程序、配置、会话,和外部对象的派生是通过访问该对象的属性生成的。
pageContext 对象还包含发送给 JSP 页面的指令的信息,包括缓冲信息、错误的页面 URL,和页面范围。
答:该对象实际上是对页面实例的一个真正的引用。它可以被认为是一个表示整个 JSP 页面的一个对象。
Page 对象实际上是这个对象的一个直接的同义词。
答:exception 对象是一个包装器,包含从上一个页面抛出的异常。它通常用于生成一个适当的错误条件的响应。
答:GET 方法发送添加到页面请求的编码后的用户信息。页面和编码信息是通过?符号分开的。
POST 方法将信息打包的方式与 GET 方法时一样的,但是而是将它放在 URL 中?的后面作为文本字符串进行发送,将它作为一个独立的消息发送。该消息来自后台程序的标准输入,在你的处理过程中可以解析和处理它。
答:JSP根据情况自动解析并使用下面的方法处理表单数据:
答:JSP 过滤器是 Java 类,它可以用于 JSP 编程中的以下目的:
答:过滤器是在部署描述文件 web.xml 中定义的,然后映射到你的应用程序的部署描述文件的 servlet 或者 JSP 名称 或者 URL 模式。
当 JSP 容器启动 web 应用程序时,它创建一个过滤器的实例,该实例已经在部署描述文件中声明过了。过滤器按照他们在部署描述文件中声明的顺序执行。
答:Cookies 是存储在客户端计算机的文本文件,它们保存各种跟踪目的的信息。
答:Cookies 通常放置在一个 HTTP 的头部(尽管在浏览器上 JavaScript 也可以直接设置一个 cookie)。如果浏览器已经配置可以存储 cookies,那么它将保存信息直到截止日期。如果用户点击浏览器的任意页面,那么会为之匹配 cookie 的路径和区域,它将重新将 cookie 发送到服务器。
答:在 JSP 中设置 cookies 包含三个步骤:
答:为了读取 cookies,你需要通过调用HttpServletRequest 的 getCookies() 方法来创建一个 javax.servlet.http.Cookie 对象的数组。然后循环数组,利用 getName() 和 getValue() 方法来访问每一个和值相关的 cookie。
答:删除 cookies 是非常简单的。如果你想要删除一个 cookie,那么你只需要遵从以下三个步骤:
答:可以通过以下来完成会话管理:
隐藏表单字段:一个 web 服务器可以以唯一的会话 ID 发送一个隐藏的 HTTP 表单字段如下所示:
这意味着当表单被提交时,指定的名称和值将被包含在 GET 和 POST 方法中。
答:当你完成了一个用户的会话数据,你有以下几种选择:
答:为了上传一个单一的文件你应该使用一个单一的带有属性类型=“file”的 标签。为了允许多个文件上传,对名称属性包含多个不同值的输入标签。
答:你可以在你的程序中进行硬编码或者使用外部配置添加该目录名称,比如在 web.xml 中的一个 context-parameter。
答:页面重导通常是在一个文档被移动到一个新的位置时使用,我们需要将客户端发送到这个新的位置或者可能因为负载平衡,或者简单的随机化。
和 response.sendRedirct(url)
的区别是什么?答: 元素将包含客户端请求信息的请求对象从一个 JSP 文件转发到另一个文件。只要是在相同的应用程序上下文中对 JSP 文件进行转发,目标文件可以是一个 HTML 文件,另一个 JSP 文件,或者是一个 servlet。
sendRedirect 向浏览器发送 HTTP 临时重定向响应,并且浏览器会向重定向页面创建一个新的请求。
答:一个点击计数器告诉你关于你网站上的一个特定页面的访问量。
答:为了实现一个点击计数器,你可以使用与 getAttribute() 和 setAttribute() 方法相关的应用程序隐式对象。
这个对象是 JSP 页面在整个生命周期上的表现。该对象是在 JSP 页面初始化的创建的,并且当 JSP 页面移除的时候通过 jspDestroy() 方法移除的。
答:你可以遵循以下步骤:
答:考虑一个页面,在这个页面中显示在线游戏分数、或股票市场地位或者当前的汇率交换比率。所有这些类型的页面,你需要定期使用浏览器中的刷新按钮或者重新加载按钮刷新你的 web 页面。
JSP 通过提供给你一种机制使得这个工作变得容易,该机制是你可以在一个给定的时间间隔后自动刷新 web 网页。
答:刷新网页最最简单的方式是使用响应对象的 setInHeader( ) 方法。下面是该方法的原型:
public void setIntHeader(String header, int headerValue)
这种方法向浏览器发送回头“刷新”连同一个整型值,这个值可以以秒为单位显示时间间隔。
答:JavaServer 页面标准标签库(JSTL)是一个有用的 JSP 标签的集合,里面封装了很多 JSP 应用程序的核心功能。
JSTL支持常见的、结构性的任务,比如迭代和条件、用于操纵 XML 文档的标签、国际化标签,和 SQL 标签。它还为整合现有的自定义标签和 JSTL标签提供了一个框架。
答:JSTL 标签的类型有:
标签的作用是什么?答: < c:set>标签是 setProperty 操作的 JSTL-友好版本。该标签非常有用,因为它计算表达式并使用结果来设置 JavaBean 或 java.util.Map 对象的值。
标签的作用是什么?答: < c:remove> 标签从指定的范围或发现变量的第一范围中(如果没有指定范围)删除变量。
标签的作用是什么?答: < c:catch>标签捕获出现在标签内部的全部 Throwable 并有选择地公开它。它仅仅是用于错误处理或更得体的处理问题。
标签的作用是什么?答: < c:if >标签计算一个表达式,当且仅当表达式计算结果为 true 显示其主体内容。
标签的作用是什么?答: < c:choose >的工作方式类似于 Java switch 语句,因为它允许你在许多选择中做出选择。Switch 语句有 case 语句,< c:choose > 标签有 < c:when> 标签。一个 switch 语句有缺省子句来指定一个默认的操作,相同地,< c:choose > 也有作为缺省子句。
,
标签的作用是什么?答: ,标签是很好的选择,通过 scriptlet 来嵌入 Java for,while,或 do-while 循环。
标签的作用是什么?答: 标签允许适当的 URL 请求要被 URL 指定的参数,且没有任何必要的URL 编码要求。
标签的作用是什么?答: < c:redirect >标签通过提供自动 URL 重写将浏览器重定向到另一个 URL,它支持上下文相关的 URL,也支持< c:param >标签。
标签的作用是什么?答: < c:url >标签将 URL 格式化成一个字符串,并将其存储到一个变量中。这个标签在必要时自动执行 URL 重写。
答: JSTL 格式化标签用于格式化和显示文本、日期、时间,编号为国际化 Web 站点。下面包含在你的 JSP 格式库中的语法:
<%@ taglib prefix="fmt"
uri="http://java.sun.com/jsp/jstl/fmt" %>
答: JSTL SQL 标签库为相关的数据库(RDBMSs)交互提供了标签,如 Oracle, mySQL,和 Microsoft SQL Server。
以下是包含在你的 JSP 中的 JSTL SQL 库的语法:
<%@ taglib prefix="sql"
uri="http://java.sun.com/jsp/jstl/sql" %>
答: JSTL XML 标签提供了一种以 JSP 为中心创建和操纵 XML 文档的方式。下面是包含在你的 JSP 中的 JSTL XML 库的语法。
<%@ taglib prefix="x"
uri="http://java.sun.com/jsp/jstl/xml" %>
答: 自定义标签是一种用户定义的 JSP 语言元素。当一个包含自定义标签的 JSP 页面时转换成一个 servlet时,该标签就会转换为一个对象上的操作,称为标签处理程序。然后当执行 JSP 页面的 servlet 时,Web 容器就会调用这些操作。
答:JSP表达式语言(EL)可以方便地访问存储在javabean组件中的应用程序的数据。JSP EL允许创建表达式(a)算术和(b)逻辑。一个简单的JSP EL的语法是:
${expr}
这儿的expr是指定表达式本身。
答:JSP表达式语言支持下面的隐式对象
答:我们可以使用页面的指令的isELIgnored属性禁用EL。
<%@ page isELIgnored ="true|false" %>
如果它是true,当它们出现在静态文本或标签属性时,EL表达式被忽略。如果它是false,EL表达式都由容器进行计算。
答:
答:我们可以使用页面指令的errorPage属性将有未捕获的runtime异常自动转发到一个错误处理页面。
例如:<%@ page errorPage="error.jsp" %>
在请求处理期间,如果遇到未捕获的异常,它将重定向浏览器到JSP页面error.jsp。error.jsp必须使用指令:<%@ page isErrorPage="true" %>来表明这是一个错误处理页面。
答:国际化意味着能够为网站提供不同版本的内容,这些内容被翻译成访问者的语言或国家。
答:Localiztion意味着将资源添加到一个适合特定的地理或文化地区的网址,例如印地语翻译成一个网址。
答:这是一个特定的文化或地理区域。它通常被称为语言符号,紧随其后的是国家符号,它使用下划线分隔。例如“en_US”表示US的语言环境。
<%-- comment --%>
和
的区别是什么?答:<%-- comment --%>是JSP命令,可以被JSP工具忽视。
< !-- comment -- >是一个HTML命令,可以被浏览器忽略。
答:是的。JSP技术是可扩展的,它通过发展自定义操作、装在标签库中的标签。
答:应该使用JSP 的include指令包含静态资源。这种方式,在翻译阶段包含只执行一次。请注意,你应该提供一个文件属性的相对URL。尽管你还可以使用动作元素包含静态资源,但这是不明智的,因为每次请求,包含文件被执行。
答:是的。然而,不同于Servlet,你不需要在JSP页面用特定的方法如doGet()和doPost()实现http协议。对于表单输入元素,你可以通过带有脚本小程序或表达式的请求隐式对象获得的数据。
答:使用下面的方法来成功控制请求从一个servlet到另一个servlet或一个JSP到另一个JSP:
答:不可以。你应该只使用一个JSPWriter对象(给定隐含对象形式)回复客户。
JSPWriter对象可以被视为一种由response.getWriter()返回的流对象的缓冲版本,尽管从实现的角度来看,它不可以实现。
答:<%@ page session="false">
答:使用<%jsp:param>标签。
答:jspInit()和jspDestroy()可以重写,_jspService()不可以重写。
答:jspService()方法将被容器写入,而任何方法都不能被通常以“”开始写的终端用户重写。这就是为什么我们在任何JSP页面中不重写_jspService()方法。
答:它会导致编译错误,因为两个有相同名字的变量不能声明。这是发生是因为,当一个页面被静态包含,被包含的页面整个代码会成为新页面的一部分。这个时候有两种对变量“a”的声明。因此编译错误。
答:通过将配置描述符的scripting-invalid元素设置为true来禁用脚本。它是一个jsp-property-group的子元素。它的有效值是true和false。禁用脚本的语法如下:
*.jsp
true
答:如果我们想使我们的数据在整个应用程序范围内有效,那么我们必须使用应用范围。
答:在JSP,我们可以用以下的方法来执行包含:
用include指令:例如:
<%@ include file=”header.jsp” %>
用include动作:例如:
<%@ include file=”header.jsp” %>
用pageContext隐含对象:例如:
<%
pageContext.include(“/header.jsp”);
%>
用RequestDispatcher对象:例如:
<%
RequestDispatcher rd = request.getRequestDispatcher(“/header.jsp”);
Rd.incliude(request,response);
%>
答:每次在一个JSP页面遇到一个标签时,JSP引擎总是会实例化一个新的标签处理程序实例。一个标签池实例被维护,在可能的情况下重用它们。当遇到一个标签时,JSP引擎将尝试找到一个没有被使用的标签实例,使用相同的,然后再释放它。
答:javabeans和taglib的基本原理介绍了可重用性。但以下是它们之间的主要区别: