JSTL 全称为JSP Standard Tag Library 即JSP标准标签库。JSTL作为最基本的标签库,提供了一系列的JSP标签,实现了一系列的JSP标签,实现了基本的功能:集合的遍历、数据的输出、字符串的处理、数据的格式化等等。
EL表达式,可以很方便地引用一些JavaBean以及其属性,不会抛出NullPointerException之类的错误。但是,EL表达式非常有限,它不能遍历集合,做逻辑的控制。这就需要JSTL的支持了。
Scriptlet的可读性,维护性,重要性都十分差。JSTL与HTML代码十分类似,遵循着XML标签语法,使用JSTL让JSP页面显得整洁,可读性非常好,重用性非常高,可以完成复杂的功能。
使用JSTL标签库步骤:
- 导入jstl.jar和standard.jar开发包
- 在JSP页面中用tablib指令引入需要使用的JSTL标签
core标签库
- core标签库是JSTL的核心标签库,实现了最基本的功能:流程控制,迭代输出等操作
- core标签库的前缀一般是c
c:out

<% session.setAttribute("name","jack"); %> //<c:out/>标签支持标签体,default属性上的数据可以写在标签体重 //<c:out value="${name}" escapeXML="true">没有找到相关的数据</c:out> <c:out value="${name}" default="没有找到相关的数据" escapeXml="true"></c:out>
上面的代码实现的效果和EL表达式是一样的,它出色的地方就多了两个属性,default和escapeXML属性。
c:set

var属性操作的是Integer、Double、Float、String等类型的数据,target属性操作的是JavaBean或Map对象的数据,scope代表的是web域,value是值property是对象的属性。
使用var属性
既然var属性只能操作Integer、Double、String等类型,那么存在var属性就一定没有property属性(property代表的是对象的成员属性,而Integer、String这些类型没有成员变量)
<c:set var="name" value="tom" scope="page"></c:set> ${name}
set标签支持标签体,value的值可以写在标签体里边
<c:out var="name" scope="page">tom</c:out>
使用var属性和scope属性实现计数器
<% Integer sessionCount=0; Integer applicationCount=0; %> <c:set var="sessionCount" value="${sessionCount+1}" scope="session"/> <c:set var="applicationCount" value="${applicationCount+1}" scope="application"/> 你一共访问了该页面:${sessionCount}<br> 该页面一共被访问:${applicationCount}
效果

使用target属性
- 使用target属性与之配对的是property属性,target属性只能操作JavaBean或Map对象,property就是对应的成员变量或key。
- 既然target属性操作的是JavaBean或Map对象,那么一定是通过EL表达式来获取到对象了。target属性如果获取不到数据就会抛出异常。使用target属性就一定没有scope属性(scope属性代表的是保存范围,target的值都是获取来的)
<%--创建JavaBean对象,设置为session范围的属性--%> <jsp:useBean id="person" class="com.company.Person" scope="session"/> <%--获取到person对象,设置name属性的值为32--%> <c:set target="${person}" property="name" value="john"/> ${person.name}
效果:

c:remove
c:remove标签就相当简单了,只有var和scope属性,代表的是删除域范围的属性。
<%--创建JavaBean对象,设置为session范围的属性--%> <jsp:useBean id="person" class="com.company.Person" scope="session"/> <%--获取到person对象,设置name属性的值为32--%> <c:set target="${person}" property="name" value="john"/> ${person.name} <br> <c:remove var="person" scope="session"/> ${person.name==null?"已删除":"还存在"}
效果:

c:catch
该标签主要用来处理程序中产生的异常,catch标签也十分简单,只有一个var属性,var属性封装了异常的信息。
<%--创建JavaBean对象,设置session范围--%> <jsp:useBean id="person" class="com.company.Person" scope="session"/> <c:catch var="message"> <%--target属性只能是EL表达式,否则获取不到对象,肯定会抛出异常--%> <c:set target="person" property="name" value="jack.ma"></c:set> </c:catch> ${message}
效果:

c:if

JSTL提供了if标签完成分支语句的实现,test属性是不可或缺的。
<%--参数含有name,且对应的值为jack.ma,就显示--%> <c:if test="${param.name=='jack.ma'}"> ${"这个小伙子很帅"} </c:if>
效果:

c:choose
if标签没有else标签的功能,如果需要类似于java中if else流程就需要使用choose标签
choose标签需要联合when和otherwise标签一起使用
<c:choose> <c:when test="${param.name=='jack.ma'}"> ${"helle,jack.ma"} </c:when> <c:when test="${param.name=='pony.ma'}"> ${"hello,pony.ma"} </c:when> <c:otherwise> ${"我不认识你"} </c:otherwise> </c:choose>
效果:

c:forEach

forEach为循环标签,相当于Java中的while和for
<% List list=new ArrayList(); list.add("jack.ma"); list.add("pony.ma"); list.add("leijun"); <%--向session中设置属性,属性的类型是List集合--%> session.setAttribute("list",list); %> <%--遍历session属性中的List集合,items:迭代的集合,var:当前迭代的元素--%> <c:forEach var="name" items="${list}"> ${name}<br> </c:forEach>
效果:

遍历Map对象有稍微地不一样,var属性保存的不是每个迭代的对象,而是Map.Entry
<% Map map=new HashMap(); map.put("1","jack.ma"); map.put("2","pony.ma"); map.put("3","leijun"); session.setAttribute("map",map); %> <c:forEach var="mapEntry" items="${map}"> ${mapEntry} ${mapEntry.key} ${mapEntry.value}<br> </c:forEach>
效果:

begin 默认从0开始,end默认为集合的最后一个元素,step默认为1。
varStatus代表着当前对象被迭代的信息,它有以下的属性:
- index【返回当前是第几个对象,从0开始计数】
- count【已经遍历多少个对象了,从1开始计数】
- first【是否是第一个】
- last【是否是最后一个】
- current【当前被迭代的对象】
- begin【开始的位置】
- end【最后的位置】
- step【步长】
<% List list=new ArrayList(); list.add("jack.ma"); list.add("pony.ma"); list.add("leijun"); session.setAttribute("list",list); %> <c:forEach var="name" items="${list}" varStatus="varStatus"> ${name} ${varStatus.index} ${varStatus.count}<br> </c:forEach>
效果:

c:forTokens
该标签类似于String类的split()和for循环的一种集合,它与forEach标签非常相似,都有begin,end,step,items,var,varStatus属性,不同的是forTokens标签的items属性里面是字符串,这个字符串会被delims属性的内容分割成多个字符串。
<c:forTokens var="name" items="jack.ma,pony.ma,leijun" delims=","> ${name}<br> </c:forTokens>
效果:

c:import
import标签类似于JSP行为<jsp:include/>和JSP指令<%include>
import标签的属性:
- url【指定要包含的路径,Internet所有的url都可以】
- context【访问同一个web容器的其他资源,以"/"开头】
- var【保存导入的文件的内容,以String类型存储】
- scope【保存的范围,默认是page】
- charEncoding【字符编码】
- varReader【保存导入文件的内容,以Reader类型存储】
imort标签功能更强大,imort标签可引入Internet网页上的内容。
<c:import url="https://www.csdn.net" charEncoding="UTF-8"></c:import>
打印csdn的源代码
<c:import url="https://www.csdn.net" charEncoding="UTF-8" var="net"/> csdn的源代码:<br><br> <c:out value="${net}" escapeXml="true"></c:out>
效果:

当url中的网址错误,程序就会保存。
c:param
- 在JSP页面进行URL的相关操作时,经常在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>,<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
- <c:param>标签在为一个URL地址附加参数时,将自动对参数进行URL编码,如:传递的参数值为“中国”,则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面,这也就是使用<c:param>标签的最大好处。
c:url
url标签十分实用,在浏览器禁用Cookie的时候,解决方法是:response。encodeURL()。url标签也可以实现这样的功能,再配合param标签使用,就十分实用。

<c:url var="url" value="page.jsp"> <c:param name="name" value="中国"> </c:param> </c:url> <a href="${url}"> 我是经过URL地址重写 </a>
效果:

c:redirect
redirect标签用于实现Redirect功能,此标签页能够配合param标签使用。

<c:redirect url="head.jsp"> <c:param name="name" value="中国"> </c:param> </c:redirect>
效果:

fmt标签库
fmt标签库也叫做国际化标签库
fn方法库
fn方法库也叫做EL函数库,fn函数库。
posted on
浙公网安备 33010602011771号