关闭

jstl in action 第二章(转自http://www.blogcn.com/blog/trackback.asp?mydiary=23140875)

6980人阅读 评论(0) 收藏 举报
第二章: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"'>

如果属性值包含'和"两者,那么,可以使用转义符号
'对应&apos;
"对应&quot;
我们不需要记住很多的细节,下列的对应列表就足够了:
<  &lt;
& &amp;
> &gt;

还需要注意的一点是:标签不能交叉。如下是错误的:
<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="::URL::http://www.aleyxchow.com/"/>,那么象<img  src="image.jpg"/>将导致浏览器载入::URL::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="::URL::http://www.acme.com/custom.tld"  prefix="acme" %>

标签库被uri所标志,使用acme作为前缀。在当前文档中,标签<create>就应该被写作:<acme:create>。在jstl中定义的前缀只是为了便于他人阅读你的源码而推荐使用的,你完全可以自己定义。

jstl标签库

I.核心库
名称 core library
前缀 c
URI  ::URL::http://java.sun.com/jstl/core
例子 <c:forEach>
用途 访问调制内存中数据,条件判断,迭代

II.xml处理库
名称 xml prcessing liberary
前缀 x
URI  ::URL::http://java.sun.com/jstl/xml
例子 <x:forEach>
用途 解析xml文档,输出xml文档中的元素,基于xml的内容做判断

III.国际化&格式化
名称 inernationalization(i18n) & formatting library
前缀 fmt
URI  ::URL::http://java.sun.com/jstl/fmt
例子 <fmt:formatDate>
用途 读取输出数字,日期,多语言下显示

IV.数据访问
名称 database(sql) access
前缀 sql
URI  ::URL::http://java.sun.com/jstl/core
例子 <sql:query>
用途 辅助数据库交互

jstl库的调用如下格式:

<@ taglib prefix="c" uri="::URL::http://java.sun.com/jstl/core "%>
<@ taglib prefix="x" uri="::URL::http://java.sun.com/jstl/xml "%><@ taglib prefix="fmt" uri="::URL::http://java.sun.com/jstl/fmt "%><@ taglib prefix="sql" uri="::URL::http://java.sun.com/jstl/sql"%>  
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:46375次
    • 积分:704
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:12篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论