zoukankan      html  css  js  c++  java
  • JavaWeb学习笔记(九)—— JSTL标签库

    一、JSTL概述

    1.1 什么是JSTL

       JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与JSP动作标签一样,只不过它不是JSP内置的标签,需要我们自己导包(jstl-1.2.jar),以及指定标签库而已!

    1.2 JSTL标签库

      JSTL一共包含四大标签库:

    • core:核心标签库,我们学习的重点;
    • fmt:格式化标签库,只需要学习两个标签即可;
    • sql:数据库标签库,不需要学习了,它过时了;
    • xml:xml标签库,不需要学习了,它过时了。

    1.3 使用taglib指令导入标签库

      除了JSP动作标签外,使用其他第三方的标签库都需要:

    • 导包;
    • 在使用标签的JSP页面中使用taglib指令导入标签库;

      下面是导入JSTL的core标签库:

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

      prefix="c":指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库时指定前缀为c;

      uri="http://java.sun.com/jstl/core":指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件;

    二、core标签库

    2.1 if标签

      在程序开发中,经常需要使用if语句进行条件判断,如果要在JSP页面中进行条件判断,就需要使用Core标签库提供的<c:if>标签,该标签专门用于完成JSP页面中的条件判断,它的语法格式为

    <c:if test="testCondition">
        body content
    </c:if>

      在上述语法格式中,可以看到<c:if>标签有三个属性:

    • test:用于存放判断的条件,一般使用EL表达式来编写

    • var:用来存放判断的结果,类型为true或false

    • scopes:用来指定var属性存放的范围,默认值为page。如果属性test的计算结果为true,那么标签体将被执行,否则标签体不会被执行。

    <c:set var="a" value="hello"/>  <%--在page域中创建名为a的变量--%>
    <c:if test="${not empty a}">
        <c:out value="${a}"/>  <%--判断a的变量不为null,没有指定域,表示全域--%>
    </c:if>

    2.2 forEach标签

      forEach标签专门用于迭代集合对象中的元素,如Set、List、Map、数组等,并且能重复执行标签体中的内容。forEach标签的语法格式为:

     <c:forEach var=”name” items=”Collection” varStatus=”StatusName” 
          begin=”begin” end=”end” step=”step”>
        本体内容
    </c:forEach>

      参数解析:
      (1)var设定变量名用于存储从集合中取出元素。
      (2)items一般是从域中取出的集合或数组,与EL表达式一起用
      (3)varStatus设定变量名,该变量用于存放集合中元素的信息。    
      (4)begin、end用于指定遍历的起始位置和终止位置(可选)。
      (5)step指定循环的步长。

      forEach标签有多种两种使用方式:

    • 使用循环变量,指定开始和结束值,类似for(int i = 1; i <= 10; i++) {};
    • 循环遍历集合,类似for(Object o : 集合);

    【模拟普通for】

    <c:set var="sum" value="0" /> 
    <c:forEach var="i" begin="1" end="10"> 
        <c:set var="sum" value="${sum + i}" /> 
    </c:forEach>
    <c:out value="sum = ${sum }"/>
    <c:set var="sum" value="0" />
    <c:forEach var="i" begin="1" end="10" step ="2">
        <c:set var="sum" value="${sum + i}" />
    </c:forEach>
    <c:out value="sum = ${sum }"/>

    【模拟增强for】

    • 遍历List<String>的值
      <%
          // 遍历List<String>
          List<String> strList = new ArrayList<String>();
          strList.add("北京");
          strList.add("上海");
          strList.add("广州");
          request.setAttribute("strList", strList);
      %>
      
      <%--取出strList的数据--%>
      <c:forEach items="${strList}" var="str">
          ${str}<br/>
      </c:forEach>
    • 遍历List<User>的值
      <%
          // 遍历List<User>的值
          List<User> userList = new ArrayList<User>();
          User user1 = new User();
          user1.setId(1);
          user1.setUsername("lisi");
          user1.setPassword("123");
          userList.add(user1);
          User user2 = new User();
          user2.setId(2);
          user2.setUsername("wangwu");
          user2.setPassword("123");
          userList.add(user2);
          application.setAttribute("userList", userList);
      %>
      
      <%--取出userList的数据--%>
      <c:forEach items="${userList}" var="user">
          user的username:${user.username}----------user的password:${user.password}
      </c:forEach>
    • 遍历Map<String,String>的值
      <%
          // 遍历Map<String,String>的值
          Map<String, String> strMap = new HashMap<String, String>();
          strMap.put("name", "zhangsan");
          strMap.put("age", "18");
          strMap.put("addr", "广州");
          session.setAttribute("strMap", strMap);
      %>
      
      <%--取出strMap的数据--%>
      <c:forEach items="${strMap}" var="entry">
          ${entry.key}-----${entry.value}<br/>
      </c:forEach>
    • 遍历Map<String,User>的值
      <%
          User user1 = new User();
          user1.setId(1);
          user1.setUsername("lisi");
          user1.setPassword("123");
          User user2 = new User();
          user2.setId(2);
          user2.setUsername("wangwu");
          user2.setPassword("123");
          // 遍历Map<String,User>的值
          Map<String, User> userMap = new HashMap<String, User>();
          userMap.put("user1", user1);
          userMap.put("user2", user2);
          request.setAttribute("userMap", userMap);
      %>
      
      <%--取出userMap的数据--%>
      <c:forEach items="${userMap}" var="entry">
          ${entry.key}:${entry.value.username}---${entry.value.password}<br/>
      </c:forEach> 

     forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。

    • count:int类型,当前以遍历元素的个数;
    • index:int类型,当前元素的下标;
    • first:boolean类型,是否为第一个元素;
    • last:boolean类型,是否为最后一个元素;
    • current:Object类型,表示当前项目。
    <%--把循环状态赋给vs--%>
    <c:forEach items="${ns}" var="item" varStatus="vs">
        <%--如果是第一行,那么${vs.first}为true--%>
        <c:if test="${vs.first}">第一行</c:if>
        <%--如果是最后一行,那么${vs.last}为true--%>
        <c:if test="${vs.last}">最后一行</c:if>
        <%--返回行数,从1开始--%>
        <c:out value="第${vs.count}行:"/>
        <%--返回行数,从0开始--%>
        <c:out value="[${vs.index}]:"/>
        <%--当前项,与${item}相同--%>
        <c:out value="name:${vs.current}"/>
    </c:forEach>

    2.3 out标签

      out标签用来输出数据对象(字符串、表达式)的内容或结果。

    <c:out value=”aaa”/>

    输出aaa字符串常量

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

    与${aaa}相同

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

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

    <%

    request.setAttribute("a","<script>alert('hello');</script>");

    %>

    <c:out value="${a }" default="xxx" escapeXml="false" />

    当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。

    2.4 set标签

      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的数据。

    2.5 remove标签

             <%

                      pageContext.setAttribute("a", "pageContext");

                      request.setAttribute("a", "session");

                      session.setAttribute("a", "session");

                      application.setAttribute("a", "application");

             %>

             <c:remove var="a"/>

             <c:out value="${a }" default="none"/>

    删除所有域中name为a的数据!

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

    删除pageContext中name为a的数据!

    2.6 url标签

    <c:url value="/"/>

    输出上下文路径:/day08_01/

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

    把本该输出的结果赋给变量a。范围为request

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

    输出:/day08_01/AServlet

    <c:url value="/AServlet">

    <c:param name="username" value="abc"/>

    <c:param name="password" value="123"/>

    </c:url>

    输出:/day08_01/AServlet?username=abc&password=123

    如果参数中包含中文,那么会自动使用URL编码!

    2.7 choose标签

      choose标签对应Java中的if/else if/else结构。when标签的test为true时,会执行这个when的内容。当所有when标签的test都为false时,才会执行otherwise标签的内容。

    <c:set var="score" value="${param.score }"/>
    <c:choose>
        <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when> 
        <c:when test="${score >= 90 }">A级</c:when> 
        <c:when test="${score >= 80 }">B级</c:when>
        <c:when test="${score >= 70 }">C级</c:when>
        <c:when test="${score >= 60 }">D级</c:when>
        <c:otherwise>E级</c:otherwise> 
    </c:choose>

    三、fmt库

      fmt标签库是用来格式化输出的,通常需要格式化的有时间和数字。

    3.1 格式化时间

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    ......
    <%
        Date date = new Date();
        pageContext.setAttribute("d", date);
    %>
    <fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss "/>

    3.2 格式化数字

    <%
        double d1 = 3.5;
        double d2 = 4.4;
        pageContext.setAttribute("d1", d1);
        pageContext.setAttribute("d2", d2);
    %>
    <%--必须且仅能保留两位小数,如果大于两位,那么只保留两位,并四舍五入,如果小于两位,那么使用0补足两位。--%>
    <fmt:formatNumber value="${d1 }" pattern="0.00 "/><br/>
    <%--最多显示两位,如果小于两位,那么有几位保留几位,不会用0补足。大于两位,只保留两位,并四舍五入!--%>
    <fmt:formatNumber value="${d2 }" pattern="#.## "/>
  • 相关阅读:
    tuple 元组及字典dict
    day 49 css属性补充浮动 属性定位 抽屉作业
    day48 选择器(基本、层级 、属性) css属性
    day47 列表 表单 css初识
    day 46 http和html
    day 45索引
    day 44 练习题讲解 多表查询
    day 40 多表查询 子查询
    day39 表之间的关联关系、 补充 表操作总结 where 、group by、
    day38 数据类型 约束条件
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10489696.html
Copyright © 2011-2022 走看看