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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM