• JSTL标签详解以及应用实例


    JSTL

    Apache提供的标签库,jar包:jstl-1.2.jar,如果用MyEclipse,它会自动导入,无需自己导入,如果没有使用MyEclipse那么需要自行导入。

    ------------------

    导入JSTL核心标签库
      <%taglib prefix="c" uri="http://java.sun.com/jstl/core"%>


    <c:set>
      * <c:set var="a" value="hello"/> 创建名为a,值为hello的域属性,范围:page
      * <c:set var="a" value="hello" scope="session"/> 范围为session

    <c:out>
      * <c:out value="aaa"/> 输出字符串aaa
      * <c:out value="${aaa"/> 输出域属性aaa,其中与${aaa}相同
      * <c:out value="${aaa}" default="xxx"/>如果${aaa}不存在,那么输出xxx字符串
      * <c:out value="${aaa}" escapeXml="true"/>如果${aaa}中包含特殊字符,那么转义它。这可以防止javascript攻击

    <c:remove>
      * <c:remove var="a"/> 删除名为a的域属性
      * <c:remove var="a" scope="page"/> 删除page域中名为a的域属性

    <c:url>
      * <c:url value="/AServlet"/> 输出URL:/项目名/AServlet
      * <c:url value="/AServlet" var="url" scope="page"/> 把生成的url保存到page域中,而不会输出
      * <c:url value="/AServlet">:输出URL:/项目名/AServlet?username=%xx%xx%xx%xx%xx%xx,其中张三会被URL编码
        <c:param name="username" value="张三"/>
      </c:url/>

    <c:if>
      * <c:if test="${条件}"> 当条件为true时执行标签体内容
        hello
       </c:if>

    <c:choose>
        * <c:choose>
          <c:when test="${条件1}">a</c:when>
          <c:when test="${条件2}">b</c:when>
          <c:when test="${条件3}">c</c:when>
          <c:otherwise>d</c:otherwise>
          </c:choose>

      等同与:
        if() {
        } esle if() {
        } esle if() {
        } else if() {
        } else {
        }

    <c:forEach>

      可以用来遍历数组、List、Map、

        1. 计数循环

          <c:forEach begin="1" end="10" var="i">
            ${i}
          </c:forEach>
        等同于
          for(int i = 1; i <= 10; i++) {
          out.println(i);
          }


          <c:forEach begin="1" end="10" var="i" step="2">
            ${i}
          </c:forEach>
        等同于
          for(int i = 1; i <= 10; i+=2) {
          out.println(i);
          }

        2. 遍历数组

          <%
            String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
            pageContext.setAttribute("ns", names);
          %>
          <c:forEach var="item " items="${ns } ">
            <c:out value="name: ${item } "/><br/>
          </c:forEach>

        3. 遍历List

          <%
            List<String> names = new ArrayList<String>();
            names.add("zhangSan");
            names.add("liSi");
            names.add("wangWu");
            names.add("zhaoLiu");
            pageContext.setAttribute("ns", names);
          %>
          <c:forEach var="item" items="${ns }">
            <c:out value="name: ${item }"/><br/>
          </c:forEach>

        4. 遍历Map

          <%
            Map<String,String> stu = new LinkedHashMap<String,String>();
            stu.put("number", "N_1001");
            stu.put("name", "zhangSan");
            stu.put("age", "23");
            stu.put("sex", "male");
            pageContext.setAttribute("stu", stu);
          %>
          <c:forEach var="item " items="${stu }">
            <c:out value="${item.key }: ${item.value } "/><br/>
          </c:forEach>

        5. 循环状态对象

          循环状态对象是用来说明循环的状态的,属性如下:
              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="第${vs.count } 行: "/>
                  <c:out value="[${vs.index } ]: "/>
                  <c:out value="name: ${vs.current } "/><br/>
                </c:forEach>

    导入JSTL格式化标签库

      <%@ 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 "/>

     

        <%
            double d1 = 3.5;
            double d2 = 4.4;
            pageContext.setAttribute("d1", d1);
            pageContext.setAttribute("d2", d2);
        %>
        <fmt:formatNumber value="${d1 }" pattern="0.00 "/><br/>
        <fmt:formatNumber value="${d2 }" pattern="#.## "/>

          * pattern:0.00,表示小数不足两位时,使用0补足两位
          * pattern:#.##,表示小数不足两位时,有几位显示几位,不会补足

    示例代码:

      1 <%@ page language="java" import="java.util.*,cn.yzu.*" pageEncoding="UTF-8"%>
      2 <%@ taglib prefix="fn"  uri="http://java.sun.com/jsp/jstl/functions"%>
      3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      4 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
      5 <%
      6 String path = request.getContextPath();
      7 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
      8 %>
      9 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     10 <html>
     11   <head>
     12     <base href="<%=basePath%>">
     13     <title>My JSP 'index.jsp' starting page</title>
     14     <meta http-equiv="pragma" content="no-cache">
     15     <meta http-equiv="cache-control" content="no-cache">
     16     <meta http-equiv="expires" content="0">    
     17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
     18     <meta http-equiv="description" content="This is my page">
     19   </head>
     20   <body>
     21           <!-- JSTL标签以及EL表达式的使用与区别 -->
     22           <!-- 输出标签 -->
     23           <%
     24           request.setAttribute("a", "<font color='red'>aaaaa</font>");
     25           request.setAttribute("b", null);
     26            %>
     27           ${a}&nbsp;&nbsp;&nbsp;
     28           <c:out value="a"/>&nbsp;&nbsp;&nbsp;
     29           <c:out value="${a}"/><br>
     30           <c:out value="b" default="bbbbb"></c:out><br>    <!-- 如果b为空,输出default内容 -->
     31           <c:out value="${a}" escapeXml="false"/><hr>        <!-- 转义,默认的true -->
     32           
     33           
     34           <!-- 在域中设置值,默认是pageScope -->
     35           <c:set var="c" value="ccccc"/>        
     36           <c:set var="d" value="ddddd" scope="request"/>
     37           <c:out value="${pageScope.c}"/>&nbsp;&nbsp;&nbsp;
     38           <c:out value="${d}"/><hr>
     39           
     40           
     41           <!-- 删除域中的值,默认是删除所有域中的值,如下例是删除所有域中的键为e的元素 -->
     42           <c:remove var="e"/>    
     43           <c:remove var="c" scope="page"/>    
     44           <c:out value="${pageScope.c}"/><hr> 
     45           
     46           
     47           <!-- URL标签 -->
     48           <c:url value="/"/>&nbsp;&nbsp;    <!-- 输出项目名,加/ -->                         
     49           ${pageContext.request.contextPath }<br><!-- 输出项目名,不加/ -->
     50           <!-- 下面两个可以达到一样的效果 --> 
     51           <c:url value="/AServlet"/>&nbsp;&nbsp;
     52           ${pageContext.request.contextPath }/AServlet<br>
     53           <c:url value="/AServlet">
     54               <c:param name="username">张三</c:param><!-- 可以为URL增加参数 -->
     55           </c:url>
     56           <c:url value="/AServlet" var="f" scope="page"/><br>    <!-- 将地址赋给page域的f -->
     57           <c:out value="${f}"/>&nbsp;&nbsp;
     58           <!-- 下例相当于<a href="/webBegin/index.jsp">重新请求本页面</a> -->
     59           <a href="<c:url value='/index.jsp'/>">重新请求本页面</a><hr>
     60           
     61           
     62           <!-- if,choose选择标签 -->
     63           <c:set var="g" value="87"/>
     64           <c:if test="${g>=0&&g<=100 }">
     65               你得了${g }分
     66           </c:if>&nbsp;
     67           <c:choose>
     68               <c:when test="${g>=85}">成绩优秀</c:when>
     69               <c:when test="${g>=60}">成绩及格</c:when>
     70               <c:otherwise>不及格</c:otherwise>
     71           </c:choose><hr>
     72           
     73           
     74           <!-- 循环遍历标签 -->
     75           <c:forEach begin="1" end="10" step="2" var="h">
     76               ${h }&nbsp;
     77           </c:forEach><br>
     78           <% 
     79               String str[]={"one","two","three"};
     80               request.setAttribute("str", str);
     81           %>
     82           <c:forEach items="${str}" var="nstr">    <!-- 注意,items="${str}"千万不可写成items="${str} ",后面不可有空格 -->
     83               ${nstr }&nbsp;
     84           </c:forEach><br>
     85           <c:forEach items="${str}" var="nstr" varStatus="vs">    
     86               ${vs.count }:${nstr }&nbsp;
     87           </c:forEach><hr>
     88           
     89           
     90           <!-- 格式化标签 -->
     91           <%
     92               request.setAttribute("date", new Date());
     93               request.setAttribute("m", 3.1415);
     94            %>
     95            <fmt:formatDate value="${date }" pattern="yyyy-MM-dd  HH:mm:ss"/><br>
     96            <fmt:formatNumber value="${m }"  pattern="0.000"/><br>
     97            <fmt:formatNumber value="${m }"  pattern="0.00000"/><br><!-- 四舍五入保留五位小数,小数不足时,使用0补足两位 -->
     98            <fmt:formatNumber value="${m }"  pattern="#.#####"/><br><!-- 四舍五入保留五位小数,小数不足时,不补足 -->
     99   </body>
    100 </html>
    index.jsp

    运行结果:

     

    补充:自定义标签

    1. 步骤
      * 标签处理类(标签也是一个对象,那么就需要先有类!)
      * tld文件,它是一个xml
      * 页面中使用<%@taglib%>来指定tld文件的位置

    2. 标签处理类
      SimpleTag接口:
        * void doTag():每次执行标签时都会调用这个方法;
        * JspTag getParent():返回父标签(非生命周期方法)
        * void setParent(JspTag):设置父标签
        * void setJspBody(JspFragment):设置标签体
        * void seetJspContext(JspContext):设置jsp上下文对象,它儿子是PageContext

      其中doTag()会在其他三个方法之后被tomcat调用。

    3. 配置tld文件

      tld文件一般都放到WEB-INF之下,这样保证客户端访问不到!
        <tag>
          <name>myTag1</name> 指定当前标签的名称
          <tag-class>cn.itcast.tag.MyTag1</tag-class> 指定当前标签的标签处理类!
          <body-content>empty</body-content> 指定标签体的类型,我们这里使用的是空标签!
          </tag>

    4. 页面中指定tld文件位置

      <%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %>
      导标签库,就是为页面指定tld文件的位置!

    标签体内容
      * empty:无标签体!
      * JSP:jsp2.0已经不在支持这个类型了!表示标签体内容可以是:java脚本,可以是标签,可以是el表达式
      * scriptless:只能是EL表达式,也可以是其他的标签!
      * tagdependent:标签体内容不会被执行,而是直接赋值标签处理类!

    不在执行标签下面内容的标签!

      在标签处理类中的doTag()中使用SkipPageException来结束!
      Tomcat会调用标签处理类的doTag()方法,然后Tomcat会得到SkipPageException,它会跳过本页面其他内容!

    标签属性

      步骤:
        1. 给你的标签处理类添加属性!
          为标签处理类添加属性,属性至少要且一个set方法!这个set方法会在doTag()方法之前被tomcat执行!所在doTag()中就可以使用属性了。

        2. 在tld文件中对属性进行配置

          <attribute>
            <name>test</name> 指定属性名
            <required>true</required> 指定属性是否为必需的
            <rtexprvalue>true</rtexprvalue> 指定属性是否可以使用EL
          </attribute>

  • 相关阅读:
    springboot 默认日志
    redis 实现分布式锁
    java 线程池等待所有线程执行完毕
    java 线程池
    springcould 五大组件详解
    java 导出excel
    java 下载excel模板
    java 8 通过某个字段去重
    leetcode算法题-461.汉明距离
    java Barcode4j生成条形码并添加至pdf打印
  • 原文地址:https://www.cnblogs.com/fengmingyue/p/6011737.html
Copyright © 2020-2023  润新知