JSTL标签库

来源:互联网 发布:加盟淘宝店需要多少钱 编辑:程序博客网 时间:2024/06/10 04:51

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页面,显示结果如下图所示。
这里写图片描述

原创粉丝点击