java ee jstl_Java EE之JSTL(上)

1.JSP标签和JSTL简介

JSP标签看起来就像普通的HTML或者XML标签一样。一个JSP标签将执行某些操作。

为了引用JSP标签必须使用正确的XML命名空间。

指令taglib中的prefix特性代表了在JSP页面中引用标签库时使用的命名空间。

标签库的标签库描述符(TLD)文件中提供了建议的标签前缀,但需要在taglib指令中使用prefix特性声明。因此可以在prefix特性中指定任意的前缀,但通常开发者会坚持使用TLD建议的前缀,这样可以避免引起其他开发者的混淆。

指令taglib中的uri特性标志着TLD中为标签库定义的URI。这是JSP解析器为引用的标签库定位正确TLD的方式:它将找到含有相同URI的TLD。

URI是一个命名惯例,并不是实际的TLD位置。你所使用的TLD将被以某种方式包含在应用程序中。URI只是一种用于识别唯一TLD的技术,通过这种方式可以正确地关联到相应的TLD。

当JSP解析器遇到taglib指令时,它将在不同的位置搜索该URI,并定位到该标签库的TLD文件。

如果使用的容器是一个Java EE兼容容器,那么解析器将搜索所有匹配Java EE规范的TLD。

然后解析器将会检查部署描述符文件中的中的显式声明。

如果解析器仍然未找到匹配的TLD文件,它将检查应用程序的/WEB-INF/lib目录中所有JAR文件的META-INF目录中的所有TLD文件,或者检查应用程序的/WEB-INF目录中的TLD文件,或者递归地检查所有/WEB-INF子目录中的TLD文件。

最后,解析器将检查Web容器或者应用服务器中的所有TLD文件。

通常不需要使用显式的声明,除非你引用的TLD文件中不包含URI,或者需要使用同名的URI覆盖一个你无法控制的第三方JAR文件中的TLD文件。

在正确地配置了taglib指令之后,就可以在JSP中使用标签库中的标签。所有的JSP标签都将遵守相同的基本语法:

在该语法标记中,prefix表示JSP标签库前缀,也被称为命名空间;tagname是TLD中定义的标签名称。

当你编写JSP时,注意所有JSP中已经隐式地包含了一个标签库。它就是JSP标签库,使用它时不需要在JSP中添加taglib指令(不过,在JSP文件中需要为jsp标签库添加xmlns声明)。

Java标准标签库规范的5个标签库:

核心(c)

格式化(fmt)

函数(fn)

SQL(sql)

XML(x)

通常不鼓励使用XML和SQL库。

作为参考,你可以查看Java EE 5 的JSTL 1.1 的TLD文档:https://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/。

可惜的是,目前没有Java EE 6的JSTL 1.2的公开文档,但这两个版本之间的区别是很小的。Java EE 7中未包含新的JSTL版本。

2.使用核心标签库

核心标签库包括条件编程工具、循环和迭代以及输出内容。

2.1

等同于${fn:escapeXml(someVariable)}。

默认对保留的XML字符(、‘、"、&)进行转义,这样可以保护网站避免遭到跨站脚本攻击和各种不同的注入攻击。

将禁止对XML字符转义的行为。

default属性用于指定当value特性为null时使用的默认值。

除了default特性,也可以使用嵌套内容实现实现相同的目的。

default value

2.2

标签可以正确地对URL进行编码,并且在需要添加会话ID的时候重写它们。该标签将与

">Product Forum

注意,这里的标签实际上是内嵌在HTML标签中,这是完全合法的,并且相当常见。当JSP引擎渲染JSP时,将会解析并替换它。

如果应用程序被部署到/forums,结果链接将指向/forums/view.jsp?forumId=2。

当然,你可能会希望使用网站的根路径,或者你可能需要它访问其他应用程序。这也很容易完成,在标签中添加context特性即可。

第一个标签产生的URL将指向/index.html。第二个标签产生的URL将指向/store/item.jsp?itemId=15。

如果某个URL需要在页面中使用多次,那么可以将结果URL保存在作用域变量中。

特性var指定了用于创建和保存结果URL的EL变量名称。默认它被保存为页面作用域(记录4个EL变量作用域:页面、请求、会话和应用程序),这通常可以满足正常的需求。

如果处于某些原因,希望将保存在不同的作用域中,那么可以使用scope属性显式地指定作用域。

将URL保存到某个作用域后,可以使用${homepageUrl}在页面中引用该URL。

Home

我们鼓励使用,以防URL中包含了需要编码的特殊字符。

2.3

execute only if test is true

特性test指定了一个条件,只有该条件为真时,标签中内嵌的内容才会被执行。如果特性test值为假,标签中的所有内容都将被忽略。

如果有某个复杂的条件,你只希望执行一次但需要在页面中多次使用它的结果,那么可以使用var特性将它保存为变量。

...

do something

do something else

2.4 、、

"if"

"else if"

...

"else"

至少需要有一个,所有的标签都必须添加在之前。

有一个特性test,它代表了进行测试的条件,如果为真,就执行中内嵌的内容。

只有一个标签的内容会被执:第一个test结果为真的标签。在标签成功执行之后,标签将直接短路至标签末尾。

标签中最多只能包含一个标签(可选的),并且它必须是标签中的最后一个标签,当所有的标签条件结果都不为真时才执行。

2.5

标签用于迭代并重复它的嵌套主体内容固定次数,或者遍历某些集合或数组。

Line ${i}

上面的标签的内容等同于下面的Java代码:

for(int i = 0; i < 100; i++){

out.println("Line " + i + "
");

}

使用step属性,将每次对i增加的值修改为大于1。

Line ${i}

使用遍历对象的某些集合。

${user.lastName}, ${user.firstName}

上面的标签的内容等同于下面的Java代码:

for(User user : users){

out.println(user.getLastName() + ", " + user.getFirstName() + "
");

}

特性items中的表达式必须是一些集合、Map、Iterator、Enumeration、对象数组或者原生数组。

如果该特性的值为Map,那么该标签将通过调用entrySet遍历Map.Entry。

如果使用的类实现了Iterable接口,那么可以调用对象上的iterator方法使用它(items="${object.iterator()}")。

特性var指定了在每次循环迭代中每个元素应该被赋给的变量的名称。

varStatus(javax.servlet.jsp.jstl.core.LoopTagStatus)封装了当前迭代的状态。

${status.begin}

${status.end}

${status.step}

${status.count}

${status.current}

${status.index}

${status.first}

${status.last}

2.5

标签几乎与标签是一样的,主要区别在于标签的items特性使用的是字符串,而不是集合,并且需要使用一个额外的delims特性指定一个或多个字符,通过该特性将字符串分割成记号。然后该标签将迭代这些分割后的记号。

${word}

2.7

标签将把用户重定向到另一个URL。

关于URL编码、会话ID的重写和使用嵌套

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值