JSTL 全称为JSP Standard Tag Library 即JSP标准标签库。JSTL作为最基本的标签库,提供了一系列的JSP标签,实现了一系列的JSP标签,实现了基本的功能:集合的遍历、数据的输出、字符串的处理、数据的格式化等等。

        EL表达式,可以很方便地引用一些JavaBean以及其属性,不会抛出NullPointerException之类的错误。但是,EL表达式非常有限,它不能遍历集合,做逻辑的控制。这就需要JSTL的支持了。

        Scriptlet的可读性,维护性,重要性都十分差。JSTL与HTML代码十分类似,遵循着XML标签语法,使用JSTL让JSP页面显得整洁,可读性非常好,重用性非常高,可以完成复杂的功能。

使用JSTL标签库步骤:

  1. 导入jstl.jar和standard.jar开发包
  2. 在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标签的属性:

  1. url【指定要包含的路径,Internet所有的url都可以】
  2. context【访问同一个web容器的其他资源,以"/"开头】
  3. var【保存导入的文件的内容,以String类型存储】
  4. scope【保存的范围,默认是page】
  5. charEncoding【字符编码】
  6. 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 2019-06-22 20:26  会飞的金鱼  阅读(148)  评论(0)    收藏  举报