《Servlet和JSP学习指南》一3.1 JSP概述

3.1 JSP概述

JSP页面其实是一个Servlet。但是,使用JSP页面则比Servlet要容易得多,这有两个原因:第一,不需要编译JSP页面;第二,JSP页面一般是扩展名为jsp的文本文件,可以利用任何文本编辑器来编写。
JSP页面是在JSP容器中运行的。Servlet容器一般也是JSP容器。例如,Tomcat就是一个Servlet/JSP容器。
第一次请求一个JSP页面时,Servlet/JSP容器要做两件事情:
1. 将JSP页面转换成一个JSP页面实现类,这是一个实现javax.servlet.jsp.JspPage接口或其子接口javax.servlet.jsp.HttpjspPage的Java类。JspPage是javax.servlet.Servlet的子接口,这样会使每个JSP页面都成为一个Servlet。所生成Servlet的类名取决于Servlet/JSP容器。这一点不必操心,因为不需要你直接处理。如果有转换错误,错误消息将会发送到客户端。
2. 如果转换成功,Servlet/JSP容器将会编译Servlet类。之后,容器加载和实例化Java字节码,并执行它通常对Servlet所做的生命周期操作。
对于同一个JSP页面的后续请求,Servlet/JSP容器会查看这个JSP页面自从最后一次转换以来是否修改过。如果修改过,就会重新转换、重新编译,并执行。如果没有,则执行内存中已经存在的JSP Servlet。这样,第一次调用JSP页面的时间总是会比后续请求的更长,因为它需要转换和编译。为了解决这个问题,可以采取以下任意一种措施:
配置应用程序,以便在应用程序启动之时,调用所有的JSP页面(实际上是指转换和编译),而不是在初始请求时才调用。
预先编译JSP页面,并将它们以Servlet的方式进行部署。
JSP中有一个API,其中包含4个包:
javax.servlet.jsp。包含核心类和接口,Servlet/JSP容器用它们将JSP页面转换成Servlet。JspPage和HttpJspPage接口是这个包中的重要成员。所有JSP页面实现类都必须实现JspPage或HttpJspPage。在HTTP环境下,显然是选择HttpJspPage。
javax.servlet.jsp.tagext。包含用于开发定制标签的类型(详情查看第6章的内容)。
javax.el。为Unified Expression Language提供API。详情查看第4章的内容。
javax.servlet.jsp.el。提供Servlet/JSP容器必须支持的类,以便支持JSP中的Expression Language。
除了javax.servlet.jsp.tagext之外,很少需要直接用到JSP API。事实上,在编写JSP页面时,相对于JSP API本身,你会更关注Servlet API。当然,你还需要掌握JSP语法,这个在本章中会讲到。在开发JSP容器或者JSP编译器的时候,就要大量使用JSP API。
在下列网站可以查看到JSP API:

JSP页面可以包含模板数据和句法元素。对于JSP转换器而言,元素具有特别的含义。例如,<%是一个元素,因为它在JSP页面中表示一个Java代码块的开始。%>也是一个元素,因为它表示一个Java代码块的结束。不属于元素的其他内容都是模板数据。模板数据也发送到浏览器。例如,JSP页面中的HTML标签和文本都是模板数据。
代码清单3-1给出了一个名为welcome.jsp的JSP页面。这是一个简单的页面,它只是给客户端发送了一条问候消息。你注意到了吗?与具有相同功能的Servlet相比,JSP页面是多么简单啊!

在Tomcat中,第一次调用完welcome.jsp页面之后,它被转换成一个welcome_jsp Servlet。你可以在Tomcat的work目录的子目录下看到所生成的Servlet文件。这个Servlet继承了org.apache.jasper.runtime.HttpJspBase,这是一个继承javax.servlet.http.HttpServlet并实现javax.servlet.jsp.HttpJspPage的抽象类。
下面是为welcome.jsp生成的Servlet文件。如果你现在觉得它很神秘,不必担心。就算你目前不理解,也可以继续往下学。不过如果你能理解,当然就更好了。



从上述代码可以看出,JSP页面的主体被转换成一个_jspService方法。这个方法在HttpJspPage中定义,并且通过HttpJspBase的service方法实现调用。下面是来自HttpJspBase类的内容:

为了覆盖init和destroy方法,可以根据本章稍后的3.5节的内容来声明方法。
JSP页面与Servlet不同的另一个方面是,前者不需要在部署描述符中进行标注,或映射成一个URL。应用程序目录下的每一个JSP页面都可以通过在浏览器中输入页面的路径来实现直接的调用。图3-1展示了app03a的目录结构,这是本章配套提供的一个JSP应用程序范例。

因为只有一个JSP页面,因此app03a应用程序的结构非常简单,只包含一个空的WEB-INF目录和一个welcome.jsp页面。
利用下面这个URL可以调用welcome.jsp页面:

提示 添加完一个新的JSP页面之后,不需要重启Tomcat。
代码清单3-2展示了如何在JSP中利用Java代码来生成动态的页面。代码清单3-2中的todaysDate.jsp页面展示了当天的日期。

todaysDate.jsp页面会将几个HTML标签和字符串“Today is”加当天的日期发送到浏览器。
有两件事情需要注意。第一,Java代码要用<%和%>包起来,并且可以放在JSP页面中的任何位置;第二,为了导入一个JSP页面中要用到的Java类型,可以利用page指令的import属性。如果没有导入类型,那么在代码中必须编写Java类型的全类名。
<%...%>块称作scriplet,在本章稍后的3.5节还会进一步讨论它。page指令将在本章稍后的3.4节中做详细的探讨。
利用下面这个URL可以调用todaysDate.jsp页面:

时间: 2024-09-17 04:09:24

《Servlet和JSP学习指南》一3.1 JSP概述的相关文章

《Servlet和JSP学习指南》一3.5 脚本元素

3.5 脚本元素 第二种JSP句法元素是脚本元素,它将Java代码合并成一个JSP页面.脚本元素有3种类型:Scriptlet.声明及表达式,这些都将在接下来的小节中讨论. 3.5.1 Scriptlet Scriptlet是一个Java代码块,它以<%开头,以%>结束.例如,代码清单3-6中的scriptletTest.jsp页面就是使用了Scriptlet. 上述JSP页面中有两个Scriptlet.注意,在一个Scriptlet中定义的变量,对于它后面的其他Scriptlet是可见的.

《Servlet和JSP学习指南》一3.4 指令

3.4 指令 指令(Directive)是第一种JSP句法元素,其指示JSP转换器应该如何将某个JSP页面转换成Servlet的命令.JSP 2.2中定义了几个指令,但最重要的是这两个:page和include,这些在本章中都会讨论到.其他章节中还会讲到的其他指令有:taglib.tag.attribute及variable. 3.4.1 page指令 利用page指令可以就当前JSP页面的某些方面对JSP转换器提出指示.例如,可以告诉JSP转换器隐式对象out应该使用多大容量的缓存区,要使用哪

《Servlet和JSP学习指南》一3.3 隐式对象

3.3 隐式对象 Servlet容器将几个对象传给它所运行的Servlet.例如,在Servlet的service方法中获得HttpServletRequest和HttpServletResponse,并在init方法中获得ServletConfig.此外,还可以通过在HttpServletRequest对象中调用getSession获得一个HttpSession. 在JSP中,可以通过使用隐式对象来获取那些对象.表3-1列出了隐式对象. 例如,隐式对象request表示由Servlet/JSP

JAVA/JSP学习系列之十二(JSP生成jpeg图片用于投票)

js|投票 一.前言 本文原作者为Tony Wang ,该文章涉及到文件的读写和jpg图片的自动生成.利用jsp+servlet的技术,jsp调用servlet生成图片. 二.首文件index.jsp如下: <%-- Author: Tony Wang E-mail: lucky_tony@163.net Date: 2001-01-01 如果对程序有什么疑问,可以和我联系, 另外程序如果有什么bug,麻烦指出!! --%> <%@ page contentType="text

《Servlet和JSP学习指南》一1.3 编写基础的Servlet应用程序

1.3 编写基础的Servlet应用程序 Servlet应用程序编写起来非常简单,只需要创建一个目录结构,并将Servlet类放在某一个目录下即可.在本节中,将学习如何编写一个简单的Servlet应用程序,将它命名为app01a.最初它只包含一个Servlet:MyServlet,其会给用户发送一条问候信息. 需要用一个Servlet容器来运行Servlet.Tomcat是一个开源的Servlet容器,可以免费获得,它也可以在能够使用Java的任何操作系统平台上运行.如果你还没有安装Tomcat

《Servlet和JSP学习指南》一导读

前 言 欢迎你阅读本书,其内容涵盖了Servlet 3.0和JSP 2.2方面的技术. Java Servlet技术,或简称Servlet,是Java中用于开发Web应用程序的基本技术.Sun公司于1996年发布了Java Servlet技术,与CGI(Common Gateway Interface,公共网关接口)形成竞争.之后,它成为在Web中生成动态内容的标准.CGI的主要问题在于,它为每一个HTTP请求都创建一个新的进程.因为创建进程需要花费大量的CPU周期,这使得编写可扩展的CGI程序

《Servlet和JSP学习指南》一1.9 HTTP Servlet

1.9 HTTP Servlet 我们所编写的Servlet应用程序,尽管不能说全部,但其中大多数要用到HTTP.这意味着,可以利用HTTP提供的特性.javax.servlet.http包是Servlet API中的第二个包,其包含了编写Servlet应用程序的类和接口.javax.servlet.http中的许多类型覆盖了javax.servlet中的类型. 图1-5展示了javax.servlet.http中的主要类型. 1.9.1 HttpServlet HttpServlet类覆盖ja

《Servlet和JSP学习指南》一3.6 动作

3.6 动作 第三种句法元素是动作(Action),它们被编译成执行某个操作的Java代码,例如访问某个Java对象,或者调用某个方法.本节讨论必须能被所有JSP容器支持的标准动作.除标准动作之外,还可以创建定制的标签,用来执行某些操作.定制标签将在第6章中讨论. 下面列举部分标准动作.doBody和invoke这两个标准动作将在第7章中讨论. 3.6.1 useBean 这个动作将创建一个与某个Java对象相关的脚本变量.它是将表现逻辑与业务逻辑分隔开来的最容易的方法之一.但是有了像定制标签和

《Servlet和JSP学习指南》一第3章 JSP 3.0

第3章 JSP 在第1章中我们已经知道,Servlet有两个缺陷无法克服.第一,在Servlet中编写的所有HTML标签都必须包在Java字符串中,这使得发送HTTP响应变成一项十分烦琐的工作.第二,所有文本和HTML标签都必须进行硬编码:因此,即使只对表示层做极其微小的修改,例如,修改背景颜色,也需要重新编译.JavaServer Pages(JSP)解决了Servlet中的这两个问题.但是,JSP并没有取代Servlet,而是对它进行了补充.现代的Java Web应用程序都使用Servlet