【Jsp精品源码栏目提醒】:网学会员Jsp精品源码为您提供【精品】第四章 - 其它资料参考,解决您在【精品】第四章 - 其它资料学习中工作中的难题,参考学习。
第四章
JSP 语法 第四章
JSP 语法 本章导读 有了前面的基础后,本章开始学习
JSP 语法。
JSP 页面主要由
JSP 元素和 HTML 代码构成,其中
JSP 代码完成相应的动态功能。
JSP 基础语法包括注释、指令、脚本以及动作元素,此外,
JSP 还提供了一些由容器实现和管理的内置对象。
本章完整介绍了
JSP 的基本语法,并以实例加深理解。
4.1
JSP 语法概述 在
JSP 页面中,可分为
JSP 程序代码和其他程序代码两部分。
JSP 程序代码全部写在lt和gt之间,其他代码部分如 JavaScript 和 HTML 代码按常规方式写入。
换句话说,在常规页面中插入
JSP 元素,即构成了
JSP 页面。
4.1.1
JSP 工作原理 当客户端请求浏览
JSP 页面时,
JSP 服务器在把页面传递给客户端之前,先将
JSP 页面编译成 Servlet(纯 Java 代码),然后由 Java 编译器生成的服务器小程序编译为 Java 字节码,最后再转换成纯 HTML 代码,这样客户端接收到的只是 HTML 代码。
JSP 到 Servlet 的编译过程一般在第一次页面请求时进行。
因此,如果希望第一个用户不会由于
JSP 页面编译成 Servlet 而等待太长的时间,希望确保 Servlet 已经正确地编译并装载,你可以在安装
JSP 页面之后自己请求一下这个页面。
JSP 页面
工作过程如图 4.1 所示。
图 4.1
JSP 工作原理108 4.1.2
JSP 页面结构
JSP 程序的成分主要有如下四种:注释(Comment)、指令(Directive)、脚本元素(Scripting Element)、动作(Action)。
JSP 指令用来从整体上控制 Servlet 的结构;脚本元素用来嵌入 Java 代码,这些 Java 代码将成为转换得到的 Servlet 的一部分;动作用来引入现有的组件或者控制
JSP 引擎的行为。
为了简化脚本元素,
JSP 定义了一组由容器实现和管理的对象(内置对象)。
这些内置对象在
JSP 页面中可以直接使用,不需要
JSP 页面编写者实例化。
通过存取这些内置对象,可以实现与
JSP 页面 Servlet 环境的互访。
JSP 页面构成如图 4.2 所示. 图 4.2
JSP 程序构成 【例 4.1】 一个简单的
JSP 页面。
文件名为 showJsp.
jsp。
lt--
JSP 指令 --gt lt page contentTypequottext/html charsetgb2312quot languagequotjavaquot importquotjava.sql.quot errorPagequotquot gt lthtmlgt ltheadgt ltmeta http-equivquotContent-Typequot contentquottext/html charsetgb2312quot /gt lttitlegt无标题
文档lt/titlegt lt/headgt ltbodygt lt-- 下面代码为脚本元素,其中 out 为内置对象,直接引用即可,不需要实例化,其作用为输 出字节流。
--gt lt out.printlnquotHello Worldquotgt lt/bodygt lt/htmlgt 上述代码运行结果是输出quotHello Worldquot。
4.2 注释 4.2 注释 和其他的程序语言一样,
JSP 也同样提供注释语句。
JSP 注释分为 HTML 注释和隐藏注释两种。
JSP 隐藏注释语句在
JSP 页面执行的时候会被忽略,不会执行。
并且注释语句信息不会被送到客户端的浏览器中,也就是说,用户通过查看源文件是无法看到这些注释信息的,所以称之为隐藏注释。
HTML 注释和
JSP 注释的不同之处在于 HTML 注释在客户端浏览器能通过查看源文件而被查看到。
4.2.1
JSP 隐藏注释
JSP 注释语句的语法: lt--comment--gt 【例 4.2】文件 comment.
jsp lt page contentTypequottext/html charsetgb2312quot languagequotjavaquot importquotjava.sql.quot errorPagequotquot gt lthtmlgt ltheadgt ltmeta http-equivquotContent-Typequot contentquottext/html charsetgb2312quot /gt lttitlegt测试
JSP 的注释语句lt/titlegt lt/headgt ltbodygt lth2gt测试
JSP 注释语句lt/h2gt lt-- 这是一些注释信息,不会在查看网页源文件的时候看到 --gt lt/bodygt lt/htmlgt 还有一种使用 Java 注释机制的注释方法: lt /comment / gt 在使用的时候,一定要注意lt--和--gt必须成对出现,否则会编译出错。
4.2.2 HTML 注释 HTML 注释语句的语法: lt-- comment lt expression gt --gt 例如: lt--该注释可以被查看--gt 在客户端的 HTML 源代码中产生和上面一样的数据: lt--该注释可以被查看--gt 又例如: lt--该页面生成于 lt new java.util.Date.toLocaleString gt --gt 在客户端的 HTML 源代码中显示为: lt--该页面生成于 October 15 2006 --gt 这种注释和
HTML 语言很像,它可以在“查看
源代码”中看到。
唯一有些不同的就是,你可以在这个注释中使用表达式。
这个表达示是不定的,由页面不同而不同,你能够使用各种表达式,只要是合法的就行。
110 4.3
JSP 指令 在
JSP 页面中,可以使用
JSP 指令来指定页面的有关输出方式、引用包、加载文件、缓冲区、出错处理等相关设置,主要作用是用来于
JSP 引擎之间进行沟通。
JSP 指令
常用以下形式: lt directive attribute”value”gt 可以将多个属性写在一个语句中: lt directive attribute1quotvalue1quot attribute2quotvalue2quot attributeNquotvalueNquot gt 主要的三种指令是 page include 指令 taglib,下面对三种指令进行详细说明。
4.3.1 page 指令 在
JSP 文件中,可以通过lt page gt命令定义整个
JSP 页面的属性,通过这个命令定义的属性会对该
JSP 文件和包含进来的
JSP 页面起作用。
此命令的语法比较复杂一些,下面就是语法定义: lt page languagequotjavaquot extendsquotpackage.classquot importquotpackage.class package. ...quot sessionquottrue falsequot bufferquotnone 8kb sizekbquot autoFlushquottrue falsequot isThreadSafequottrue falsequot infoquottextquot errorPagequotrelativeURLquot contentTypequotmimeType charsetcharacterSet quot quottext/html charsetISO-8859-1quot isErrorPagequottrue falsequot gt 下面是使用 Page 命令的几个小例子: lt page contentTypequottext/html charsetgb2312quot languagequotjavaquot importquotjava.
sql.quot bufferquot5kbquot autoFlushquotfalsequot errorPagequot error.
jsp quot gt 通过 Page 命令,你可以为整个
JSP 页面定义上面提到的全局属性,其中除了“import”之外,其他的都只能引用一次,import 属性和 Java 语言中的 import 非常相似,可以在
JSP页面中多次使用它。
关于lt page gt的位置可以不去考虑,放在任何地方都可以很好的工作,但出于良好的编程习惯,建议放在
JSP 页面的顶部。
几乎所有的
JSP 页面顶部都可以找到指令page。
1.language 属性 定义
JSP 页面使用的脚本语言,若使用
JSP 引擎支持 Java 以外的语言,可指定所使用的语言种类。
默认语言为 Java language”java” 指明
JSP 文件中使用的脚本语言,目前只能使用 Java。
4.3
JSP 指令 2.contentType 属性 contentType 属性定义了
JSP 页面字符编码和页面响应的 MIME 类型。
默认的 MIME类型是 text/html默认的字符集是 ISO-8859-1。
例如: lt page contentTypequottext/html charsetgb2312quot languagequotjavaquot importquotjava.sql.quot gt 3.import 属性 该属性用于
JSP 引入
Java 包中的类,如果你要包含多个包的话,将这些包的名称用逗号隔开放在一个 import 中,或者使用多个 import 分别声明。
它是唯一可以多次指定的属性。
在使用 Java 包中的元素之前一定要先声明该包的 import 引用。
下面一些 Java 包,是默认包含的,不用再在
JSP 页面中声明。
java.lang. javax.servlet. javax.servlet.
jsp. javax.servlet.http. 4.extends 属性 定义此
JSP 页面产生的 Servlet 是继承自哪个父类。
请特别谨慎使用这一功能,因为,服务器也许已经定义了一个。
JSP 规范对不完全理解其隐意的情况下使用此属性提出警告。
5.isErrorPage 属性 isErrorPagequottruefalsequot 默认值为“true”设置是否显示错误信息。
如果为 true,可以看到出错信息,如果为false,就看不到了。
6.errorPage 属性 errorPagequotrelativeURLquot 设置处理异常事件的
JSP 文件的位置。
表示如果发生异常错误,网页会被重新指向一个 URL 页面。
错误页面必须在其 page 指令元素中指定 isErrorPagequottruequot。
7.session 属性 sessionquottruefalsequot 默认值为“true”,定义是否在
JSP 页面使用 HTTP 的 session。
如果值为 true,则可以使用 session 对象;如果值为 false那么
JSP 页面就不被加入到 session 中,session 内置对象则不能使用,而同时会造成 Bean 的 scope 属性值只能是“page”。
8.Buffer 属性 bufferquotnone8kbsizekbquot 为内置对象 out 指定发送信息到客户端浏览器的信息缓存大小。
以 kb 为单位。
默认值是 8kb.你也可以自行指定缓存的大小。
也可以设置为“none”,那么就没有缓冲区,所有的输出都不经缓存而直接输出。
9.autoFlush 属性 autoFlushquottruefalsequot112 指定是否当缓存填满时自动刷新,输出缓存中的内容。
如果为 true,则自动刷新。
否则,当缓存填满后,可能会出现严重的错误。
当你把 buffer 设置为 none 时,就不能将autoFlush 设置为 false。
10.isThreadSafe 属性 isThreadSafequottruefalsequot 指定
JSP 页面是否支持多线程访问。
默认值是 ture,表示可以同时处理多个客户请求,但是你应该在
JSP 页面中添加处理多线程的同步控制代码。
如果设置为 false,
JSP 页面在一个时刻就只能响应一个请求。
11.info 属性 infoquottextquot 指定任何一段字符串,该字符串被直接加入到翻译好的页面中。
可以通过Servlet.getServletInfo方法得到。
4.3.2 include 指令 Include 指令的功能是在
JSP 编译时插入包含的文件。
包含的过程是静态的。
它可以把内容分成更多可管理的元素,如包括普通页面的页眉或页脚的元素。
包含的文件可以是
JSP、HTML、文本或是 Java 程序。
include 指令的语法: lt include filequotrelativeURLquot gt 其中只有一个 file 属性,这个属性指定了被包含文件的路径。
如果路径是以quot/quot开头的,那么这个路径应该就是相对于
JSP 应用程序上下文而言的。
而如果以目录名或文件名开头则是以
JSP 文件所在路径为当前路径而言。
例如: quotheader.jspquot quot/templates/onlinestore.htmlquot quot/beans/calendar.jspquot 在
JSP 中,你可以用 Include 指令将
JSP 文件,HTML 文件,或 Text 文件包含到一个
JSP 文件中,这种包含是静态包含,也就是说当使用这种方法包含文件的时候,会将被包含文件的内容插入包含文件中,替换掉lt include gt这行语句。
如果你包含的是一个
JSP 文件,那么包含在这个文件中的
JSP 程序将被执行。
当你使用 Include 包含一个文件的时候, 一定要注意,在被 包含文件中不能 含有lthtmlgt,lt/htmlgt,ltbodygt,lt/bodygt等 HTML 元素,否则的话会导致执行错误。
因为被包含的文件会整个加入到
JSP 文件中去,这些标记会与
JSP 文件中类似的标记相冲突。
使用包含文件有以下一些优点: (1)被包含文件可以在多个文件中被使用,实现了代码共享和重用。
(2)当被包含文件修改后,包含此文件的
JSP 文件的执行结果也发生变化,这样就提高修改效率,为维护提供方便。
【例 4.3】 include.
jsp lthtmlgt 4.4
JSP 脚本元素 ltheadgtlttitlegtAn Include Testlt/titlegtlt/headgt ltbody bgcolorquotwhitequotgt The current date and time are lt include filequotdate.jspquot gt lt/fontgt lt/bodygt lt/htmlgt date.
jsp lt page import quotjava.util.quot gt lt new java.util.Date.toLocaleString gt 上面的例子在执行后,会在客户端的浏览器中显示和下面类似的信息: The current date and time are Aug 301999 2:38:40 4.3.3 taglib 指令 taglib 指令的功能是使用标签库定义新的自定义标签,在
JSP 页面中启用定制行为。
taglib 指令的语法: lt taglib uriquotURIToTagLibraryquot prefixquottagPrefixquot gt 例如 lt taglib uriquothttp://www.jspcentral.com/tagsquot prefixquotpublicquot gt ltpublic:loopgt lt/public:loopgt lt taglib gt指令声明此
JSP 文件使用了自定义的标签,同时引用标签库,也指定了标签的前缀。
这里自定义的标签有标签和元素之分。
因为
JSP 文件能够转化为 XML所以了解标签和元素之间的联系很重要。
标签只不过是一个在意义上被抬高了点的标记,是
JSP 元素的一部分。
JSP 元素是
JSP 语法的一部分,和 HTML 一样有开始标记和结束标记。
元素可以包含其它的文本,标记,元素。
使用自定义标签之前必须使用lt taglib gt指令,而且可以在一个页面中多次使用,但是同一前缀只能引用一次。
URI 根据标签的前缀对自定义的标签进行唯一的命名 prefixquottagPrefixquot,在自定义标签前的前缀,比如,在ltpublic:loopgt中的 public,如果不写 public,就是不合法的。
请不要用
jsp jspx java javax servlet sun 和 sunw 作为前缀。
4.4
JSP 脚本元素
JSP 脚本元素用来插入 Java 代码,这些 Java 代码将出现在由当前
JSP 页面生成的Servlet 中。
脚本元素有三种格式:声明格式< declaration >,其作用是把声明加入到 Servlet 类(在任何方法之外);表达式格式< expression >,作用是计算表达式并输出其结果;Scriptlet 格式< code >,作用是把代码插入到 Servlet 的 service 方法。
114 4.4.1
JSP 声明
JSP 声明用来声明
JSP 程序中的变量、实例、方法和类。
声明是以lt为起始,以gt结尾。
在
JSP 程序中,在使用一个变量或引用一个对象的方法和属性前,必须先对使用的变量和对象进行声明。
声明后,你才可以在后面的程序中使用它们。
JSP 的声明可以让你定义页面一级的变量以保存信息或定义该
JSP 页面可能需要的方法。
其内容必须是一个采用 page 指令所定义的语言编写和完整有效的声明。
JSP 内置对象在声明元素中不可见,此时声明的变量作为编译单元的成员变量处理。
其语法如下: lt declaration gt 例如: lt int i0 gt lt int abc gt 注意: 1. 编 译
JSP 时 , 脚 本 小 程 序 生 成 于 jspService 方 法 的 内 部 , 而 声 明 却 生 成 于jspService方法之外,与源文件合成一体。
使用lt gt方式所声明的变量为全局变量,即表示若同时 n 个用户在执行此
JSP 网页时将会共享此变量。
因此应尽量少用声明变量,若要使用变量时,请直接在 scriptlet 之中声明使用即可。
2.每一个声明仅在一个页面中有效,如果你想每个页面都用到一些声明,最好把它们写成一个单独的
JSP 页面或单独的 Java 类,然后用lt include gt或ltjsp:include gt动作元素包含进来。
由于声明不会有任何输出,因此它们往往和
JSP 表达式或脚本小程序结合在一起使用。
例如,下面的
JSP 代码片断输出自从服务器启动(或 Servlet 类被改动并重新装载以来)当前页面被请求的次数: lt private int accessCount 0 gt 自从服务器启动以来页面访问次数为: lt accessCount gt 4.4.2
JSP 表达式
JSP 表达式用来计算输出 Java 数据,表达式的结果被自动转换成字符型数据,结果可以作为 HTML 的内容,显示在浏览器窗口中。
JSP 表达式包含在“lt gt”标记中,不以分号结束,除非在加引号的字符串部分使用分号。
开始字符和结束字符之间必须是一个完整合法的 Java 表达式。
可以是复杂的表达式,在处理这个表达式的时候按照从左向右的方式来处理。
其语法如下: < expression > 例如: lt i gt lt quotHelloquot gt lt ab gt 下面的代码显示页面被请求的日期/时间: 4.4
JSP 脚本元素 当前时间为:< new java.util.Date > 为简化这些表达式,
JSP 预定义了一组可以直接使用的对象变量。
内置对象在表达式中可见。
对于
JSP 表达式来说,最重要的几个内置对象及其类型如下,后面我们将详细介绍这些内置对象。
(1)request:HttpServletRequest。
(2)response:HttpServletResponse。
(3)session:和 request 关联的 HttpSession。
(4)out:PrintWriter,用来把输出发送到客户端。
例如: Your hostname: < request.getRemoteHost > 4.4.3 脚本小
程序 如果要完成的任务比简单的表达式复杂时,可以使用
JSP 脚本小程序(Scriptlet)。
脚本小程序中可以包含有效的程序片段,只要是合乎 Java 本身的标准语法即可。
通常我们核心程序都写在这里,是我们实际编写的
JSP 程序的主要部分。
JSP 脚本小程序的语法如下: < Java Code gt 由于
JSP 和其他一些嵌入式语言一样,都会嵌在 HTML 语言内部使用,所以
JSP 页面中是由一段一段的
JSP 程序嵌在 HTML 语言里面组成的。
脚本小程序能够包含要用到的变量或方法的声明和表达式。
和
JSP 表达式一样,脚本小程序可以访问所有内置对象,所有的内建对象在小脚本中可见。
例如,如果你要向结果页面输出内容,可以使用 out 变量。
lt String queryData request.getQueryString out.printlnquotAttached GET data: quot queryData gt 注 意 : 在 程 序 段中 定 义 的 变量 是 局 部 变量 , 且 程 序段 中 的 “ 表达 式 ” 必 须使 用“;”作为结束符,程序片段并不局限于一行代码中。
编译
JSP 时,编译器在 jspService方法中只简单地不作修改地包含脚本小程序的内容。
当 Web 服务器响应请求时,Java 代码就会运行。
在脚本片段周围可能 有纯粹的HTML 代码,在这些地方,代码片段可以使你创建执行代码的条件,或调用另外的代码片段。
例如,下面的
JSP 片断混合了 HTML 语言和脚本小程序: lt if Math.random lt 0.5 gt Have a ltBgtnicelt/Bgt day lt else gt Have a ltBgtlousylt/Bgt day lt gt 上述
JSP 代码将被转换成如下 Servlet 代码: if Math.random lt0.5 out.printlnquotHave a ltBgtnicelt/Bgt dayquot116 Else out.printlnquotHave a ltBgtlousylt/Bgt dayquot 【例 4.4】 num.
jsp lthtmlgt ltheadgt lttitlegtJSP 程序段lt/titlegt lt/headgt lt page contentTypequottext/htmlcharsetGB2312quot gt ltbodygt lt double num0 num20 ifnumgt10 gt lt/这里体现了
JSP 与 HTML 的结合/gt lth2gtnum 的值大于 10lt/h2gt lt/不属于
JSP 的这段 HTML 用gt……lt隔开/gt lt else out.printlnquotnum 的值小于 10quot gt lt/bodygt lt/htmlgt 运行结果:num 的值大于 10 例如,以下的代码组合使用表达式和代码片段,显示 H1、H2、H3 和 H4 标记中的字符串“Hello”。
代码片段并不局限于一行源代码: lt for int i1 ilt4 i gt ltHltigtgtHellolt/Hltigtgt lt gt. 4.5
JSP 动作
JSP 动作利用 XML 语法格式的标记来控制 .