JSTL标签库

  • 什么是JSTL
    • 是标签语言,是apache对EL表达式的扩展。
  • JSTL四大标签库
    • core:核心标签库
      • <c:out>输出
        <%-- 导入标签库 --%>
        <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        
        <%
            String data = "fat rabbit";
            pageContext.getRequest().setAttribute("data", data);
        %>
        <%-- value可以是字符串常量,也可以是EL表达式 --%>
        <%-- escapeXml默认为true,若为false不转义,原样输出 --%>
        <c:out value="${data}" escapeXml="false"></c:out>
      • <c:set>创建/设置域属性
        <%-- 导入标签库 --%>
        <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

        <c:set var="data" value="fat rabbit" scope="request"></c:set>
        <%--escapeXml默认为true,若为false不转义,原样输出 --%>
        <c:out value="${data}" escapeXml="false"></c:out>
      •  <c:remove>删除域变量
        <%-- 导入标签库 --%>
        <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        <%-- 若不指定scope,则表示删除所有域中的该名称的变量,若指定,则指删除指定域中该名称的变量 --%>
        <c:remove var="data" scope="request"></c:remove>
      • <c:url>指定一个路径,它会在路径前面自动添加项目名
        <%-- 导入标签库 --%>
        <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        <%-- 若添加var属性,则url标签就不会输出内容到页面,而是生成url保存到域中 --%>

        <c:url value="/index.jsp" var="f"></c:url>

        <%-- 带参数的 --%>
        <c:url value="/index.jsp">
        <c:param name="isLogin" value="true"></c:param>
        </c:url>
      • <c:if>
        <%-- 导入标签库 --%>
        <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

        <c:if test="${empty param.data}"> data数据为null </c:if>
      • <c:choose>
        <%-- 导入标签库 --%>
        <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

        <c:choose > <c:when test="${empty param.data}"> data数据为null </c:when> <c:otherwise> data数据中有数据啦 </c:otherwise> </c:choose>
      • <c:foreach>
        <%-- 导入标签库 --%>
        <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

        <c:forEach var="i" begin="1" end="10"> ${i} </c:forEach>

        <%-- 类似于高级for的使用 --%>
        <%
        char[] datas = {'f','a','t','r','a','b','b','i','t'};
           pageContext.getRequest().setAttribute("datas",datas);
        %>
        <%-- items指定要循环的对象,可以是数组或集合。 --%>
        <%-- var创造变量,循环遍历获取items中每个值赋值给变量--%>
        <c:forEach items="${datas}" var="data">
        ${data}
        </c:forEach>

        <!-- varStatus是创建一个循环状态变量 -->
        <c:forEach items="${datas}" var="data" varStatus="vs">
        <!-- 循环元素的个数 -->
        count= ${vs.count}
        <!-- 循环元素的下标 -->
        index= ${vs.index}
        <!-- 是否为第一个元素 -->
        first=${vs.first}
        <!-- 是否为最后一个元素 -->
        last=${vs.last}
        <!-- 当前元素 -->
        current=${vs.current}<br/>
        </c:forEach>
    • fmt:格式化标签库
      • <%-- 导入标签库 --%>
        <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
        
        <%
            Date date = new Date();
            pageContext.getRequest().setAttribute("date",date);
        %>
        <%-- ftm标签库是用来格式化输出的,通常需要格式化的有时间、数字 --%>
        <%-- value指定一个Date类型的变量,pattern指定输出的模版 --%>
        <fmt:formatDate value="${requestScope.date}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>

        <%
        double num = 8.2389123;
        pageContext.getRequest().setAttribute("data",num);
        %>
         
        <%-- 两者都会四舍五入,区别在于前者如果不足位会以0位,后者不补,有几位补几位--%>
        <fmt:formatNumber value="${requestScope.data}" pattern="0.00 "></fmt:formatNumber>
        <fmt:formatNumber value="${requestScope.data}" pattern="#.## "></fmt:formatNumber>
         
    • sql:数据库标签库
    • xml:xml标签库
  • 自定义标签
    •   
      /**
       * 实现标签处理类(1)
       */
      
      public class TestTag implements SimpleTag {

      private PageContext pageContext;
      private JspFragment jspFragment;

      /**
      * 每次执行标签时就会调用这个方法
      * @throws JspException
      * @throws IOException
      */
      @Override
      public void doTag() throws JspException, IOException {

      System.out.println("fat rabbit");
      }

      /**
      * 设置父标签
      * @param jspTag
      */
      @Override
      public void setParent(JspTag jspTag) {

      }

      /**
      * 返回父标签
      * @return
      */
      @Override
      public JspTag getParent() {
      return null;
      }

      /**
      * 设置jsp上下文对象,pageContext继承他
      * @param jspContext
      */
      @Override
      public void setJspContext(JspContext jspContext) {
      this.pageContext = (PageContext) jspContext;
      }

      /**
      * 设置标签体
      * @param jspFragment
      */
      @Override
      public void setJspBody(JspFragment jspFragment) {
      this.jspFragment = jspFragment;
      }
      }
      
      
      /**
      * 实现标签处理类(2),一般写标签处理类都继承SimpleTagSupport
      * SimpleTagSupport实现了SimpleTag接口
      * 提供了get方法供子类调用
      */
      public class TestTag extends SimpleTagSupport {

      @Override
      public void doTag() throws JspException, IOException {

      //获取当前页面的输入流
      Writer out = this.getJspContext().getOut();
      //执行标签体内容,把结果写到指定的流中
      out.write("______________________________________________________________________________<br/>");
      this.getJspBody().invoke(out);
      out.write("______________________________________________________________________________<br/>");

      }
      }


      <!-- tld文件一般都放到WEB-INF之下,这样保证客户端访问不到,一个tld文件可以部署多个标签 -->
      <?xml version="1.0" encoding="UTF-8" ?>
      <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
      version="2.0">

      <!-- -->
      <tlib-version>1.0</tlib-version>
      <!-- -->
      <short-name>muriel</short-name>
      <!-- -->
      <uri>http://www.muriel.cn/el.functions</uri>

      <tag>
      <!-- 标签名 -->
      <name>testTag</name>
      <!-- 标签处理类 -->
      <tag-class>com.muriel.tag.TestTag</tag-class>
      <!--
      标签体
      empty:无标签体
      tagdependent:只能是EL表达式,也可以是其他标签
      scriptless:标签体内容不会被执行,而是直接赋值标签处理类
      -->
      <body-content>scriptless</body-content>

      </tag>
      </taglib>



      <%-- 导入标签库 --%>
      <%
      String data = "fat rabbit";
      pageContext.getRequest().setAttribute("data", data);
      %>
      <t:testTag>
      ${data}<br/>
      </t:testTag>



      /**
      * 自定义带属性的标签
      */
      public class TestTag extends SimpleTagSupport {

      private boolean isOk = true;


      @Override
      public void doTag() throws JspException, IOException {

      if (isOk)
      //如果传递的输出流为null,表使用的就是当前的页面out。等同于this.getJspContext().getOut()的效果
      this.getJspBody().invoke(null);
      }

      /**
      * 这个方法会由tomcat来调用,并且在doTag方法之前
      *
      * @param ok
      */
      public void setOk(boolean ok) {
      isOk = ok;
      }
      }


      <?xml version="1.0" encoding="UTF-8" ?>
      <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
      version="2.0">

      <!-- -->
      <tlib-version>1.0</tlib-version>
      <!-- -->
      <short-name>muriel</short-name>
      <!-- -->
      <uri>http://www.muriel.cn/el.functions</uri>

      <tag>
      <!-- 标签名 -->
      <name>testTag</name>
      <!-- 标签处理类 -->
      <tag-class>com.muriel.tag.TestTag</tag-class>
      <!--
      标签体
      empty:无标签体
      tagdependent:只能是EL表达式,也可以是其他标签
      scriptless:标签体内容不会被执行,而是直接赋值标签处理类
      -->
      <body-content>scriptless</body-content>
      <attribute>
      <!-- 指定属性名 -->
      <name>isOK</name>
      <!--指定是否为必须的。 若必须为true,不必须为false -->
      <required>true</required>
      <!-- 指定属性是否可以使用EL。runtime expretion value运行时表达式值 -->
      <rtexprvalue>true</rtexprvalue>
      </attribute>
      </tag>
      </taglib>


      <%-- 导入标签库 --%>
      <%@taglib prefix="t" uri="/WEB-INF/tlds/test.tld" %>
      <%
      String data = "fat rabbit";
      pageContext.getRequest().setAttribute("data", data);
      %>

      <t:testTag ok="${!empty data}">
      ${data}
      </t:testTag>
       

       

posted @ 2018-12-17 23:48  好胖的兔子  阅读(344)  评论(0编辑  收藏  举报