JSTL(JSP标准标签库)是一个开放源代码的标签组件
链接:http://pan.baidu.com/s/1jIvearG 密码:vatq
将下载的JSTL的jar包放在项目的WEB-INF\lib文件夹中
解压该jar包将其中的META-INF文件夹中的几个主要标签配置文件(c.tld、fmt.tld、fn.tld、sql.tld、x.tld)保存在WEB-INF文件夹中
配置完成后需要重新启动Tomcat服务器
核心标签库
核心标签库是JSTL中最重要的部分,也是开发中最常用到的部分,在核心标签库中主要完成的就是流程控制、迭代输出等操作。
功能分类 | 标签名称 | 描述 |
---|---|---|
基本标签 | <c:out> | 输出属性内容 |
<c:set> | 设置属性内容 | |
<c:remove> | 删除指定属性 | |
<c:catch> | 异常处理 | |
流程控制标签 | <c:if> | 条件判断 |
<c:choose> | 多条件判断,可以设置<c:wen>和<c:otherwise>标签 | |
迭代标签 | <c:forEach> | 输出数组、集合 |
<c:forTokens> | 字符串拆分及输出操作 | |
包含标签 | <c:import> | 将一个指定的路径包含到当前页进行显示 |
生成URL标签 | <c:url> | 根据路径和参数生成一个新的URL |
客户端跳转 | <c:redirect> | 客户端跳转 |
<c:out>
<c:out>标签主要用于输出内容,语法如下:
没有标签体:
<c:out value="打印的内容" [escapeXml="[true|false]"][default="默认值"]/>
有标签体:
<c:out value="打印的内容" [escapeXml="[true|false]"]>
默认值
</c:out>
<c:out>标签的属性
value:设置要显示的内容
default:如果要显示的value内容为null,则显示default定义的内容
escapeXml:是否转换字符串,例如将“<”转换成为“>”,默认为true
<c:set>标签
<c;set>标签主要用来将属性保存在4种属性范围中,与setAttribute()方法的作用类似
<c:set>设置–没有标签体
<c:set var="属性名称" value="属性内容" [scope="[page | request | session | application]"]/>
<c:set>设置–有标签体
<c:set var="属性名称" [scope="[page | request | session | application]"]/>
<c:set>设置内容到对象–没有标签体
<c:set value="属性内容" target="储存的对象名称" property="对象的属性名称" />
<c:set>设置内容到对象–有标签体
<c:st target="储存的对象名称" property="对象的属性名称">
属性内容
</c:set>
<c:remove>标签
<c:remove>标签在程序中的主要作用是删除指定范围中的属性,功能与removeAttribute()方法类似
语法如下:
<c:remove var="属性名称" [scope="[page | request | session | application]"]/>
<c:catch>标签
<c:catch>标签主要用来处理程序中产生的异常,并进行相关的异常处理
语法如下:
<c:catch [var="保存异常信息的属性名称"]>
有可能发生异常的语句
</c:catch>
<c:if>标签
<c:if>标签主要用来完成分支语句的实现
没有标签体:
<c:if test="判断条件" var="储存判断结果" [scope="[page | request | session | applictation]"] />
有标签体:
<c:if test="判断条件" var="储存判断结果" [scope="[page | request | session | application]"]>
满足条件时执行的语句
</c:if>
<c:choose>、<c:when>、<c:otherwise>标签
<c:if>标签只可以进行一个条件的判断,如果现在要同时判断多个条件,可以使用标签,但是标签只能作为<c:when>和<c:otherwise>的父标签出现
<c:choose>的语法如下:
<c:choose>
标签体内容(<c:when>、<c:otherwise>)
</c:choose>
<c:when>相当于if 和 if else
<c:otherwise>相当于else (只能出现一次或0次)
<c:otherwise>要写在<c:when>后面 ,只有当所有<c:when>都不满足之后,<c:otherwise>才会被得到执行。
<c:forEach>标签
<c:forEach>标签的主要功能为循环控制,可以将集合中的成员进行迭代输出,功能与Iterator接口类似。
语法如下:
<c:forEach [var="每一个对象的属性名称"] items="集合" [varStatus="保存相关成员信息"] [begin="集合的开始输出位置"] [end="集合的结束输出位置"] [step="每次增长的步长"]>
标签体
</c:forEch>
var:用来存放集合中的每一个对象
items:保存所有的集合,主要是数组、Collection(List、set)及Map
varStatus:用于存放当前对象的成员信息
begin:集合的开始位置,默认从0开始
end:集合的结束位置,默认为集合的最后一个元素
step:每次迭代的间隔数,默认为1
例如:
<body>
<%
List all=new ArrayList();
all.add("www");
all.add("huihui");
all.add("com");
pageContext.setAttribute("ref",all);
%>
<h3>输出全部、
<c:forEach items="${ref}" var="mem">
${mem}、
</c:forEach></h3>
只要是Collection接口的子接口或类都可以输出
在用<c:forEach>进行输出Map集合时,所有保存在集合Map中的对象都是通过Map.Entry的形式保存的,所以想要分理出key和value,则需要通过Map.Entry提供的getKey()和getValue()方法
例如
<%
Map map=new HashMap();
map.put("www","www.huihui.com");
map.put("name","huihui");
pageContext.setAttribute("ref",map);
%>
<c:forEach items="${ref}" var="mem">
<h3>${mem.key}-->${mem.value} </h3>
<c:forEach>
<forTokens>标签
<forTokens>标签也是用于输出操作的,类似于String类中的split()方法和循环输出的一种集合。语法如下:
<c:forTokens items="输出的字符串" delims="字符串分割符" [var="存放每一个字符串变量"]
[varStatus="存放当前对象的相关信息"] [begin="输出位置"] [end="结束位置"] [step="输出间隔"]>
标签体内容
</c:forTokens>
var:用来存放集合中的每一个对象
items:要输出的字符串
delims:定义分隔字符串的内容
varStatus:存放当前对象的相关信息
begin:开始的输出位置,默认从0开始
end:结束的输出位置,默认为最后一个成员
step:迭代输出的间隔
一般用到var、items、delims
例如
<%
Stirng info="www.baidu.com";
pageContext.setAttribute("ref",info);
%>
<h3>拆分的结果是:
<c:forTokens items="${ref}" delims="." var="con">
${con}、
</c:forTokens></h3>
<c:import>标签
<c:import>标签可以将其他页面的内容包含进来一起显示,这与<jsp:include>标签的功能类似,但是与<jsp:include>标签不同的是,<c:import>可以包含外部的页面。<c:import>标签的语法如下:
<c:import url="包含的地址的URL" [context="上下文路径"] [var="保存内容的属性名称"]
[scope="[page | request | session |application ]"] [charEncoding="字符编码"]
[varReader="以Reader方式读取内容"]>
标签体内容
[<c:param name="参数名称" value="参数内容"/>]
</c:import>
context:如果要访问在同一个Web容器下的其他资源时设置,必须以”/”开头
var:储存导入的文件内容
varReader:储存导入的文件内容,以Reader类型存入
url:设置时不能设置为null,否则会出现JasperException异常
当 : <c:import url=”http://www.baidu.com” charEncoding=”UTF-8”/>时,导入时只是将站点的HTML代码导入进来,而相关的图片显示和css文件会出现问题
如果要想导入的页面传递参数,则可以使用<c:import>标签中的<c:param>子标签进行传递。
例如
param.jsp
<h3>name参数:&{param.name}</h3>
<h3>URL参数:&{param.url}</h3>
传递参数页面:import_param.jsp
<c:import url="param.jsp" charEncoding="urf-8">
<c:param name="name" value="huihui" />
<c:param name="url" vlaue="www.baidu.com" />
</c:import>
<c:url标签>
<c:标签可以直接产生一个URL地址
无标签体:
<c:url value="操作的url" [context="上下文路径"] [var="保存的属性名称"]
[scope="[page|request|session|application]"]/>
有标签体:
<c:url value="操作的url" [context="上下文路径"] [var="保存的属性名称"]
[scope="[page| request|session|application]"]>
<c:param name="参数名称" value="参数内容"/>
</c:url>
url:要执行的url
context:如果要访问在同一个Web容器下的其他资源时设置,必须以“/”开头
var:储存导入的文件内容
scope:定义var的保存范围,默认为page范围
例如:
<c:url value="http://www.baidu.com" var="urlinfo">
<c:param name="author" value="huihui"/>
<c:param name="logo" value="qaq"/>
</c:url>
<a href="${urlinfo}">新的地址</a>
生成的新地址是:http://www.baidu.com/?author=huihui&logo=qaq
<c:redirect>标签
<c:redirect>标签类似于response.sendRedirect()操作进行的客户端跳转。
语法如下:
没有标签体:
<c:redirect url="跳转的地址" context="上下文路径"/>
有标签体:
<c:redirect url="跳转的地址" context="上下文路径">
<c:param name="参数名称" value="参数内容"/>
</c:redirect>
国际标签库
国际化是程序的重要组成部分,一个程序可以根据所在区域进行相应信息的显示,例如,各个地区的数字、日期显示风格都是不同的,在JSTL中使用fmt.tld作为格式化标签库的定义文件。
功能分类 | 标签名称 | 描述 |
---|---|---|
国际化标签 | <fmt:setLocale> | 设置一个全局的地区代码 |
<fmt:requestEncoding> | 设置统一的请求编码 | |
信息显示标签 | <fmt:bundle> | 设置临时的要读取资源文件的名称 |
<fmt:message> | 通过key取得value,通过<fmt:param>向动态文中设置内容 | |
<frm:setBundle> | 设置一个全局的要读取资源文件的名称 | |
数字及日期格式化 | <fmt:formatNumber> | 格式化数字 |
<fmt:parseNumber> | 反格式化数字 | |
<fmt:formatDate> | 格式化日期,将日期变为字符串 | |
<fmt:parseDate> | 反格式化日期,将字符串变为日期 | |
<fmt:setTimeZone> | 设置一个全局的时区 | |
<fmt:timeZone> | 设置一个临时的时区 |
<fmt:setLocale>标签
<fmt:setLocale>标签主要功能是设定用户所在的区域
语法如下:
<fmt:setLocale value="区域编码" [variant="浏览器"] [scope="[page| request| session | application]"]/>
value:设置地区的编码,表示一个java.util.Locale类
variant:如果要访问在同一个Web容器下的其他资源时设置,必须以“/”开头
<%
pageContext.setAttribute("date",new Date());
%>
<h3>中文日期显示:
<fmt:setLocale value="zh_CN"/>
<fmt:formatDate value="${date}"/> </h3>
<h3>英文日期显示:
<fmt:setLocal value="en_US"/>
<fmt:formatDate value="${date}"/></h3>
<fmt:requsetEncoding>标签
设置所有的请求编码,与setCharacterEncoding()方法的功能一样
语法如下:
<fmt:requestEncoding [value="字符集"]/>
读取资源文件
在国际化中最重要的组成部分就是资源文件的读取,在JSTL中提供了4个标签用于资源的读取和操作,分别是<fmt:message>、<fmt:param>、<fmt:bundle>和<fmt:setBundle>
所有的资源文件都是以*.properties作为后缀,所有的内容要按照“key=value”的格式进行编写,在Web中,资源文件要保存在/WEB-INF/classes文件夹中。
例如
定义资源文件-----/WEB-INF/classes/Message.properties
naem=LiXingHua
#info=欢迎{0}光临!
info=\u6b22\u8fce{0}\u5149\u4e34\uff01
资源文件定义完成之后,即可利用<fmt:bundle>标签在一个JSP页面中指定资源文件的名称
语法如下:
<fmt:bundle basename="资源文件名称" [prefix="前置标记"]>
标签体内容
</fmt:bundle>
此时不需要加上文件的后缀.*properties
当通过<fmt:bundle>标签指定好资源文件名称后,即可使用<fmt:message>标签按照key读取value
语法如下:
没有标签体:
<fmt:messge key="资源文件的指定key" [bundle="资源文件名称"]
[var="存储value内容的属性名称"][scope="[page|request|session|application]"]/>
有标签体:
<fmt:message key="资源文件的指定 key" [bundle="资源文件名称"]
[var="存储value内容的属性名称"][scope="[page|request|session|application]"]>
<fmt:param value="设置占位符内容"/> //要设置的参数内容
</fmt:message>
例如:
Message.properties
name=huihui
#info=欢迎{0}光临!
info=\u6b22\u8fce{0}\u5149\u4e34\uff01
读取资源文件:message.jsp
<fmt:bundle basename="Message">
<fmt:message key="name" var="nameref"/>
</fmt:bundle>
<h3>姓名:${nameref}</h3>
<fmt:bundle basename="Message">
<fmt:message key="info" var="inforef">
<fmt:param value="shandong"/>
</fmt:message>
</fmt:bundle>
<h3>信息:${inforef}</h3>
当资源文件不存在或者key为Null时,读取的信息将为”??????”
在进行资源读取时也可以通过<fmt:setBundle>标签设置一个默认的读取资源名称
这样每次在使用<fmt:setBundle>标签进行信息读取时,直接通过bundle设置要读取资源的属性即可
语法如下:
<fmt:setBundle basename="资源文件名称" [var="保存资源文件内容的属性名称"]
[scope="[page|request|session|application]"]/>
SQL标签
功能分类 | 标签名称 | 描述 |
---|---|---|
数据源标签 | <sql:setDataSource> | 设置要使用的数据源名称 |
数据库操作标签 | <sql:query> | 执行查询操作 |
<sql:update> | 执行更新操作 | |
事务处理标签 | <sql:transaction> | 执行事务的处理操作,并设置操作的安全级别 |
MVC设计模式中要求数据库操作都要放在JavaBean(DAO)中完成,而JSTL是直接在JSP上操作的 ,开发中并不推荐。
因此暂且跳过此内容,以后需要再看。
XML标签库
功能分类 | 标签名称 | 描述 |
---|---|---|
核心操作 | <x:out> | 输出XPath指定的内容 |
<x:parse> | 进行XML解析 | |
<x:set> | 将内容保存在属性范围中 | |
流程控制 | <x:if> | 判断XPath指定的内容是否满足条件 |
<x:choose> | 多条件判断,相当于swith语句 | |
<x:when> | 判断条件,相当于case语句 | |
<x:otherwise> | 条件出口,相当于default | |
<x:forEach> | 循环输出节点 |
XPath简介
XPath的主要功能是在XML文档中能够准确的找到某一个节点元素,可以通过XPath找到一个XML文档中定义的节点内容或属性等
路径标记 | 描述 |
---|---|
根元素 | / |
父节点 | ../ |
任何路径下的节点 | // |
属性 | @属性名称 |
通配符 | * |
例如:
<?xml version="1.0" encoding="utf-8"?>
<addresslist>
<linkman>
<name id="www">huihui</name>
<email>huihui@qq.com</email>
</linkman>
</addresslist>
超找实例
路径标记 | 描述 |
---|---|
找到name元素 | /addresslist/linkman/name |
直接找到name元素 | //name |
找到Id属性 | //name/@id |
<x:parse>标签
<x:parse>标签的主要作用是进行XML解析的操作
语法如下:
无标签体
<x:parse [doc="XML文件内容"] [var="保存名称"][scope="[page|requset|session|application]"] [varDom="DOM解析后的XML对象"][scopeDom="varDom范围"][systemId="XML文件的URL"]/>
有标签体
<x:parse [var="保存名称"] [scope="[page|request|session|application]"] [varDom="Dom解析后的XML对象"][scopeDom="varDom范围"][systemId="Xml文件的URL"]>
要解析的XML文件
</x:parse>
无标签体和有标签体的区别是无标签体中要解析的文件在doc中,有标签体则在标签体中
var:保存解析后的XML文件的对象
scope:var变量保存范围,默认page
varDom:使用DOM解析后的XML文件对象
scopeDom:varDom属性的保存范围
systemId:文件的URI
剩下的xml标签省略掉了 过后再议。