第二章:xml、jsp基础
本章内容:
I.xml基本语法
II.jsp介绍
III.context中的jstl标签库
IV.jsp范围变量
2-1xml介绍
首 先要提一下html。html拥有一套标签,如<img>,标签拥有修饰符或成为属性(attribute)。如在<img>标 签中的src="/dir/a.jpg"。html标签拥有一定的结构,如不能出现在之前。因此,我们可以说,html是一个标签、标签属性和结构规则的 集合。
html是xml的一个特定应用,不过它的规则比xml要宽泛,同样,xml也不像html那样描述特定的一套标签或标签间的关系。它描述的是文档中定义标签的规则。
2-1-1标签术语学
|--start tag------<c:froEach bein="2" end="5" var="i">
|
element |--body(content)--Current:<c:out value="${i}"/><br/>
|
|--end tag--------</c:forEach>
任何一个元素包括起始标签、内容和结束标签。有时,xml使用者会混淆元素和标签的概念,请记住,标签是在字符<>之间的文本。
空元素
起始和结束标签间没有内容的元素可以表示为
<lonely></lonely>
<lonely/>
属性
起始标签、空元素标签可以有属性,但请注意:结束标签不可有属性,一个标签内的属性不能重复。如:
<name firstName="true">Alex</name>正确
<name>Alex</name firstName="true">错误
<name firstName="true" firstName="true"/>错误
现在分析一下如下标签:
<c:forEach items="${collection}">
c命名空间前缀
forEach标签名
items属性名
${collection}属性值
命名空间
名 目空间是xml拥有而html不具备的特色。我们可以把xml命名空间视作组织标签的一种方式。在html中,所有的标签拥有简单直接的名字,例如 table。在xml中则有命名空间的限制。也就是说,标签不再是简单的名字,而是加上了命名空间的前缀。格式是<prefixName: tagName>
你可以通过命名空间的形式去限制单一文档中不同地方的大量标签。例如:
<宾馆:洗衣机>和<家庭:洗衣机>
不同的命名空间将上述标签区别开来,而在绝大部分场合,通过attribute来实现两者的区别是没有效率的。
在使用jstl中,我们不需要懂得很多关于命名空间的只是。然而,所有的jstl标签都使用了命名空间前缀。例如c:forEach,c指向一个命名空间而forEach声明了一个拥有该命名空间的特定标签。
元素间的关系
一个元素可以包含另一个元素。外部元素为父,内部元素为子。通常我们成为父标签和子标签,而不是父元素和子元素。
一个子元素不能拥有多个父元素而一个父元素可以有多个子元素。在下面的例子中:<a>是<c>的祖先,<c>是<a>的子孙。
<a>
<b>
<c/>
</b>
</a>
2-1-2相关xml法则
在此我们将讨论xml语法规则中jstl需要用到的部分。
意识到html规则比xml规则松散是很重要的。下表比较了html和xhtml的区别
法则:
I.属性值不惜标注引号
html <p align=left>
xhtml <p align="left">
II.区分大小写
html <p ALIGN=left>
xhtml <p align="left">
III.起始标签必须结束
html <p>content
xhtml <p>content</p>
IV.空元素必须有结束标记
html <br>
xhtml <br/>
html有相对随意的书写方式,在你使用jstl生成html文档的时候,你仍然可以这样做,<p ALIGN=left>不会产生任何问题,但是,不要把这种习惯带入jstl语句中。
围绕属性值的引号可以是单引号也可以是双引号。在下面的情况中,两者混合使用:值为12",则<ruler length='12"'>
如果属性值包含'和"两者,那么,可以使用转义符号
'对应'
"对应"
我们不需要记住很多的细节,下列的对应列表就足够了:
< <
& &
> >
还需要注意的一点是:标签不能交叉。如下是错误的:
<a>
<b>
</a>
</b>
2-2jsp介绍
笔者注:此处的翻译从略,仅做一个浏览,列出跟jstl关系较大的索引,具体jsp内容请参考网上众多资料,在此不再赘述。
2-2-1jsp tags集合
jsp tags
|
|__standard tags(core jsp tags)
|
|__other tags(tag libraries)
|
|__(include)_jstl tags
2-2-2 standard tags
I.jsp tags能够存在于hmtl tag或jsp tags中。如:
<a href="<c:out value="#">">a link</a>
II.jsp tags于静态模板文本工作方式不同。jsp tag和html tag的最大区别在于它有命名空间前缀。
core jsp tags均有jsp的命名空间前缀,例如<jsp:forward>和<jsp:include>,由于core jsp tags出现时间比jstl要早几年,所以形成了上表所描述的稍微令人困惑的集合形式。
IV.<jsp:include page="test.jsp">仅能include本地文件,即同一个jsp引擎。
值得注意的是:html的<base>标签。在html文档中,如果有下列标签<base href=" http://www.aleyxchow.com/"/>,那么象<img src="image.jpg"/>将导致浏览器载入 http://www.aleyxchow.com/image.jpg;但是对于<jsp:include>而言,<base>无效,include仅查找本地服务器上的文件。
V.标签<jsp:forward>也有与<jsp:include>同样的限制。
注意,如果A.jsp forward to B.jsp,那么,B.jsp文件不能通过该标签forward to A.jsp
VI.<%@include%>与<jsp:include>的区别
关键区别在于<%@include%>找到目标文件并将它插入到当前jsp文件中,就好像你通过文本编辑器的copy/paste操作一样。相反,<jsp:include>在当前jsp页面执行的时候定位文件。这种区别产生了不同的行为:
假设有a.jsp,在a中include文件b,那么
1)
<%@include%>如果b改变,a不会发现b的改变直到a也发生改变。
<jsp:include>马上察觉到变化。
2)
<%@include%>b是基本的文本,jsp片断等,不能是一个java servlet
<jsp:include>允许包括servlet
3)
<%@include%>在某些情况下要比<jsp:include>更有效率,但是它占用更多的硬盘空间。当然,在此,两者的执行效率不太重要。
4)
<%@include%>a、b是整合在一起的文件,所以可能产生变量名等的冲突问题。它们必须保持一致。
<jsp:include>可以对不同的变量使用相同名字,对同一个标签库使用不同前缀,a、b是相互独立的文件。
2-2-3jsp tag libraries
标签库使用与jsp:不同的前缀,它们必须在使用前用伪标签(pseudo-tag)作为定向(directive)导入。
定向不是很严格的遵循类xml语法。例如:
<%@ taglib %>
使用标签库前,你必须明确它的uri,在此,它的功用不是从网上下载任何资源,而是用于区别不同的标签库。
<%@ taglib uri=" http://www.acme.com/custom.tld" prefix="acme" %>
标签库被uri所标志,使用acme作为前缀。在当前文档中,标签<create>就应该被写作:<acme:create>。在jstl中定义的前缀只是为了便于他人阅读你的源码而推荐使用的,你完全可以自己定义。
jstl标签库
I.核心库
名称 core library
前缀 c
URI http://java.sun.com/jstl/core
例子 <c:forEach>
用途 访问调制内存中数据,条件判断,迭代
II.xml处理库
名称 xml prcessing liberary
前缀 x
URI http://java.sun.com/jstl/xml
例子 <x:forEach>
用途 解析xml文档,输出xml文档中的元素,基于xml的内容做判断
III.国际化&格式化
名称 inernationalization(i18n) & formatting library
前缀 fmt
URI http://java.sun.com/jstl/fmt
例子 <fmt:formatDate>
用途 读取输出数字,日期,多语言下显示
IV.数据访问
名称 database(sql) access
前缀 sql
URI http://java.sun.com/jstl/core
例子 <sql:query>
用途 辅助数据库交互
jstl库的调用如下格式:
<@ taglib prefix="c" uri=" http://java.sun.com/jstl/core "%>
<@ taglib prefix="x" uri=" http://java.sun.com/jstl/xml "%><@ taglib prefix="fmt" uri=" http://java.sun.com/jstl/fmt "%><@ taglib prefix="sql" uri=" http://java.sun.com/jstl/sql"%>
本章内容:
I.xml基本语法
II.jsp介绍
III.context中的jstl标签库
IV.jsp范围变量
2-1xml介绍
首 先要提一下html。html拥有一套标签,如<img>,标签拥有修饰符或成为属性(attribute)。如在<img>标 签中的src="/dir/a.jpg"。html标签拥有一定的结构,如不能出现在之前。因此,我们可以说,html是一个标签、标签属性和结构规则的 集合。
html是xml的一个特定应用,不过它的规则比xml要宽泛,同样,xml也不像html那样描述特定的一套标签或标签间的关系。它描述的是文档中定义标签的规则。
2-1-1标签术语学
|--start tag------<c:froEach bein="2" end="5" var="i">
|
element |--body(content)--Current:<c:out value="${i}"/><br/>
|
|--end tag--------</c:forEach>
任何一个元素包括起始标签、内容和结束标签。有时,xml使用者会混淆元素和标签的概念,请记住,标签是在字符<>之间的文本。
空元素
起始和结束标签间没有内容的元素可以表示为
<lonely></lonely>
<lonely/>
属性
起始标签、空元素标签可以有属性,但请注意:结束标签不可有属性,一个标签内的属性不能重复。如:
<name firstName="true">Alex</name>正确
<name>Alex</name firstName="true">错误
<name firstName="true" firstName="true"/>错误
现在分析一下如下标签:
<c:forEach items="${collection}">
c命名空间前缀
forEach标签名
items属性名
${collection}属性值
命名空间
名 目空间是xml拥有而html不具备的特色。我们可以把xml命名空间视作组织标签的一种方式。在html中,所有的标签拥有简单直接的名字,例如 table。在xml中则有命名空间的限制。也就是说,标签不再是简单的名字,而是加上了命名空间的前缀。格式是<prefixName: tagName>
你可以通过命名空间的形式去限制单一文档中不同地方的大量标签。例如:
<宾馆:洗衣机>和<家庭:洗衣机>
不同的命名空间将上述标签区别开来,而在绝大部分场合,通过attribute来实现两者的区别是没有效率的。
在使用jstl中,我们不需要懂得很多关于命名空间的只是。然而,所有的jstl标签都使用了命名空间前缀。例如c:forEach,c指向一个命名空间而forEach声明了一个拥有该命名空间的特定标签。
元素间的关系
一个元素可以包含另一个元素。外部元素为父,内部元素为子。通常我们成为父标签和子标签,而不是父元素和子元素。
一个子元素不能拥有多个父元素而一个父元素可以有多个子元素。在下面的例子中:<a>是<c>的祖先,<c>是<a>的子孙。
<a>
<b>
<c/>
</b>
</a>
2-1-2相关xml法则
在此我们将讨论xml语法规则中jstl需要用到的部分。
意识到html规则比xml规则松散是很重要的。下表比较了html和xhtml的区别
法则:
I.属性值不惜标注引号
html <p align=left>
xhtml <p align="left">
II.区分大小写
html <p ALIGN=left>
xhtml <p align="left">
III.起始标签必须结束
html <p>content
xhtml <p>content</p>
IV.空元素必须有结束标记
html <br>
xhtml <br/>
html有相对随意的书写方式,在你使用jstl生成html文档的时候,你仍然可以这样做,<p ALIGN=left>不会产生任何问题,但是,不要把这种习惯带入jstl语句中。
围绕属性值的引号可以是单引号也可以是双引号。在下面的情况中,两者混合使用:值为12",则<ruler length='12"'>
如果属性值包含'和"两者,那么,可以使用转义符号
'对应'
"对应"
我们不需要记住很多的细节,下列的对应列表就足够了:
< <
& &
> >
还需要注意的一点是:标签不能交叉。如下是错误的:
<a>
<b>
</a>
</b>
2-2jsp介绍
笔者注:此处的翻译从略,仅做一个浏览,列出跟jstl关系较大的索引,具体jsp内容请参考网上众多资料,在此不再赘述。
2-2-1jsp tags集合
jsp tags
|
|__standard tags(core jsp tags)
|
|__other tags(tag libraries)
|
|__(include)_jstl tags
2-2-2 standard tags
I.jsp tags能够存在于hmtl tag或jsp tags中。如:
<a href="<c:out value="#">">a link</a>
II.jsp tags于静态模板文本工作方式不同。jsp tag和html tag的最大区别在于它有命名空间前缀。
core jsp tags均有jsp的命名空间前缀,例如<jsp:forward>和<jsp:include>,由于core jsp tags出现时间比jstl要早几年,所以形成了上表所描述的稍微令人困惑的集合形式。
IV.<jsp:include page="test.jsp">仅能include本地文件,即同一个jsp引擎。
值得注意的是:html的<base>标签。在html文档中,如果有下列标签<base href=" http://www.aleyxchow.com/"/>,那么象<img src="image.jpg"/>将导致浏览器载入 http://www.aleyxchow.com/image.jpg;但是对于<jsp:include>而言,<base>无效,include仅查找本地服务器上的文件。
V.标签<jsp:forward>也有与<jsp:include>同样的限制。
注意,如果A.jsp forward to B.jsp,那么,B.jsp文件不能通过该标签forward to A.jsp
VI.<%@include%>与<jsp:include>的区别
关键区别在于<%@include%>找到目标文件并将它插入到当前jsp文件中,就好像你通过文本编辑器的copy/paste操作一样。相反,<jsp:include>在当前jsp页面执行的时候定位文件。这种区别产生了不同的行为:
假设有a.jsp,在a中include文件b,那么
1)
<%@include%>如果b改变,a不会发现b的改变直到a也发生改变。
<jsp:include>马上察觉到变化。
2)
<%@include%>b是基本的文本,jsp片断等,不能是一个java servlet
<jsp:include>允许包括servlet
3)
<%@include%>在某些情况下要比<jsp:include>更有效率,但是它占用更多的硬盘空间。当然,在此,两者的执行效率不太重要。
4)
<%@include%>a、b是整合在一起的文件,所以可能产生变量名等的冲突问题。它们必须保持一致。
<jsp:include>可以对不同的变量使用相同名字,对同一个标签库使用不同前缀,a、b是相互独立的文件。
2-2-3jsp tag libraries
标签库使用与jsp:不同的前缀,它们必须在使用前用伪标签(pseudo-tag)作为定向(directive)导入。
定向不是很严格的遵循类xml语法。例如:
<%@ taglib %>
使用标签库前,你必须明确它的uri,在此,它的功用不是从网上下载任何资源,而是用于区别不同的标签库。
<%@ taglib uri=" http://www.acme.com/custom.tld" prefix="acme" %>
标签库被uri所标志,使用acme作为前缀。在当前文档中,标签<create>就应该被写作:<acme:create>。在jstl中定义的前缀只是为了便于他人阅读你的源码而推荐使用的,你完全可以自己定义。
jstl标签库
I.核心库
名称 core library
前缀 c
URI http://java.sun.com/jstl/core
例子 <c:forEach>
用途 访问调制内存中数据,条件判断,迭代
II.xml处理库
名称 xml prcessing liberary
前缀 x
URI http://java.sun.com/jstl/xml
例子 <x:forEach>
用途 解析xml文档,输出xml文档中的元素,基于xml的内容做判断
III.国际化&格式化
名称 inernationalization(i18n) & formatting library
前缀 fmt
URI http://java.sun.com/jstl/fmt
例子 <fmt:formatDate>
用途 读取输出数字,日期,多语言下显示
IV.数据访问
名称 database(sql) access
前缀 sql
URI http://java.sun.com/jstl/core
例子 <sql:query>
用途 辅助数据库交互
jstl库的调用如下格式:
<@ taglib prefix="c" uri=" http://java.sun.com/jstl/core "%>
<@ taglib prefix="x" uri=" http://java.sun.com/jstl/xml "%><@ taglib prefix="fmt" uri=" http://java.sun.com/jstl/fmt "%><@ taglib prefix="sql" uri=" http://java.sun.com/jstl/sql"%>