Java EE之JSTL(上)
1.JSP标签和JSTL简介
JSP标签看起来就像普通的HTML或者XML标签一样。一个JSP标签将执行某些操作。
为了引用JSP标签必须使用正确的XML命名空间。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
指令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。
- 然后解析器将会检查部署描述符文件中的
<jsp-config>中的显式<taglib>声明。 - 如果解析器仍然未找到匹配的TLD文件,它将检查应用程序的/WEB-INF/lib目录中所有JAR文件的META-INF目录中的所有TLD文件,或者检查应用程序的/WEB-INF目录中的TLD文件,或者递归地检查所有/WEB-INF子目录中的TLD文件。
- 最后,解析器将检查Web容器或者应用服务器中的所有TLD文件。
通常不需要使用显式的<taglib>声明,除非你引用的TLD文件中不包含URI,或者需要使用同名的URI覆盖一个你无法控制的第三方JAR文件中的TLD文件。
在正确地配置了taglib指令之后,就可以在JSP中使用标签库中的标签。所有的JSP标签都将遵守相同的基本语法:<prefix:tagname[attribute=value[attribute=value[...]]] />
在该语法标记中,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.使用核心标签库
核心标签库包括条件编程工具、循环和迭代以及输出内容。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.1 <c:out>
<c:out value="${someVariable}">等同于${fn:escapeXml(someVariable)}。
默认<c:out>对保留的XML字符(<、>、‘、"、&)进行转义,这样可以保护网站避免遭到跨站脚本攻击和各种不同的注入攻击。
<c:out value="${someVariable}" escapeXml="false">将禁止对XML字符转义的行为。
default属性用于指定当value特性为null时使用的默认值。
<c:out value="${someVariable}" default="Value not specified.">
除了default特性,也可以使用嵌套内容实现实现相同的目的。
<c:out value="${someVariable}">default value</c:out>
2.2 <c:url>
标签<c:url>可以正确地对URL进行编码,并且在需要添加会话ID的时候重写它们。该标签将与<c:param>标签一起完成该行为,而<c:param>标签将指定包含在URL中的查询参数。
<c:url value="http://www.example.net/content/news/today.jsp">
<c:param name="story" value="${storyId}"/>
<c:param name="seo" value="${seoString}"/>
</c:url>
<c:param>对查询参数进程编码,保证它们不会破坏URL。
<a href="<c:url value="/view.jsp">
<c:param name="forumId" value="12" />
</c:url>">Product Forum</a>
注意,这里的标签<c:url>实际上是内嵌在HTML标签中,这是完全合法的,并且相当常见。当JSP引擎渲染JSP时,将会解析<c:url>并替换它。
如果应用程序被部署到/forums,结果链接将指向/forums/view.jsp?forumId=2。
当然,你可能会希望使用网站的根路径,或者你可能需要它访问其他应用程序。这也很容易完成,在标签中添加context特性即可。
<c:url value="/index.html" context="/" />
<c:url value="/item.jsp?itemId=15" context="/store" />
第一个标签产生的URL将指向/index.html。第二个标签产生的URL将指向/store/item.jsp?itemId=15。
如果某个URL需要在页面中使用多次,那么可以将结果URL保存在作用域变量中。
<c:url value="/index.jsp" var="homepageUrl" />
<c:url value="/index.jsp" var="homepageUrl" scope="request" />
特性var指定了用于创建和保存结果URL的EL变量名称。默认它被保存为页面作用域(记录4个EL变量作用域:页面、请求、会话和应用程序),这通常可以满足正常的需求。
如果处于某些原因,希望将保存在不同的作用域中,那么可以使用scope属性显式地指定作用域。
将URL保存到某个作用域后,可以使用${homepageUrl}在页面中引用该URL。
<a href="${homepageUrl}">Home</a>
我们鼓励使用<c:url>,以防URL中包含了需要编码的特殊字符。
2.3 <c:if>
<c:if test="${something == somethingElse}">
execute only if test is true
</c:if>
特性test指定了一个条件,只有该条件为真时,<c:if>标签中内嵌的内容才会被执行。如果特性test值为假,标签中的所有内容都将被忽略。
如果有某个复杂的条件,你只希望执行一次但需要在页面中多次使用它的结果,那么可以使用var特性将它保存为变量。
<c:if test="${someComplexExpressionIsTrue}" var="itWasTrue"/>
...
<c:if test="${itWasTrue}">
do something
</c:if>
<c:if test="${itWasTrue}">
do something else
</c:if>
2.4 <c:choose>、<c:when>、<c:otherwise>
<c:choose>
<c:when test="${something}">
"if"
</c:when>
<c:when test="${somethingElse}">
"else if"
</c:when>
...
<c:otherwise>
"else"
</c:otherwise>
</c:choose>
<c:choose>至少需要有一个<c:when>,所有的<c:when>标签都必须添加在<c:otherwise>之前。
<c:when>有一个特性test,它代表了进行测试的条件,如果为真,就执行<c:when>中内嵌的内容。
只有一个<c:when>标签的内容会被执:第一个test结果为真的<c:when>标签。在<c:when>标签成功执行之后,<c:choose>标签将直接短路至标签末尾。
<c:choose>标签中最多只能包含一个<c:otherwise>标签(可选的),并且它必须是<c:choose>标签中的最后一个标签,当所有的<c:when>标签条件结果都不为真时才执行。
2.5 <c:forEach>
标签<c:forEach>用于迭代并重复它的嵌套主体内容固定次数,或者遍历某些集合或数组。
<c:forEach var="i" begin="0" end="100">
Line ${i} <br />
</c:forEach>
上面的<c:forEach>标签的内容等同于下面的Java代码:
for(int i = 0; i < 100; i++){
out.println("Line " + i + "<br />");
}
使用step属性,将每次对i增加的值修改为大于1。
<c:forEach var="i" begin="0" end="100" step="3">
Line ${i} <br />
</c:forEach>
使用<c:forEach>遍历对象的某些集合。
<c:forEach items="${users}" var="user">
${user.lastName}, ${user.firstName}<br />
</c:forEach>
上面的<c:forEach>标签的内容等同于下面的Java代码:
for(User user : users){
out.println(user.getLastName() + ", " + user.getFirstName() + "<br />");
}
特性items中的表达式必须是一些集合、Map、Iterator、Enumeration、对象数组或者原生数组。
如果该特性的值为Map,那么该标签将通过调用entrySet遍历Map.Entry。
如果使用的类实现了Iterable接口,那么可以调用对象上的iterator方法使用它(items="${object.iterator()}")。
特性var指定了在每次循环迭代中每个元素应该被赋给的变量的名称。
varStatus(javax.servlet.jsp.jstl.core.LoopTagStatus)封装了当前迭代的状态。
<c:forEach items="${users}" var="user" varStatus="status">
${status.begin}
${status.end}
${status.step}
${status.count} <!-- 目前已执行的迭代次数(包含本次迭代) -->
${status.current} <!-- 当前迭代的元素 -->
${status.index} <!-- 当前迭代的索引 -->
${status.first} <!-- 如果当前迭代是第一次迭代,那么该值为真。 -->
${status.last} <!-- 如果当前迭代是最后一次迭代,那么该值为真。 -->
</c:forEach>
2.5 <c:forTokens>
<c:forTokens>标签几乎与<c:forEach>标签是一样的,主要区别在于<c:forTokens>标签的items特性使用的是字符串,而不是集合,并且需要使用一个额外的delims特性指定一个或多个字符,通过该特性将字符串分割成记号。然后该标签将迭代这些分割后的记号。
<c:forTokens items="This,is,a,cool,tag." delims="," var="word">
${word}<br />
</c:forTokens>
2.7 <c:redirect>
<c:redirect>标签将把用户重定向到另一个URL。
关于URL编码、会话ID的重写和使用嵌套<c:param>标签添加查询参数等规则,<c:redirect>与<c:url>都是相同的。
<c:redirect url="http://www.example.com/" />
<c:redirect url="/tickets" />
<c:param name="action" value="view"/>
<c:param name="ticketId" value="${ticketId}"/>
</c:redirect>
<c:redirect url="/browse" context="/store" />
示例源码链接:https://pan.baidu.com/s/1PG-6uskBcW9CQqeDTdHUlQ 密码:b78d
Java EE之JSTL(上)的更多相关文章
- 【Java EE 学习 80 上】【WebService】
一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...
- 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】
之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...
- 【Java EE 学习 25 上】【网上图书商城项目实战】
一.概述 1.使用的jdk版本:1.6 2.java EE版本:1.6 3.指导老师:传智播客 王建 二.小项目已经实现的功能 普通用户: 1.登陆 2.注册 3.购物 4.浏览 管理员用户(全部管理 ...
- 【Java EE 学习 83 上】【SpringMVC】【基本使用方法】
一.SpringMVC框架概述 什么是SpringMVC?SpringMVC是一个和Struts2差不多的东西,他们的作用和性质几乎是相同的,甚至开发效率上也差不多,但是在运行效率上SpringMVC ...
- 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】
一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...
- 【Java EE 学习 22 上】【文件上传】【目录打散】【文件重命名】
1.文件上传概述 (1)使用<input type="file">的方式来声明一个文件域. (2)表单提交方式一定要是post方式才行 (3)表单属性enctype 默 ...
- Java EE之JSTL(下)
3.使用国际化和格式化标签库(FMT命名空间) 如果你希望创建部署在Web上,并面向庞大的国际化用户的企业级Java应用程序,那么你最终需要为世界的特定区域进行应用程序本地化.这将通过国际化实现(通常 ...
- 【Java EE 学习 82 上】【MAVEN基本安装和使用方法】
一.Maven概述 1.什么是Maven? Maven中文意思是"行家"."专家",它是一种跨平台的项目管理工具. 2.Maven有什么作用? Maven能够实 ...
- 【Java EE 学习 79 上】【mybatis 基本使用方法】
一.简介 mybatis类似于hibernate,都是简化对数据库操作的框架,但是和hibernate不同的是,mybatis更加灵活,整体来说框架更小,这体现在它需要我们手写SQL语句,而hiber ...
随机推荐
- 某简单易懂的人脸识别 API 的开发环境搭建和简易教程
最近接了个人脸识别相关的项目,是基于某个非常简单易懂的人脸识别 API:face_recognition 做的.这个库接口非常傻瓜,很适合新手上手,而且可以研究其源码来学习 dlib 这个拥有更加灵活 ...
- last命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/jerry_1126/article/details/54427119 [root@xiaoma /root] test!# ...
- Redis学习(一):CentOS下redis安装和部署
1.基础知识 redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止redis支持的键值数据类型如下字符串.列表 ...
- JavaWeb项目通过调用cmd实现备份数据库的功能
1.别急着上车,先测试一下能否成功调用cmd,可以尝试通过cmd命令打开计算器,代码如下: 2.能成功打开计算器后,证明调用cmd的方法是没错的,现在把cmd命令字符串改成我们备份数据库的 命 ...
- No.11_功能规格说明书
功能规格说明书 • 基本目标 为用户提供更加便捷和人性化的闹钟提醒服务,以群组为单位规划时间安排与分配,对于个人用户,实现个人的设置闹钟,取消闹钟的操作,这些操作将会上传至数据库,并被同步到所有的客户 ...
- java第二次试验报告
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:郭皓 学号:20135327 成绩: 指导 ...
- 20162328蔡文琛 week11 大二
20162328 2017-2018-1 <程序设计与数据结构>第十一周学习总结 教材学习内容总结 在无向图中,表示边的顶点对是无序的. 如果图中的两个顶点之间有边链接,则称它们是领接的. ...
- spring冲刺第二天
昨天查找了安卓开发的相关资料以及炸弹人游戏的资料. 由于今天课程比较多,只在晚上将安卓开发环境配置完成. 在安装软件时环境配置出现了问题,不过问过同学后成功解决.
- oh my god 四则运算
Week1地址:https://git.coding.net/leiqh549/four.git 需求分析: 1.一个生成n道四则运算的程序,要求数字在0-100间,运算符在3-5个之间且运算符至少包 ...
- thinkphp学习3-模板与视图
1.模板赋值 如果要在模板中输出变量,必须在在控制器中把变量传递给模板,系统提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值. $this->assign('na ...