JSP 笔记 —— JSTL 标签库
来源:互联网 发布:网络语黑洞的意思 编辑:程序博客网 时间:2024/05/20 09:22
一、关于JSTL 标签库
JSTL,JSP 标准标签库,由Apache 的Jakarta 小组负责维护,所以在apache的下载发布资源(distribution)时需进入jakarta 目录下载。
JSTL 的作用?取代在JSP 页面嵌入java 代码的方式,提高程序可维护性。
JSTL 与EL 的区别?EL 只是用于访问数据用户数据与bean数据的,JSTL 除了可访问,还可设置。
JSTL 标签库由4个标签库组成:core、fmt、sql、xml、functions 标签库。
一个标签库由两部分组成:jar 文件包、tld文件(tag library description)。
使用JSTL 需要的对应的 jar 包及各标签库的tld文件定义位置(即taglib指令的uri属性值):
jar 包:jstl.jar 、standard.jar
tld 定义位置:
core库:http://java.sun.com/jsp/jstl/corefmt 库:http://java.sun.com/jsp/jstl/fmtsql 库:http://java.sun.com/jsp/jstl/sqlxml 库:http://java.sun.com/jsp/jstl/xmlfunctions库:http://java.sun.com/jsp/jstl/functions
二、引用JSTL 标签库的配置
主要是对uri 属性。
方式一:标准定义
1、导入jstl.jar、standard.jar,发布时也需要包含进发布路径。
2、JSP 页面中使用:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="任意名字" %>
1、导入jstl.jar、standard.jar,同上。此外,还需下载使用标签库的tld 文件,假设core 库的描述文件c.tld放在WEB-INF/taglib目录下。
2、在web.xml 中配置标签库。
<jsp-config> <taglib> <taglib-uri>myTaglib</taglib-uri> <taglib-location>WEB-INF/taglib/c.tld</taglib-location> </taglib> </jsp-config>3、JSP 页面中使用:
<%@ taglib uri="myTaglib" prefix="任意名字" %>
三、JSTL 核心标签库core
核心标签的功能实现定义在standard.jar 包的org.apache.taglibs.standard.tag.common.core 与 org.apache.taglibs.standard.tag.rt.core 包下。
核心标签分为四类:表达式标签(out、set、remove、catch)、URL相关标签(import、redirect、url、param)、流程控制标签(if、when、choose、otherwise)、循环标签(forEach、forTokens,其中forTokens 可指定分隔符后遍历子串)
标签如下(取标签库前缀prefix 为core):
1、catch标签:
<core:catch var="aException"><core:out value="request" ></core:out><core:set></core:set><!--此处将发生异常,因为没有指定set 标签的必须属性--></core:catch><core:if test="${aException != null }"><core:out value="${pageScope.aException }"></core:out></core:if>所有属性说明:var,非必须的。用于指定可能发生的异常的名称,即以var指定的值为键,以发生的异常为值,存储在pageContext 中。
打开c:catch 标签的源代码(org.apache.taglibs.standard.tag.common.core.CatchTag),其中一段代码如下:
public void doCatch(Throwable t) { if (var != null) pageContext.setAttribute(var, t, PageContext.PAGE_SCOPE); caught = true; }可见是以键值对形式保存了异常。
2、if 标签:
<core:if test="判断条件,必须" var="test的boolean结果,可选" scope="var的范围">条件体</core:if>
<core:out value="输出的内容,必须"></core:out>
4、when、choose 与 otherwise 标签:choose只能作为when与otherwise的父标签,且内部不能包含之外的其它标签,只能有一个otherwise
<core:choose><core:when test="">条件体1</core:when><core:when test="">条件体N</core:when><core:otherwise>只能包含一个otherwise</core:otherwise></core:when>
相当于 switch 结构,otherwise为默认执行。
5、set 标签:属性分为两组
<core:set property="被设置在target中的属性名" scope="var的范围" target="具有setter方法的JavaBean对象或java.util.Map对象" value="表达式"var="存储value表达式结果的变量"></core:set>属性都非必须的,但有的属性之间存在依赖关系。set 标签既可设置值,也可产生变量var。实例:
var、scope、value 为一组用于设置变量;
target、property、value 为一组用于设置bean 的属性值;
<jsp:useBean id="wjb" class="com.milan.pojo.Person" ></jsp:useBean><%--设置新的变量 --%><core:set var="userName" scope="page" value="weijianbao"></core:set><%--设置bean的属性值 --%><core:set target="${wjb}" property="name" value="zhengyingxia"></core:set><core:out value="${userName}"></core:out><core:out value="${wjb.name}"></core:out>能正确输出,注意target 是通过EL 赋值的,且操作的bean 只能通过jsp:useBean 标签获得,而不能通过new 创建,因为EL 无法访问到new 创建的对象。此外,应保证property 及其setter方法存在。
此外target 还可指定为java.util.Map 的对象:
<%Map<String,String> user=new HashMap<String,String>();user.put("name", "郑");//session.setAttribute("user", user);%><core:out value="${session.user.name} "></core:out><%--无法访问 --%><core:out value="sessionScope.user.name:${sessionScope.user.name} "></core:out><core:set target="${user}" property="name" value="郑成功"></core:set><core:out value="user.name:${user.name}"></core:out>注:虽然set是在第二个与第三个out标签之间的,但两个标签都显示设置后的值。
6、remove 标签:
<%-- <core:remove var="移除的变量名" scope="指定范围"/> --%><core:set var="aVar" scope="session" value="varValue"></core:set><core:out value="${aVar}"></core:out><core:out value="${sessionScope.aVar} "></core:out><core:remove var="aVar" scope="session"/><core:out value="${aVar}"></core:out>注:通过jstl 标签设置的变量,既可通过EL 的范围对象(如sessionScope),也可直接访问,上面的前两个out 标签都能显示变量值。
7、foreach 标签:
<core:forEach items="遍历的集合" begin="开始索引" end="结束索引" step="步长,默认1"var="遍历的集合当前item" varStatus="迭代状态,有多个可选值" ><core:out value=""></core:out></core:forEach>
8、url、param、forTokens 标签:
暂不了解
暂不了解
三、sql 标签库
包含标签:
sql:transaction
sql:query
sql:update
sql:param
sql:dateParam
sql:setDataSource
四、fmt 标签库
五、functions 标签库
六、xml 标签库
七、JSTL 与 EL 的结合使用
1、关于EL 访问数据的顺序
属性的默认访问顺序为:page——>request——>session——>application,即从范围由小到大。
EL 提供了pageScope、requestScope、sessionScope、applicationScope 四个对象封装了page 、request、session、application范围内的属性,这四个对象都是Map 类型。
大前提:EL 只能访问 JavaBean 与 内置对象中的数据,在jsp的java 片段中new 的JavaBean 类的对象,不算JavaBean,所以无法通过EL 访问到。测试:
<%!String var="pageVar"; %><%application.setAttribute("var", "applicationScope");session.setAttribute("var", "sessionScope");request.setAttribute("var", "requestScope");%><core:out value="var:${var}"></core:out><br><!--重点:将显示requestScope,因为在page中查找不到,所以先查到了request中的var属性--><core:out value="applicationScope.var:${applicationScope.var}"><!--显示applicationScope--></core:out><br><core:out value="sessionScope.var:${sessionScope.var}"><!--显示sessionScope--></core:out><br><core:out value="requestScope.var:${requestScope.var}"><!--显示requestScope--></core:out><br><core:out value="pageScope.var:${pageScope.var}"><!--重点:此处无显示,因为page 范围中不存在var ,page内置对象也没有设置属性的方法--></core:out><br>
注:EL 的内置对象中,除了pageContext 对象是ServletContext 类型(用于获取其它内置对象),其它的都是java.util.Map 类型。
2、JSTL 与 EL 结合使用
JSTL 只有与EL 结合才能发挥强大功能,JSTL 的标签中的属性值都是引号包围的,即是是对象的赋值,如set 标签的 target 标签。所以,进行对象的赋值只能通过结合EL 实现,如:
<c:set target="${beanId}" property="attrName" value="..."/>此外,算术与逻辑运算也都是在EL 中完成,如:
<c:out value="${3+2}-5"/><!--显示"5-5"-->
- JSP 笔记 —— JSTL 标签库
- JSP笔记——JSTL标签
- JSP标准标签库——JSTL
- JSP——JSTL标签库
- JSP标准标签库——JSTL
- JSP学习笔记—EL表达式和JSTL标签详解
- 【jstl】jsp标准标签库——标签使用方法整理
- Allen学习笔记—JSP中JSTL库C标签的使用
- jsp标签库(jstl)
- JSP标签库JSTL
- JSTL笔记—c标签
- [JSTL笔记]—c标签
- JSP标准标签库(JSTL)—— core
- jsp标准标签&jstl标签用法笔记
- JSP——JSTL核心标签(1)
- JSP——JSTL核心标签(2)
- JSP学习——怎样为没有JSTL的项目加上jstl标签库
- 【JSTL】JSP标准标签库(一)——JSTL简介
- 写给Android开发者的Java 8简单入门教程
- 1036: 自由落体问题
- JavaScript 中,num = num || 1 这种写法有哪些优缺点?
- 对HTML语义化的理解
- c#编程实现生成指定范围的不同的随机数
- JSP 笔记 —— JSTL 标签库
- 如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
- 一个新的开始-2017-05-02
- java 多线程
- 1037: 舍罕王的失算
- 史上最全YYModel的使用详解
- Word里千分号怎么打?
- Storm安装配置
- ACM Poj1050 To the Max 求矩阵中局部矩形区域和最大值 java版本