zoukankan      html  css  js  c++  java
  • JSTL 标签库

    1. JSTL 概述

    • JSTL 是 apache 对 EL 表达式的扩展, JSTL 是标签语言!
    • 需要导入 jstl-1.2.jar

    2. JSTL 标签库

    • core: 核心标签库;
    • fmt: 格式化标签库, 只需要学习两个标签即可: 日期, 数字;
    • sql: 已过时;
    • xml: 已过时.
    // 导入 JSTL 的 core 标签库
        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
        // prefix="c", 一般在使用 core 标签库时, 指定前缀为 c;
        // uri="http://java.sun.com/jsp/jstl/core", 指定标签库的 url, 它不一定是真实存在的网址;
        //       但是它可以让 jsp 找到标签库的描述文件.
    

    3. core 标签库

    1. <c:out> 输出
    • <c:out value="aaa" default="bbb" escapeXml="<true|false>"/>
    • value: 可以是字符串常量, 也可以是 EL 表达式, 即 value="${aaa}", 相当于全域查找 aaa 属性;
    • default: 输出的默认值.
    • escapeXml: 是否忽略 XML 特殊字符, 默认为 true, 表示转义!
    2. <c:set> 设置(创建域的属性)
    • <c:set var="a" value="hello" scope="session"/> 表示在 session域中添加name为 a, value 为 hello 的数据;
    • <c:set var="a" value="hello"/> 表示在 pageContext 中添加 name 为 a, value 为 hello 的数据;
    • scope: 表示域, 默认为 pageContext, 可选值为: pageContext, request, session, application
    3. <c:remove> 删除
    // 删除所有域中 name 为 a 的数据
        <%
            pageContext.setAttribute("a","pageContext");
            request.setAttribute("a","request");
            session.setAttribute("a","session");
            application.setAttribute("a","application");
        %>
    
        // 如果不给出 scope, 表示删除所有域中该名称的值
        <c:remove var="a"/> 或者 <c:out value="${a}" default="none"/>
    
    // 删除 pageContext 中 name 为 a 的数据
        <c:remove var="a" scope="page"/>
    
    4. <c:url>
    // 输出上下文路径: /day11_1/
        <c:url value="/"/>
    
    // 把本该输出的结果赋给变量a, 范围为 request 域
        <c:url value="/" var="a" scope="request"/>
    
    // 输出: /day11_1/AServlet
        <c:url value="/AServlet"/>
    
    // 输出: /day11_1/AServlet?username=abc&password=123
    // 如果参数中包含中文, 那么会自动使用 URL 编码
        <c:url value="/AServlet">
            <c:param name="username" value="abc"/>
            <c:param name="password" value="123"/>
        </c:url>
    
    5. <c:if>
    // if 标签的 test 属性必须是一个 boolean 类型的值, 对应 java 中的 if 语句
        <c:set var="a" value="hello"/>
        <c:if test="${not empty a}">
            <c:out value="${a }"/>
        </c:if>
    
    6. <c:choose>
    // choose 对应 java 中的 if/else 结构. 当 when 标签的 test 为 true 时, 会执行这个 when 的内容.
        <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>
    
    7. <c:forEach>
    • 它用来循环遍历数组(或集合),还可以用计数的方式来循环!
    // 计数的方式来循环
        for(int i = 1; i<=10; i++){
            ....
        }   
    
        <c:forEach var="i" begin="1" end="10">
            ${i}
        </c:forEach>
    
    // 用来输出域中的数组或集合
    // items: 指定要循环谁, 它可以是一个数组或一个集合
    // var: 把数组或集合中的每个元素赋值给 var 指定的变量
        <c:forEach items="${strs }" var="str">
            ${str }<br/>
        </c:forEach>
    
        等同于增强 for 循环:
            for(String str : strs){
                ...
            }
    
    // forEach 标签还有一个属性: varStatus, 这个属性用来指定接收"循环状态" 的变量名.
    //  count: int 类型, 表示当前已遍历元素的个数
    //  index: int 类型, 表示当前元素的下标;
    //  first: boolean 类型, 表示是否为第一个元素
    //  last: boolean 类型, 表示是否为最后一个元素
    //  current: Object 类型, 表示当前项目
    
        <c:forEach var="item" items="${ns }" varStatus="vs">
            <c:if test="${vs.first }">第一行</c:if>
            <c:if test="${vs.last }">最后一行</c:if>
            <c:out value="name: ${vs.current }"/>
        </c:forEach>
    

    4. fmt 标签

    • fmt 标签库是用来格式化输出的, 通常需要格式化的有时间和数字.
    // 格式化时间
        <%@ taglib="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"/>
        // value: 指定一个 Date 类型的变量
        // pattern: 用来指定输出的模板!
    
    
    // 格式化数字
        <fmt:formatNumber value="${d1 }" pattern="0.00"/>
        // 保留小数点后两位, 它会四舍五入!! 如果不足两位, 以 0 补位
    
        <fmt:formatNumber value="${d2 }" pattern="#.##"/>
        // 保留小数点后两位, 它会四舍五入!! 如果不足两位, 不补位.
    

    5. 自定义标签

    5.1. 步骤:
    • 定义标签处理类(标签也是一个对象, 因此就需要先有类!); 必须是 Tag 或 SimpleTag 的实现类.
    • 创建 tld 文件, 其实它是一个 xml 文件;
    • 页面中使用 <%@ taglib> 来指定 tld 文件的位置;
    5.2. SimpleTag
    1. 位于 j2EE 中的 javax.servlet.jsp.tagext 包;
    2. SimpleTag 接口的父类为 JspTag;
    3. simpleTag 接口中的方法:
      • void doTag() : 每次执行标签时都会调用这个方法;
      • JspTag getParent(); : 返回父标签(非生命周期方法), 较少使用;
      • void setParent(JspTag tag); : 设置父标签;
      • void setJspBody(JspFragment fragment); : 设置标签体;
      • void setJspContext(JspContext pc);: 设置 jsp 上下文对象, JspContext的子类是 pageContext;
      • 其中, doTag() 方法会在三个 set 方法之后被 tomcat调用, 所以 doTag() 中可以使用tomcat传递过来的参数.
    5.3. 配置 tld 文件
    • tld 文件一般都放到 WEB-INF 目录下,这样可以保证客户端访问不到!!
    <tag>
        <name>myTag</name>  // 指定当前标签的名称
        <tag-class>cn.itcast.tag.MyTag</tag-class>  // 指定当前标签的标签处理类
        <body-content>empty</body-content>  //指定标签体的类型, 这里使用的是空标签, 例如html中的<br/>
    </tag>
    
    5.4. 页面中指定 tld 文件位置
    • <%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %>
    5.5. SimpleTagSupport 类
    • SimpleTagSupport 类实现了 simpleTag 接口, 我们只需要重写 doTag() 方法即可.
    • 该类已经把 tomcat 传递过来的所有参数都保存起来了, 而且还提供了 get 方法供子类调用.

    6. 有标签体的标签

    1. <body-content> 元素的可选值:
      • empty: 无标签体, 例如 html 中的
      • JSP : jsp 2.0 已经不再支持这个类型.
      • scriptless: 标签内容只能是 EL 表达式, 也可以是其他的标签;
      • tagdependent: 标签体内容不会被执行, 而是直接赋值给标签处理类. (很少使用)
    // 标签处理类
        public class MyTag3 extends SimpleTagSupport{
            // 复写 doTag() 方法
            public void doTag() throws JspException, IOException{
                // 获取输出流
                Writer out = this.getJspContext().getOut();
                out.write("*******************<br/>");  // 页面中输出一排星号
    
                // 执行标签体内容, 把结果写到指定的流中, 即页面上
                // this.getJspBody().invoke(null);  如果传递的输出流为 null, 表示使用的就是当前页面的 out!
                this.getJspBody().invoke(out);
            }
        }
    
    // 配置 tld 文件
        <tag>
            <name>myTag3</name>
            <tag-class>cn.itcast.tags.MyTag3</tag-class>
            <body-content>scriptless</body-content>
        </tag>
    
    // jsp 页面
        <%
            request.setAttribute("xxx","张三");
        %>
    
        <it:myTag3>
            ${xxx }  // 标签体内容为 EL 表达式
        </it:myTag3>
    

    7. 不执行标签下面的页面内容

    • 如果希望执行了自定义标签后, 不再执行 JSP 页面下面的东西, 那么就需要在 doTag() 方法中使用 SkipPageException.
    • Tomcat 会调用标签处理类的 doTag() 方法, 然后 Tomcat 会得到 SkipPageException, 它会跳过本页面其他内容.
    // 标签处理类:
        public class SkipTag extends SimpleTagSupport{
                // 复写 doTag() 方法
                public void doTag() throws JspException, IOException{
                    this.getJspContext().getOut().print("<h1>只能看到我</h1>");
                    throw new SkipPageException();
                }
        }
    
    // 配置 tld 文件
        <tag>
            <name>skip</name>
            <tag-class>cn.itcast.tags.SkipTag</tag-class>
            <body-content>empty</body-content>
        </tag>
    
    // jsp 页面
        <itcast:skip/>
        <h1>看不见我!</h1>
    

    8. 带有属性的标签

    1. 给标签处理类添加属性
      • 为标签处理类添加属性, 属性至少有一个 set 方法, 这个 set 方法会在 doTag() 之前被 tomcat 执行! 所以
        doTag() 方法中就可以使用属性了.
    2. 在 tld 文件中对属性进行配置
        <tag>
            <name>myTag4</name>
            <tag-class>cn.itcast.tag.MyTag4</tag-class>
            <body-content>scriptless</body-content>
            <attribute>
                <name>test</name>    // 指定属性名
                    <required>true</required>   // 指定属性是否为必需的
                    <rtexprvalue>true</rtexprvalue>  // 指定属性是否可以使用 el 表达式.
                                                     // rt(runtime) expr(express)value
            </attribute>
        </tag>
    

    参考资料:

  • 相关阅读:
    ZOJ2587 Unique Attack(判定最小割唯一性)
    SPOJ371 Boxes(最小费用最大流)
    SGU185 Two shortest(最小费用最大流/最大流)
    POJ2112 Optimal Milking(最大流)
    HDU3996 Gold Mine(最大权闭合子图)
    POJ3680 Intervals(最小费用最大流)
    SPOJ 7258 Lexicographical Substring Search(后缀自动机)
    HDU 4436 str2int(后缀自动机)
    SPOJ 1812 Longest Common Substring II(后缀自动机)
    CodeForces 235C Cyclical Quest(后缀自动机)
  • 原文地址:https://www.cnblogs.com/linkworld/p/7600091.html
Copyright © 2011-2022 走看看