JSTL标签库

1.JSTL简介
JSTL(JSP Standard Tag Library,JSP标准标签库)是Sun公司开发的一套用于JSP页面中的标签库,使用JSTL可以在页面中实现一些简单的逻辑,从而替换页面中的Java代码。JSTL通常也会配合EL表达式一起使用,Sun公司的JSTL标签库封装了大量的方法。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。
2.JSTL标签使用准备
(1)导入相应的Jar包和添加taglib指令
在使用JSTL标签之前,需要下载JSTL标签库的两个Jar包(jstl.jar和standard.jar),下载后将其复制到Tomcat主目录/WEB-INF/lib目录下,如下图所示。

这里写图片描述
在需要使用JSTL标签库的JSP页面中添加如下tablic指令(JSTL核心标签指令):

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

完成了上面的两步之后,就可以使用JSTL开发JSP页面了。
(2)了解JSTL标签库
JSTL标签库由多个子标签库组成,例如core标签库、format 标签库、xml标签库、sql标签库和JSTL函数等。其中core核心标签库在JSTL中占有十分重要的地位,它提供了定制操作,通过限制作用域的变量管理数据,以及执行页面内容的条件和迭代操作。
JSTL核心标签库中有14个标签,从功能上可分为四类。
表达式控制标签:set标签、out标签、remove标签、catch标签。
流程控制标签:if标签、choose标签、when标签、otherwise标签。
循环迭代标签:forEach标签、forTokens标签。
URL操作标签:import标签、url标签、param标签、redirect标签。
上述的14个JSTL核心标签并不是都会经常用到,由于本书篇幅的限制,再加上从实用性来说,表达式标签中的set标签、out标签、remove标签,所有的流程控制标签,循环迭代标签中的forEach标签会经常用到,下面将对这些常用标签进行详述,其他的标签很少用到,读者可自行学习。
2 表达式控制标签
表达式控制标签用于在JSP页面定义、显示和删除变量,下面介绍常用的三个标签,未做介绍的catch标签主要是用来处理JSP页面中的产生的异常,并存储异常信息。
(1)set标签
set标签用于设置变量值和对象属性。可以计算表达式的值,然后使用计算结果来设置JavaBean对象或java.util.Map对象的值,其语法格式如下:

<c:set var="变量名" value="变量值" scope="JSP作用域范围"/>
<c:set target="对象名" property="属性名" value="属性值"/>

该语法也可以写成下面的格式,类似的情况后面将不在阐述。

<c:set var="变量名"  scope="JSP作用域范围">变量值</c:set>
<c:set target="对象名" property="属性名">属性值</c:set>

第一行代码是定义一个在指定JSP作用域范围内的对象,第二行代码是给某个对象的的其中一个属性设置值。其中JSP作用域可选范围包括page(默认)、request、session和application。下面的例子,演示了set标签的使用。(仅列出taglib指令和body部分的代码)

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="num" value="${5+1}" scope="session"/>
<c:set target="${requestScope.user}" property="userName"               value="jack"/>

此例子中,将变量num的值设置为5+1=6,在session范围内有效,并将request范围内的user对象的userName属性的值设为jack。
(2)out标签
out标签用来显示一个表达式的结果,其语法格式如下:

<c:out value="变量名/属性名" default="默认值" escapeXml="是否忽略XML特殊字符"/>

其中default是指定变量名或属性名的默认值(也可以没有default属性),escapeXml是指是否忽略XML特殊字符(也可以没有escapeXml属性,默认为true)。例如:

<c:out value="${requestScope.num}"/>
<c:out  value="${requestScope.user.userName}" default="noName"/>

分别输出了request范围内的num值和user对象中的userName属性值,默认为noUserName。再看看下面的例子(仅列出taglib指令和body部分的代码),显示结果会是什么?

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="num" value="${5+1}" scope="session"/>
<c:out value="${requestScope.num}" default="10"/>

执行该JSP页面,显示的结果是10,原因是num为session范围内的变量,而显示的request范围内的num变量,所以显示的是默认值。
(3)remove标签
顾名思义,remove标签是移除指定范围内变量的标签,其语法格式如下:

<c:remove var="变量名" scope="JSP作用域范围"/>

其中,scope属性可以省略,如果要移除上例中的session范围内的num变量,其代码如下:

<c:remove var="num" scope="session"/>

3 流程控制标签
(1)if标签
在JSTL中,提供了if条件标签来处理类似于Java中的if判断语句的逻辑,其语法格式如下:

<c:if test="判断条件" var="name" scope="JSP作用域范围">
    ...
</c:if>

其中,当判断条件为真时,会执行其省略号中的代码。var属性定义变量,改变量存放判断之后的结果,可以省略;scope属性指定var定义的变量的作用域的范围,也可以省略。在下面的例子中,改代码的作用是判断变量name的值,如果是admin则显示输出的值。

<c:if test="${name=='admin'}">
    <c:out value="Welcome,admin!"/>
</c:if>

(2)choose、when和otherwise标签
一般情况下,这三个标签是同时使用的,其中choose标签作为when标签和otherwise标签的父标签来使用,这三个标签配合起来使用的作用类似于Java中的switch…case…语句。下面看一个简单的实例,来看一下这三个标签是如何使用的。

<%@ page language="java" contentType="text/html; charset=utf-8"             pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
    <c:set var="score">85</c:set>
    <c:choose>
        <c:when test="${score>=95}">
            成绩非常优秀,继续保持!
        </c:when>
        <c:when test="${score>=80&&score<95}">
            成绩优秀,保持进步!
        </c:when>
        <c:when test="${score>=70&&score<80}">
            成绩良好,继续努力!
        </c:when>
        <c:when test="${score>=60&&score<70}">
            刚好及格,多多努力!
        </c:when>
        <c:otherwise>
            不好意思,不及格!
        </c:otherwise>
    </c:choose>
</body>
</html>

运行该JSP页面,显示结果是“成绩优秀,保持进步!”
4 .forEach迭代标签
在使用JSP进行页面的开发时,迭代是经常碰到的操作。例如在user_list.jsp页面中需要显示所有用户的信息,在employee_list页面中需要显示所有员工的信息。在之前编写的页面中,都是使用Java代码中的循环,迭代输出集合中的内容。接下来,要使用JSTL中的forEach标签,简化迭代的操作,forEach标签的语法格式如下:

<c:forEach items="集合对象" var="name" varStatus="statusName"           begin="start" end="end" step="count">
        ...
</c:forEach>

Items属性:指定要遍历的集合对象。
var属性:对当前成员的引用,即如果当前迭代到第一个成员,那么var属性定义的变量就引用第一个对象;如果当前迭代到第二个成员,则该变量名引用第二个成员,以此类推。
varStatus属性:描述迭代的当前状态,例如statusName.index表示这次迭代的索引(从0开始),该属性可以省略。
begin属性:表示从集合的第几位开始,默认为0,该属性可以省略。
end属性:表示迭代到集合的第几位结束,该属性可以省略。
step属性:表示迭代的步长,默认为1,该属性可以省略。
forEach迭代案例一,此案例演示了forEach标签中各属性的作用,具体代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"             pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
    <%
        List<String> hobbies = new ArrayList<String>();
        hobbies.add("运动");
        hobbies.add("听歌");
        hobbies.add("旅游");
        hobbies.add("上网");
        hobbies.add("学习");
        hobbies.add("购物");
        request.setAttribute("hobbies", hobbies);
    %>
    <h3><c:out value="迭代整个集合"/></h3>
    <c:forEach items="${hobbies}" var="hobby">
        &nbsp;&nbsp;<c:out value="${hobby}"/>
    </c:forEach>
    <h3><c:out value="指定begin=1、end=5和step=2的迭代:"/></h3>
    <c:forEach items="${hobbies}" var="hobby" begin="1" end="5"                step="2">
        &nbsp;&nbsp;<c:out value="${hobby}"/>
    </c:forEach>
    <h3><c:out value="指定begin=0、end=4和step=3的迭代,输出              varStatus的信息:"/></h3>
    <c:forEach items="${hobbies}" var="hobby" varStatus="status"               begin="0" end="4" step="3">
        <c:out value="${hobby}"/>的属性:<br>
            当前这次迭代的项:<c:out     value="${status.current}"/>
            所在位置,即索引:<c:out value="${status.index}"/>
            总共已迭代的次数:<c:out value="${status.count}"/>
            是否为第一个位置:<c:out value="${status.first}"/><br>
            是否为最后一个位置:<c:out value="${status.last}"/>
            begin属性值:<c:out value="${status.begin}"/>
            end属性值:<c:out value="${status.end}"/>
            step属性值:<c:out value="${status.step}"/>
            <br><hr>
    </c:forEach>
</body>
</html>

运行该JSP页面,结果如下图所示。读者可对照显示结果,明确forEach标签中各属性的作用。
这里写图片描述
forEach迭代案例二,此案例更偏向于实际应用,使用forEach标签显示user_list.jsp页面中全部用户信息,并通过varStatus属性值来改变表格中偶数行的背景色,完整代码如下:

<%@ page import="java.util.*,com.it.chapter6.Entity.User"               language="java" contentType="text/html; charset=utf-8"              pageEncoding="utf-8"%>**重点内容**
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
    <%
        //用户对象User包括用户ID:id、姓名:name、手机号:phone
        User user1 = new User("1","Michael","15629168655");
        User user2 = new User("2","Jacky","13425162567");
        User user3 = new User("3","Kobe","17747382758");
        List<User> userList = new ArrayList<User>();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        request.setAttribute("userList", userList);
    %>
    <table border="1">
        <caption>用户信息表</caption>
        <tr>
            <th>用户ID</th>
            <th>姓名</th>
            <th>手机号</th>
        </tr>
        <c:forEach items="${requestScope.userList}" var="user"                     varStatus="status">
        <tr <c:if                                                           test="${status.index%2==1}">style="background-color:rgb(224,224,2  24)"</c:if>>
            <td>${user.id}</td>
            <td>${user.name}</td>
            <td>${user.phone}</td>
        </tr>
        </c:forEach>
    </table>
</body>
</html>

运行该JSP页面,显示结果如下图所示。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值