第4章JSP的语法和语义 本章将详细介绍J S P的语法和语义( J S P 1 . 1)。如果读者接触过A S P或P H P,将会发现J S P的 语法稍显复杂;另一方面,如果读者有J a v a语言程序设计的经验,就会觉得J S P相当简单,其实, 作为J 2 E E的成员,J S P本来就已经成为J a v a的一部分了。 在J S P中,主要包含以下内容: 指令。指令提供该页的全局信息,例如,重要的状态,错误处理,是否是s e s s i o n的一部分等。 声明。页面范围的变量和方法的声明。 脚本。嵌入页面内j a v a代码。 表达式。把表达式变成s t r i n g型以便于包含在页面的输出中。 下面将一一介绍。 4.1 通用的语法规则 J S P的页面是由许多的“元素”组成的,本节描述的语法规则对于这些“元素”都是成立的, 所以称之为“通用”的语法规则,也就是这些元素共有的特性。 4.1.1 元素的语法规则 大部分的J S P元素都基于“ X M L”的语法,这些基于“ X M L”语法的J S P元素一般来说都有 一个包含有元素名称的起始标志,可能还包含有属性设置,一些可选项,和一个结束标志。当 然,J S P页面的起始标记和结束标记一定要在同一个页面中,有的元素也仅仅有一个包含属性设 置的标志,举例如下: <mytag attr1="attribute value" ...> body </mytag> <mytab attr1="attribute value" .../> 读者会发现,前面讲述的To m c a t的配置文件s e r v e r. x m l和w e b . x m l中已经使用了这种语法形 式。 脚本元素则使用的是如A S P般的语法: <%............%> 实际上,每一个J S P页面都应该可以转换为等价的X M L页面,在下一章中将详细介绍作为 X M L的J S P。 J S P元素的属性也和X M L中定义的属性遵从同样的原则, J S P页面的属性值一定要使用引号 括起来,双引号(”)和单引号(’)都可以使用。另外,作为替代,也可以使用& a p o s ; 和& q u t o ;来表示双引号和单引号。 4.1.2 JSP中的相对路径 在J S P中,可以使用相对路径来代替绝对路径,在J S P的语法规范中称之为“ U R I”,感兴趣 的读者可以在R F C 2 3 9 6中找到比较完整的描述,这里举几个例子来说明相对路径的概念: "jspRelativeTest.jsp" "/ jspRelativeTest.jsp" "../ jspRelativeTest.jsp" 在这三行代码中,都假设是在c : t o m c a t J a k a r t a - t o m c a t w e b a p p s e x a m p l e s j s p t e s t . j s p中使用 上述相对路径。 对于第一行代码来说,显然文件j s p R e l a t i v e Te s t . j s p的位置应当为: c : t o m c a t J a k a r t a - t o m c a t w e b a p p s e x a m p l e s j s p j s p R e l a t i v e Te s t . j s p,这是比较容易理解的。但是对于第二行代码就 要注意了,在J S P中,当相对路径以“ /”开头的时候,不是相对于网站的根目录,而是相对于包 含这个J S P文件的We b应用程序的根目录,也就应当是: c : t o m c a t J a k a r t a - t o m c a t w e b a p p s e x a m p l e s j s p R e l a t i v e Te s t . j s p。如果读者对We b应用程序的概念还不清楚,请参见前几章中的相关 章节。第三行代码对于熟悉U N I X或D O S命令行方式的读者应该不陌生,这种情况下,文件 j s p R e l a t i v e Te s t . j s p 的位置应当为: c : t o m c a t J a k a r t a - t o m c a t w e b a p p s e x a m p l e s j s p j s p R e l a t i v e Te s t . j s p。 4.2 注释 一般来说,可以认为在J S P页面中包含有两种不同类型的注释:一种是J S P本身的,用于描述 J S P程序代码,另一种是J S P生成的页面的,也就是H T M L(或W M L . . .)的注释,用于描述J S P页面 执行后的结果页面的功能。H T M L页面的注释这里就不说了,下面是J S P本身的注释语法的例子: <%-- 这是一个JSP的注释--%> 实际上,由于在J S P的“脚本代码”部分中,也就是后面会提到的“ S c r i p t l e t”直接使用 “<% ...... %>”包含起来的部分中可以使用J a v a的语法,所以下面形式的注释也就理所当然的可 以使用了: <% /*这是一个Scriptlet中的注释*/ %> <% /**这也是一个Scriptlet中的注释,可以用javadoc从生成的Java文件中提取出注释来*/ %> 4.3 指令 前面已经讲过指令在J S P中的地位,指令一般来说有如下的形式: <%@ directive {attr="value"} %> 指令的这种语法形式尽管简单明了,但并不是符合X M L的,第5章将讲述指令的X M L语法。 4.3.1 “p a g e”指令 p a g e指令描述了和页面相关的指示信息。在一个J S P页面中, p a g e指令可以出现多次,但是 第4章J S P的语法和语义91
每一种属性却只能出现一次,重复的属性设置将覆盖掉先前的设置。 p a g e指令的基本语法格式如下: <%@ page page_directive_attr_list %> page_directive_attr_list ::= {language=" scriptingLanguage"} { extends=" className"} { import=" importList"} { session="true|false" } { buffer="none| sizekb" } { autoFlush="true| false" } { isThreadSafe="true|false" } { info=" info_text" } { errorPage=" error_url" } { isErrorPage="true|false" } { contentType="ctinfo" } 下表4 - 1是对这些属性的解释: 表4 - 1 属性名和可选值说明 language = “j a v a” 说language 变量告诉s e r v e r在文件中将采用哪种语言,在J S P当前的规 范(J S P 1 . 1)中,j a v a是J S P唯一支持的语法 extends = “p a c k a g e . c l a s s” 说extends 变量定义了由J S P页面产生的s e r v l e t的父类,一般来说,这 个属性不会用到,但是当需要实现一些特殊功能时,也是比较方便的 说import 变量和任何一个j a v a程序的第一部分一样。同样,它总是被 放在J S P文件的顶部。i m p o r t变量的值是一系列用逗号分开的列表,表 明想要引入的包和类 说注意: 说java.lang.* 说j a v a x . s e r v l e t . * 说javax.servlet.jsp.* javax.servlet.http.* 说已经缺省地被J S P引擎引入了 session = “t r u e | f a l s e” 说session 变量的缺省值是t r u e,表示当前页面中将有一个缺省的名为 “s e s s i o n”的对象来表示当前会话。“s e s s i o n”对象的类型是: 说javax.servlet.http.HttpSession b u ffer = “n o n e | 8 k b | s i z e k b” 说决定输出流( o u t对象)是否需要缓冲,缺省值是8 k b。与a u t o F l u s h 一起使用 autoFlush = “t r u e | f a l s e” 说确定是否自动刷新输出缓冲,如果设成t r u e,则当输出缓冲区满的 时候,刷新缓冲区而不是抛出一个异常 isThreadSafe = “t r u e | f a l s e” 说缺省值是t r u e,如果多个客户请求发向J S P引擎时,可以一次被处理。 J S P程序员要处理同步时共享的状态,以保证同步时确实是安全的。 说如果i s T h r e a d S a f e被设成f a l s e,则采用单线程模式控制客户端访问该 页 说这没有使你脱离异常分枝,然而,在s e r v e r可能的情况下,通过它 的判断,创建该页的多个实例运行以处理多个装入的客户请求。而且, 这无法保证同一个客户端的连续请求定位到同一个J S P页面的实例上, 在多个页面请求之间的共享资源和状态必须同步 92第一部分JSP 入门
import = “p a c k a g e . * , p a c k a g e . c l a s s” 例如: <%@ page import=”j a v a . u t i l . *” % > (续) 属性名和可选值说明 info = “t e x t” 说页面信息通过页面的S e r v l e t . g e t S e r v l e t I n f o ( )来获得页面可以被访问 的内容的类型 ErrorPage = “p a t h To E r r o r p a g e” 说给出一个J S P文件的相对路径,这个J S P文件用于处理没被处理的例 外。这个J S P文件要把i s E r r o r P a g e设成t r u e。 说需要注意的是: J S P是通过使用S e r v l e t R e q u e s t对象的s e t A t t r i b u t e ( )方 法将名为j a v a x . s e r v l e t . j s p . j s p E x c e p t i o n的对象存储起来实现的。 说另外,当A u t o F l u s h设为t r u e的时候,在J s p Wr i t e r中的数据刷新到 S e r v l e t R e s p o n s e中以后,任何从J S P文件到错误处理文件的未捕获异常 将无法被正常发送 isErrorPage = “t r u e | f a l s e” 说标志一个页面为错误处理页面。设置为t r u e时,在这个J S P页面中的 缺省对象e x c e p t i o n将被定义,其值将被设定为呼叫此页面的J S P页面 的错误对象。缺省为f a l s e 说设置J S P文件和最终文件的m i m e类型和字符集的类型。这一项必须 在文件的前部,任何一个其他字符在文件中出现之前。缺省为: C o n t e n t Type = “t e x t / h t m l ; charset = ISO - 8859 -1” 4.3.2 Include指令 i n c l u d e指令的作用是包含另一个文件,其语法相当简单: <%@ include file="......" %> 在这个指令中应该使用前面讲述的J S P的相对路径表示法。需要说明的是, J S P还有另外一 种包含其他文件的方法: <jsp:include page="" /> 表4 - 2比较了两者的异同: 表4 - 2 语法状态对象描述 <%@ include file=”. . . . . .” % > 编译时包含静态擎J S P引擎将对所包含的文件进行 语法分析 <jsp:include page=”” / > 运行时包含静态和动态擎J S P引擎将不对所包含的文件进 行语法分析 4.3.3 taglib指令 t a g l i b指令用于指示这个J S P页面所使用的标签库,标签库的具体用法属于J S P比较高级的内 容,这里就先不讨论了,先讲述一下基础语法: <%@ taglib uri=" tagLibraryURI" prefix=" tagPrefix" %> 表4 - 3是对各个属性的解释。 第4章J S P的语法和语义93
C o n t e n t Type = “t e x t / h t m l ; charset = ISO - 8859 -1” 表4 - 3 属性说明 u r i 描描述这个标签库位置的U R I,可以是相对路径或绝对路径 t a g P r e f i x 描定义了一个指示使用此标签库的前缀,例如将t a g P r e f i x设为m y P r e f i x时,可以使用 下面的语句来使用此标签库中的m y Ta g标签: < m y P r e f i x : m y Ta g > 描下面这些前缀已经保留: 描jsp:, jspx:, java:, javax:, servlet:, sun:, 和s u n w : 描目前,空的t a g P r e f i x将被忽视 4.4 内置对象 为开发的方便,J S P中内置了一些对象,不需要预先声明就可以在脚本代码和表达式中随意使 用,前面已经接触到的s e s s i o n和e x c e p t i o n就是两个内置对象,表4 - 4详细讲述J S P中的这些内置对象: 表4 - 4 对象类型描述作用域 r e q u e s t j a v a x . s e r v l e t . S e r v l e t R e q u e s t的子类作r e q u e s t(用户请 求期) response j a v a x . s e r v l e t . S e r v l e t R e s p o n s e的子类作p a g e(页面执行 期) p a g e C o n t e x t j a v a x . s e r v l e t . j s p . P a g e C o n t e x t 作p a g e(页面执行 期) s e s s i o n j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n 作s e s s i o n (会话 期) a p p l i c a t i o n j a v a x . s e r v l e t . S e r v l e t C o n t e x t 作a p p l i c a t i o n(整 个We b应用程序运 行期) out j a v a x . s e r v l e t . j s p . J s p Wr i t e r 作p a g e(页面执行 期) c o n f i g j a v a x . s e r v l e t . S e r v l e t C o n f i g 作p a g e(页面执行 期) p a g e j a v a . l a n g . O b j e c t 作P a g e(页面执行 期) e x c e p t i o n j a v a . l a n g . T h r o w a b l e 作p a g e(页面执行 期) 94第一部分JSP 入门
客客户端的请求,通常是H t t p S e r v l e t - R e q u e s t的子类,如果客户的请求中有参 数,则该对象就有一个参数列表 客JSP 页面的响应,是H t t p S e r v l e t R e s - ponse 的子类 客页面的属性和需要通过标准A P I来访 问的相关对象(本质上是构成服务器环 境来让J S P运行的一些对象),以便J S P 引擎来编译页面。但是,不同s e r v e r对 这些属性和对象的实现方式不同 客解决方案是J S P引擎编译用factory 类返 回的服务器的PageContext 类的实现方 法。P a g e C o n t e x t类和r e q u e s t、response 对 象以及p a g e指令的一些属性( e r r o r p a g e , s e s s i o n , b u ff e r, a u t o f l u s h)同时被初始化, 同时提供r e q u e s t请求的相关的对象 客HTTP session 是与r e q u e s t联合的对象 客s e r v l e t的环境通过调用g e t S e r v l e t C o n f i g (). g e t C o n t e x t()方法获得 客代表输出流的对象 客页面的S e r v l e t C o n f i g对象 客指向页面自身的方式(在j a v a代码中 多以t h i s替代) 客没有被T h r o w a b l e捕获的错误。传向 了e r r o r p a g e的U R I 4.5 脚本元素 在J S P中,主要的程序部分就是脚本元素,其中包括三个部分:声明( De c l a r a t i o n)、表达式 (Ex p r e s s i o n)和代码(Sc r i p t l e t)。从功能上讲,声明用于声明一个或多个变量,表达式将是一 个完整的语言表达式,而代码部分将是一些程序片断。 三个脚本元素的基本语法都是以一个“ < %”开头,而以一个“ % >”结尾的。 声明的例子: <%! this is a declaration %> 代码的例子: <% this is a scriptlet %> 表达式的例子: <%= this is an expression %> 脚本元素也具有相应的X M L兼容语法,将在第6章介绍。 4.5.1 声明 J S P中的声明用于声明一个或多个变量和方法,并不输出任何的文本到o u t输出流去。在声明 元素中声明的变量和方法将在J S P页面初始化时初始化。 语法为: <%! declaration(s) %> 举例如下: <%! int i = 0; %> <%! public String f(int i) { if (i<3) return("..."); ... } %> 实际上,声明变量和方法的语句完全可以放在S c r i p t l e t中,两者有什么不一样呢?放在 < % ! . . . . . . % >中的声明语句在编译为S e r v l e t的时候将作为类的属性而存在,而放在S c r i p t l e t中的声 明将在类的方法内部被声明。 4.5.2 表达式 J S P中的表达式可以被看作一种简单的输出形式,需要注意的是,表达式一定要有一个可以 输出的值才行。 语法为: <%= expression %> 举例如下: <%= (new java.util.Date()).toLocaleString() %> 4.5.3 脚本代码 所谓脚本代码,就是S c r i p t l e t,也就是J S P中的代码部分,在这个部分中可以使用几乎任何 第4章J S P的语法和语义95
J a v a的语法。 语法为: <% scriptlet %> 举例如下: <% if (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM) { %> Good Morning <% } else { %> Good Afternoon <% } %> 4.6 动作 动作可以影响输出的文本流,使用、编辑、建立对象。在J S P中,有一些基本的动作,用户 也可以添加自己的动作,这需要使用标签库的知识。J S P中的动作是完全基于X M L的,下面就来 看看J S P由哪些标准的动作以及具有哪些属性。 4.6.1 id和s c o p e属性 i d属性和s c o p e属性是每一个J S P动作都具有的属性,其中i d表示一个动作的名称,而s c o p e则 表示一个动作的作用域。 s c o p e作用域的取值如表4 - 5所示。 表4 - 5 作用域取值有效范围 p a g e 由j a v a x . s e r v l e t . j s p . P a g e C o n t e x t得到在用户请求此页面的过程中有效 r e q u e s t 由S e r v l e t R e q u e s t . g e t A t t r i b u t e ( n a m e )得到在用户的整个请求过程中有效 s e s s i o n 由H t t p S e s s i o n . g e t Value( name)得到在用户的整个会话期内有效 a p p l i c a t i o n 由ServletContext. getAttribute(name)得到在We b应用程序执行期间有效 4.6.2 标准动作 J S P规范书中规定了一些标准的动作,凡是符合J S P规范的J S P引擎都应当实现这些标准的动 作,下面将一一介绍J S P 1 . 1中规定的标准动作。 1. <jsp:useBean> < j s p : u s e B e a n >大概是J S P中最重要的一个动作,使用这个动作, J S P可以动态使用J a v a B e a n s 组件来扩充J S P的功能,由于J a v a B e a n s在开发上及< j s p : u s e B e a n >在使用上的简单明了,使得J S P 96第一部分JSP 入门
的开发过程和以往其他动态网页开发工具有了本质上的区别。尽管A S P等动态网页技术也可以使 用组件技术,但是由于A c t i v e X控件编写上的复杂和使用上的不方便,实际的开发工作中组件技 术使用得并不多。 < j s p : u s e B e a n >的语法如下: <jsp:useBean id=" name" scope="page|request|session|application" typeSpec /> typeSpec ::= class=" className" | class=" className" type=" typeName" | type=" typeName" class=" className" | beanName=" beanName" type=" typeName" | type=" typeName" beanName=" beanName" | type=" typeName" 如果在< j s p : u s e B e a n >中需要加入其他的元素,那么使用下面的语法: <jsp:useBean id=" name" scope="page|request|session|application" typeSpec > body </jsp:useBean> 这里有几个语法的例子: <jsp:useBean id="connection" class="com.myco.myapp.Connection" /> <jsp:useBean id="connection" class="com.myco.myapp.Connection"> <jsp:setProperty name="connection" property="timeout" value="33"> /jsp:useBean> 在下面的这个例子中,这个JavaBeans对象具有会话期作用域,并且在当前会话中已经存在了。 <jsp:useBean id="wombat" type="my.WombatType" scope="session"/> 如果这个对象不存在的话,将抛出一个C l a s s C a s t E x c e p t i o n异常。 2. <jsp:setProperty> < j s p : s e t P r o p e r t y >动作用于向一个J a v a B e a n的属性赋值,需要注意的是,在这个动作中将会 使用到的n a m e属性的值将是一个前面已经使用< j s p : u s e B e a n >动作引入的J a v a B e a n的名字。 表4 - 6说明了在使用< j s p : s e t P r o p e r t y >时的类型转换,不过在客户端请求时使用< j s p : s e t P r o p e r t y > 设定J a v a B e a n的属性可以使用任何类型,J S P文件的执行中也不会自动地进行类型转换。 表4 - 6 属性类型由S t r i n g类型转换所使用的方法 b o o l e a n j a v a . l a n g . B o o l e a n . v a l u e O f ( S t r i n g ) B o o l e a n b y t e j a v a . l a n g . B y t e . v a l u e O f ( S t r i n g ) B y t e i n t j a v a . l a n g . I n t e g e r. v a l u e O f ( S t r i n g ) I n t e g e r c h a r j a v a . l a n g . C h a r a c t e r. v a l u e O f ( S t r i n g ) C h a r a c t e r 第4章J S P的语法和语义97
(续) 属性类型由S t r i n g类型转换所使用的方法 d o u b l e j a v a . l a n g . D o u b l e . v a l u e O f ( S t r i n g ) D o u b l e f l o a t j a v a . l a n g . F l o a t . v a l u e O f ( S t r i n g ) F l o a t l o n g j a v a . l a n g . L o n g . v a l u e O f ( S t r i n g ) L o n g < j s p : s e t P r o p e t y >的语法如下: <jsp:setProperty name=" beanName" prop_expr /> prop_expr ::= property="*" | property=" propertyName"| property=" propertyName" param=" parameterName"| property=" propertyName" value=" propertyValue" propertyValue ::= string 表4 - 7是属性及其解释 表4 - 7 属性名描述 p r o p e r t y 此此属性表明了需要设定值的J a v a B r e a n属性的名称。 此这里有一个很有意思的特殊的p r o p e r t y设定:当一个p r o p e r t y设定为“ *”时, J S P解释器将 把系统S e r v l e t R e q u e s t对象中的参数一个一个的列举出来,检查这个J a v a B e a n的属性是否和 S e r v k e t R e q u e s t对象中的参数有相同的名称。如果有,就自动将S e r v l e t R e q u e s t对象中参数值传 递给相应的J a v a B e a n属性 p a r a m 此这个属性表明了在由系统的R e q u e s t向J a v a B e a n传递参数时具体采用哪一个R e q u e s t。具体到 We b页面,也就是哪一个F o r m v a l u e 此这个属性表明了需要设定给J a v a B e a n属性的值,可以是直接赋值,也可以是S e r v l e t R e q u e s t 对象的一个参数名 下面就< j s p : s e t P r o p e r t y >动作举几个例子: 将S e r v l e t R e q u e s t对象r e q u e s t中的参数全部输入到名为r e q u e s t的J a v a B e a n中: <jsp:setProperty name="request" property="*" /> 将S e r v l e t R e q u e s t对象u s e r中的参数u s e r n m e输入到名为u s e r的J a v a B e a n中: <jsp:setProperty name="user" property="user" param="username" /> 将值“i + 1”计算出来后输入到名为r e s u l t s的J a v a B e a n的属性r o w中: <jsp:setProperty name="results" property="row" value="<%= i+1 %>" /> 3. <jsp:getProperty> < j s p : g e t P r o p e r t y >动作用于从一个J a v a B e a n中得到某个属性的值,无论原先这个属性是什么 类型的,都将被转换为一个S t r i n g类型的值。 语法如下: <jsp:getProperty name=" name" property=" propertyName" /> 98第一部分JSP 入门
例如: <jsp:getProperty name="user" property="name" /> 4. <jsp:include> < j s p : i n c l u d e >用于引入一个静态或动态的页面到一个J S P文件中,这动作仅仅和J s p Wr i t e对象 发生关系。 < j s p : i n c l u d e >动作可以包含一个或几个< j s p : p a r a m >子动作用于向要引入的页面传递参数。 语法如下: <jsp:include page=" urlSpec" flush="true"/> 或 <jsp:include page=" urlSpec" flush="true"> { <jsp:param .... /> } </jsp:include> 属性f l u s h设定是否自动刷新缓冲区,实际上,在当前的J S P版本( 1 . 1)中, f l u s h设为f a l s e 是没有任何意义的。 下面是实例: <jsp:include page="/templates/copyright.html"/> 5. <jsp:forward> < j s p : f o r w a r d >用于引导客户端的请求到另一个页面或者是另一个S e r v l e t去。 < j s p : f o r w a r d >动作可以包含一个或几个< j s p : p a r a m >子动作,用于向要引导进入的页面传递 参数。 需要注意,当< j s p : f o r w a r d >动作发生的时候,如果已经有文本被写入输出流而且页面没有设 置缓冲,那么将抛出一个I l l e g a l S t a t e E x c e p t i o n的异常。 下面是< j s p : f o r w a r d >的语法: <jsp:forward page=" relativeURLspec" /> 或 <jsp:forward page=" urlSpec"> { <jsp:param .... /> }* </jsp:forward> 举例如下: <% String whereTo = "/templates/"+someValue; %> <jsp:forward page=’<%= whereTo %>’ /> 6. <jsp:param> < j s p : p a r a m >实际上提供了名称与值的一种一一对应关系,在< j s p : i n c l u d e >、< j s p : f o r w a r d >和 < j s p : p l u g i n >中常常作为子动作使用。 语法为: <jsp:param name=" name" value=" value" /> 第4章J S P的语法和语义99
7. <jsp:plugin> < j s p : p l u g i n >动作为We b开发人员提供了一种在J S P文件中嵌入客户端运行的J a v a程序(如: A p p l e t、J a v a B e a n)的方法。在J S P处理这个动作的时候,将根据客户端浏览器的不同, J S P在执 行以后将分别输出为O B J E C T或E M B E D这两个不同的H T M L之素。 下面是< j s p : p l u g i n >的语法: <jsp:plugintype="bean|applet" code=" objectCode" codebase=" objectCodebase" { align=" alignment" } { archive=" archiveList" } { height=" height" } { hspace=" hspace" } { jreversion=" jreversion" } { name=" componentName" } { vspace=" vspace" } { width=" width" } { nspluginurl=" url" } { iepluginurl=" url" } > { <jsp:params> { <jsp:param name=" paramName" value=" paramValue" /> }+ </jsp:params> } { <jsp:fallback> arbitrary_text </jsp:fallback> } </jsp:plugin> 表4 - 8是对< j s p : p l u g i n >动作的子动作和属性的详细说明: 表4 - 8 子动作或属性说明 < j s p : p a r a m > 设定Java Applet或J a v a B e a n执行所需要的参数 < j s p : f a l l b a c k > 设定当浏览器不支持此项P l u g I n时候应当显示的内容 t y p e 指示这个对象是一个Java Applet还是一个J a v a B e a n j r e v e r s i o n 指示这个插件对象执行所需要的J R E版本,缺省情况为“ 1 . 1" n s p l u g i n u r l 指示对于Netscape Navigator的J R E插件的地址(U R L) i e p l u g i n u r l 指示对于Internet Explorer的J R E插件的地址( U R L) c o d e、c o d e b a s e、a l i g n、a r c h i v e、和H T M L中的意义一致 h e i g h t、h s p a c e、n a m e、v s p a c e、 t i t l e、w i d t h 100第一部分JSP 入门
|