JSTL概述

什么是JSTL

JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL是apache对EL表达式的扩展(也就是说jstl依赖于EL表达式),JSTL是标签库语言,使用起来非常方便。与jsp动作标签一样,只不过它不是jsp的内置标签。需要导包后才能使用。在用myEclipse时创建项目需要加上jstl的jar包。使用的时候需要在jsp中使用taglib标签导入jar包。

JSTL构成

JSTL标签库一共有四大标签库,这里主要对其中两个做简要介绍
* core : 核心标签库(重点)
* fmt : 格式化标签库(只学习其中一部分常用标签)

JSTL标签库的导入

使用taglib导入指令标签库
* 导包taglib
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
* prefix=”c”,指定标签库的前缀,一般用c代表JSTL的核心标签库。
* uri=“…” 不是url,uri是一个标签的唯一性标识,不一定是真实网络地址,但是它可以让jsp、找到标签库的描述文件。

core标签库的常用标签

out和set

  • out用法

用法

功能

<c:out value="${aaa}"/>

输出aaa字符串常量

<c:out value=”${aaa}”/>

在四大域范围内查找,找不到不显示任何信息

<c:out value="${aaa}" dafault="xxx"/>

当${aaa}不存在时,输出xxx字符串

<%request.setAttribute("","");%><c:out value="${a}" default="xxx" escapeXml="false"/>当escapeXml为false,不会转换”<”,”>”。
* set用法

用法

功能

<c:set var=”a” value=”hello”/>

在pageContext中添加name为a,value为hello的域参数

<c:set var="a" value="hello" scope="session"

在session中添加name为a,value为hello的数据。

* remove用法
jsp给几个域对象设置属性

<%
        pageContext.setAttribute("a", "pageContext");
        request.setAttribute("a", "session");
        session.setAttribute("a", "session");
        application.setAttribute("a", "application");
    %>

用法

功能

<c:remove var="a"/>

移除所有域中name为a的数据

<c:remove var="a" scope="page"/>

删除pageContext中name为a的数据

* url用法

用法

功能

<c:url value="/"/>

输出上下文路径

<c:url value="/" name="a" scope="request"/>

把本该输出的结果赋给变量a,作为request的域属性

<c:url value="/AServlet"/>

输出/myapp/AServlet

<c:url value="/AServlet">
<c:param name="username" value="abc"/>
<c:param name="password" value="123"/>
</c:url>

输出:

/myapp/AServlet?username=abc&password=123
  • if用法
    if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。
<c:set var="a" value="hello"/>
    <c:if test="${not empty a}">
        <c:out value="${a}"/>
    </c:if>
  • choose用法
    choose标签对应java中if/else结构。当when标签中的test为true时,会执行这个when中的内容,当所有when标签的test值都为false时,执行otherwise标签中的内容。
<h3>演示choose标签</h3>
        <br/> A 90-100  B 60-90  C<60   <br/> 
                  如果0>score||score>100  错误的分数    <br/>
    <br/>
    <c:set var="score" value="99"/>
    <c:choose>
        <c:when test="${score>90&&score<=100}">
            A
        </c:when>
        <c:when test="${score>60&&score<=90}">
            B
        </c:when>
        <c:when test="${0<score&&score<=60}">
            C
        </c:when>
        <c:otherwise>
            这是错误的分数
        </c:otherwise>
    </c:choose>
  • forEach循环
    forEach可以分为两种
  • 使用循环变量,指定开始和结束值,for(int i=1;i<=10;i++){….}
  • 循环遍历集合,类似for(Object o: 集合){…}
    循环变量:
<body>
    求和:
    <c:set var="sum" value="0"/>
    <c:forEach var="i" begin="1" end="10">
        <c:set var="sum" value="${sum+i}"/>
        <c:out value="${sum}"></c:out>
    </c:forEach><br/>

    <c:set var="sum2" value="0"/>
    <c:forEach var="i" begin="1" end="10" step="3">
        <c:set var="sum2" value="${sum2+i}"/>
        <%-- <c:out value="${i}"></c:out> --%>
        <c:out value="${sum2}"></c:out>
    </c:forEach>
</body>

遍历集合
便利map(key,value)

<body>
    <%
        Map<String,String> map=new HashMap<String,String>();
        map.put("name1", "zhangsanfeng1");
        map.put("name2", "zhangsanfeng2");
        map.put("name3", "zhangsanfeng3");
        map.put("name4", "zhangsanfeng4");
        request.setAttribute("map1",map);
    %>  
//items:存放在域空间中的集合
//var:forEach会对该集合进行遍历,每遍历一次,都会取出该集合中一个对象,
//item :当前遍历出的对象取的对象名称,可以随便取名,但是需要注意:
//该值必须和key与value前的值一致
    <c:forEach var="item" items="${map1}">
        ${item.key}:${item.value}<br/>
    </c:forEach>    
  </body>

遍历数组和list
User为一个JavaBean类,具体代码不再给出

<h3>遍历数组</h3>
    <% 
        String[] str={"zhansan","lisi","wangwu","zhaoliu"};
        request.setAttribute("arr",str);
    %>

    <c:forEach var="item" items="${arr}">
        ${item}<br/>
    </c:forEach>

    <h3>遍历list</h3>
    <%
        List<String> list=new ArrayList<String>();
        list.add("l1");
        list.add("l2");
        list.add("l3");
        list.add("l4");
        request.setAttribute("arrayList", list);
    %>

    <c:forEach var="a" items="${arrayList}">
        ${a}<br/>
    </c:forEach>

    <%  
        List<User> uList=new ArrayList<User>();
        uList.add(new User("01","张无忌","123","男","20","倚天屠龙记"));
        uList.add(new User("02","杨过","123","男","20","神雕侠侣"));
        uList.add(new User("03","郭靖","123","男","20","射雕英雄传"));
        uList.add(new User("04","小龙女","123","女","20","射雕英雄传"));
        uList.add(new User("05","熊二","123","男","20","熊出没"));
        request.setAttribute("uList", uList);
    %>
    <hr>
    <table cellpadding="0" cellspacing="0" border="1" width="90%" align="center">
        <tr>
            <th width="120px;">用户编号</th>
            <th width="120px;">用户姓名</th>
            <th width="120px;">用户密码</th>
            <th width="120px;">用户性别</th>
            <th width="120px;">用户年龄</th>
            <th width="120px;">用户地址</th>
            <th width="60px;">增加</th>
            <th width="60px;">删除</th>
            <th width="60px;">修改</th>
            <th width="60px;">查看</th>
        </tr>
        <c:forEach var="user" items="${uList}">
            <tr align="center">
                <td>${user.id }</td>
                <td>${user.username}</td>
                <td>${user.password}</td>
                <td>${user.sex}</td>
                <td>${user.age}</td>
                <td>${user.address}</td>
                <td><a href="javascript:void(0);">增加</a></td>
                <td><a href="javascript:void(0);">删除</a></td>
                <td><a href="javascript:void(0);">修改</a></td>
                <td><a href="javascript:void(0);">查看</a></td>
            </tr>
        </c:forEach>
    </table>

Foreach标签还有一个属性,varstatus,这个属性用来接收“循环状态”的变量名,例如
vs.count从1开始{vs.index}从0开始
vs.first判断是否第一行{vs.last}判断是否最后一行
具体用法如下

<body>
    <hr>    
    <h3>遍历list</h3>
    <%
        List<String> list=new ArrayList<String>();
        list.add("l1");
        list.add("l2");
        list.add("l3");
        list.add("l4");

        request.setAttribute("arrayList", list);
    %>

    <c:forEach var="a" items="${arrayList}" varStatus="vs">
        ${a}<br/>
        第${vs.count}行  <br/>   
        该行索引为${vs.index}<br/>
        <c:if test="${vs.first}">第一行</c:if> <br/>
        <c:if test="${vs.last}">最后一行</c:if> <br/>
    </c:forEach>
  </body>

fmt:格式化标签库

fmt标签库用来格式化输出的,通常需要格式化的有时间还有数字
该 标签库需要先导入才能使用,导入方法如下
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<body>
    <h3>格式化时间</h3>
    <%
        Date date=new Date();
        request.setAttribute("date", date);
    %>
    <fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"/>
    <%
        double d1=30.5;
        double d2=4.00000;
        pageContext.setAttribute("d1", d1);
        pageContext.setAttribute("d2", d2);
    %>
    <hr>
    <br/>
    <!--必须保留两位小数:如果大于2位,那么只保留两位,并四舍五入,如果小于两位,那么用0补足  -->
    <fmt:formatNumber value="${d1}" pattern="0.00"/><br/>
    <!--小数位:有几个#号最多显示几位小数;如果小于两位,那么有几位保留几位,不会用0补足;
大于两位,只保留两位,四舍五入  ;为整数则只保留整数-->
    <fmt:formatNumber value="${d2}" pattern="#.##"/>
  </body>