<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          JSP、EL表達式、JSTL標(biāo)簽庫干貨(建議收藏)

          共 19472字,需瀏覽 39分鐘

           ·

          2021-03-18 09:41

          點擊上方藍色字體,選擇“標(biāo)星公眾號”

          優(yōu)質(zhì)文章,第一時間送達

            作者 |  活到老_碼到老

          來源 |  urlify.cn/QremIj

          JSP語法

          除了HTML語法,擴展的其他內(nèi)容如下

          嵌套Java代碼的格式

          • 聲明標(biāo)簽:<%! 變量聲明或方法聲明 %>

          • 表達式標(biāo)簽:<%= 表達式 %> 表達式的值將輸出到JSP頁面的相應(yīng)位置

          • 代碼標(biāo)簽: <% Java代碼 %> 頁面上動態(tài)顯示的內(nèi)容


          JSP指令

          用于聲明 JSP 頁面的屬性,如編碼方式、文檔類型等等。一共有三種指令:page、include、taglib。

          指令使用格式

          <%@ directive attribute1="value1" attribute2="value2" ... %>

          • directive 指 page、include、taglib其中之一

          • attribute屬性名

          • value屬性值

          • ...這個不是語法哦,指其他未寫出的 attribute="value"

          page指令

          屬性名屬性值描述
          languagejava解釋JSP文件時采用的語言。默認(rèn)為java
          extends類的全名由該JSP文件生成的類繼承哪個類,JSP為Servlet,因此當(dāng)指明繼承普通類時需要實現(xiàn)Servlet的init、destroy等方法
          import包名/類名import是唯一可以聲明多次的page指令屬性。一次可以導(dǎo)入多個類,中間用英文逗號隔開
          sessiontrue/false是否內(nèi)置session對象。默認(rèn)為true
          autoFlushtrue/falsetrue代表使用out.println()等方法輸出的字符串暫時存到緩存里,當(dāng)緩存滿了或者程序行完畢或者執(zhí)行out.?ush()操作時才輸出到客戶端。默認(rèn)為true
          buffernone/nKB指定緩存大小,例如 4KB
          isThreadSafetrue/false是否線程安全。值為true時允許多線程執(zhí)行該JSP,否則必須排隊執(zhí)行。默認(rèn)為false
          isErrorPagetrue/false該 JSP頁面是否為錯誤顯示頁面。為true時該JSP擁有內(nèi)置exception對象,否則沒有。默認(rèn)為false
          errorPage某個JSP頁面的相對路徑指明一個錯誤頁面,如果該JSP程序拋出一個未捕捉的異常,則將該異常傳遞給errorPage指定JSP頁面并跳轉(zhuǎn)至errorPage指定JSP頁面
          contentType文檔類型客戶端瀏覽器根據(jù)該屬性判斷文檔類型。例如,HTML:text/html、純文本:text/plain、JPG圖像:image/jpeg、GIF圖像:image/gif、WORD文檔:application/msword
          pageEncoding字符集指定該JSP頁面的字符集,如UTF-8、ISO-8859-1等

          include指令

          將其他 JSP文件、HTML文件、文本包含到該 JSP中一并編譯。這是一種靜態(tài)包含,相當(dāng)于直接復(fù)制粘貼進來,所以在編譯該JSP文件的時候?qū)?strong>一并編譯被包含的文件

          • 屬性名:file

          • 屬性值:URL相對路徑

          • 例:<%@ include file="文件相對 url 地址" %>

          taglib指令

          JSP支持標(biāo)簽技術(shù),后面會講到標(biāo)簽的用法,JSTL標(biāo)簽庫的使用等。

          作用:用來指明JSP頁面內(nèi)使用的JSP標(biāo)簽庫,taglib指令有兩個屬性,uri為類庫的地址,prefix為標(biāo)簽的前綴

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


          JSP的9個內(nèi)置對象

          使用內(nèi)置對象進行便捷的開發(fā),大部分都是HttpServlet中使用的對象(除了pageContext和out),關(guān)于HttpServlet請看上一篇博文

          對象類型簡述
          requestHttpServletRequest該對象是客戶端的HTTP請求,作用域為一次請求,包含頭信息、系統(tǒng)信息、請求方式等
          responseHttpServletResponseHTTP響應(yīng)對象,作用域為該 JSP頁面
          sessionHttpSession作用域為一次會話
          applicationServletContext作用域為Servlet容器,直到服務(wù)器關(guān)閉前都有效
          configServletConfig服務(wù)器的配置信息。config在上一篇博文的Servlet級始化參數(shù)中使用過。
          pageHttpServlet指該 JSP編譯為Java代碼中的Servlet類的對象(Servlet是單實例的,所以這個指向是明確的),相當(dāng)于this
          exceptionException只有當(dāng)前頁面是錯誤頁面(<%@ page isErrorPage="true" %>)才能使用,若不是錯誤頁面使用exception會導(dǎo)致編譯報錯。
          outJspWriter用于向頁面輸出(包括js代碼),上面提到的page指令的autoFlush屬性就是控制這個對象
          pageContextPageContext表示頁面的上下文,可以獲取request、response、session、application、config等


          EL表達式

          EL(Expression Language)表達式可以更方便的展示變量和對象,避免在HTML中嵌入Java代碼(顯的很混亂)

          基本使用格式

          ${EL表達式} 變量名不用加引號

          獲取4個域(pageContext、request、session、application)中值

          EL表達式只能獲取域中的值,不能獲取Java代碼中的值!需要使用的變量一定要先存在域中。

          例如:<% session.setAttribute("score",99) %> ,此時可以讀取score這個值${score}

          另外一點,如果找不到值會返回空字符串"",而不是null

          完全限定獲取方式
          • 獲取pageContext域的變量:${pageScope.key}

          • 獲取request域的變量:${requestScope.key}

          • 獲取session域的變量:${sessionScope.key}

          • 獲取application域的變量:${applicationScope.key}

          隱式獲取

          ${key} : 將會以pageContext??request??session??application順序讀取,域的范圍是從小到大

          • 關(guān)于集合的展示 ??

          <%
           List list = new ArrayList();
              list.add("one");
              list.add("two");
              list.add("three");
              pageContext.setAttribute("aList",list);
              Map map = new HashMap();
              map.put("color","red");
              map.put("shape","square");
              pageContext.setAttribute("aMap",map);
          %>
          ${aList}<br/>  <!--直接輸出數(shù)組-->
          ${aList[0]}<br/> <!--按下標(biāo)讀取數(shù)組-->
          ${aList[2]}<br/> <!--按下標(biāo)讀取數(shù)組-->
          ${aMap}<br/>  <!--直接輸出映射-->
          ${aMap.shape}<br/> <!--按鍵讀取映射-->
          • 下面是在網(wǎng)頁中輸出的結(jié)果 ??

          [one, two, three]
          one
          three
          {color=red, shape=square}
          square
          對象的展示
          • 測試??

          <%
           class Student{
                  private final String name = "Tom";
                  private final String sex = "boy";
                  @Override
                  public String toString() {
                      return name+" is a "+sex;
                  }
           }
           Student student = new Student();
           pageContext.setAttribute("aStudent",student);
          %>
          ${aStudent}<br/>

          下面是在網(wǎng)頁中輸出的結(jié)果 ??

          Tom is a boy

          可以看出來EL對于對象的展示其實就是調(diào)用了toString()方法,包括集合也一樣。如果這個對象沒有重寫toString()方法,那么機會調(diào)用父類toString()方法。比如父類是Object,那么就會輸出hashcode。

          對象的字段(屬性)的獲取
          • 獲取方式: ${object.field} 即可獲取對象的字段(屬性)

          • 測試代碼??

          com.java.webtest.Student

          package com.java.webtest;

          public class Student {
              private String name = "Jack";
              public String getName() {
                  return name;
              }
          }

          myTest.jsp

          <%@ page import="com.java.webtest.Student" %>
          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <html>
          <head>
              <title>myTest</title>
          </head>
          <body>
              <%
                  Student s1 = new Student();
                  pageContext.setAttribute("s1",s1);
              %>
              name = ${s1.name}<br/>
          </body>
          </html>
          • 運行結(jié)果

          name = Jack

          ?? EL表達式獲取對象字段(屬性)是通過反射機制。${s1.name} 底層邏輯是將首字母"n"大寫再在前面拼接一個"get",然后反射獲取"getName"方法。所以對象必須提供字段的get方法,才能使用EL表達式 ${object.field} ,如果不寫就會報錯,或者你讓get方法返回一個和相應(yīng)字段無關(guān)的東西來證明確實是調(diào)用了get方法得到值的。

          EL的運算

          運算類型描述
          算術(shù)型+ 減- 乘* 除/、 div 取余% 、mod
          邏輯型and、&&or、||、!、not
          關(guān)系型==、eq!=、ne、<、lt>、gt<=、le>=、ge
          empty判斷一個值是否為null或者為empty,如${empty ""} 返回值為true
          三目運算expression ? valueA : valueB 若expression為true返回valueA否則返回valueB
          • 做一個測試 ??

          <%
              class Person{
                  private int id;
                  private String sex;
                  public Person(int id,String sex){ this.id = id; this.sex = sex; }
                  @Override
                  public boolean equals(Object o) { return id == ((Person) o).id; }
              }
              Person p1 = new Person(777,"boy");
              Person p2 = new Person(777,"girl");
              Person p3 = new Person(666,"boy");
              pageContext.setAttribute("p1",p1);
              pageContext.setAttribute("p2",p2);
              pageContext.setAttribute("p3",p3);
          %>

          1 + 2 = ${1 + 2}<br/>
          1 - 2 = ${1 - 2}<br/>
          3 * 3 = ${3 * 3}<br/>
          10 / 3 = ${10 / 3}<br/>
          10 div 3 = ${10 div 3}<br/>
          10 % 3 = ${10 % 3}<br/>
          10 mod 3 = ${10 mod 3}<br/>
          true and false -> ${true and false}<br/>
          true && false ->${true && false}<br/>
          true or false -> ${true or false}<br/>
          true || false -> ${true || false}<br/>
          not true -> ${not true}<br/>
          !true -> ${!true}<br/>
          666 == 666 -> ${666 == 666}<br/>
          p1 == p2 -> ${p1 == p2}<br/>
          p1 == p3 -> ${p1 == p3}<br/>
          "ABCDEFG" == "abcdefg" -> ${"ABCDEFG" == "abcdefg"}<br/>
          "ABCDEFG" == "ABCDEFG" -> ${"ABCDEFG" == "ABCDEFG"}<br/>
          "ABCDEFG" eq "abcdefg" -> ${"ABCDEFG" eq "abcdefg"}<br/>
          "ABCDEFG" eq "ABCDEFG" -> ${"ABCDEFG" eq "ABCDEFG"}<br/>
          "ABCDEFG" != "abcdefg" -> ${"ABCDEFG" != "abcdefg"}<br/>
          "ABCDEFG" != "ABCDEFG" -> ${"ABCDEFG" != "ABCDEFG"}<br/>
          "ABCDEFG" ne "abcdefg" -> ${"ABCDEFG" ne "abcdefg"}<br/>
          "ABCDEFG" ne "ABCDEFG" -> ${"ABCDEFG" ne "ABCDEFG"}<br/>
          10 < 3 -> ${10 < 3}<br/>
          10 lt 3 -> ${10 lt 3}<br/>
          10 > 3 -> ${10 > 3}<br/>
          10 gt 3 -> ${10 gt 3}<br/>
          10 <= 3 -> ${10 <= 3}<br/>
          10 le 3 -> ${10 le 3}<br/>
          10 >= 3 -> ${10 >= 3}<br/>
          10 ge 3 -> ${10 ge 3}<br/>
          empty "" -> ${empty ""}<br/>
          empty null -> ${empty null}<br/>
          empty 666 -> ${empty 666}<br/>
          55 > 60 ? "you pass!" : "you fail..." -> ${55 > 60 ? "you pass!" : "you fail..."}<br/>
          • 頁面的輸出結(jié)果??

          1 + 2 = 3
          1 - 2 = -1
          3 * 3 = 9
          10 / 3 = 3.3333333333333335
          10 div 3 = 3.3333333333333335
          10 % 3 = 1
          10 mod 3 = 1
          true and false -> false
          true && false ->false
          true or false -> true
          true || false -> true
          not true -> false
          !true -> false
          666 == 666 -> true
          p1 == p2 -> true
          p1 == p3 -> false
          "ABCDEFG" == "abcdefg" -> false
          "ABCDEFG" == "ABCDEFG" -> true
          "ABCDEFG" eq "abcdefg" -> false
          "ABCDEFG" eq "ABCDEFG" -> true
          "ABCDEFG" != "abcdefg" -> true
          "ABCDEFG" != "ABCDEFG" -> false
          "ABCDEFG" ne "abcdefg" -> true
          "ABCDEFG" ne "ABCDEFG" -> false
          10 < 3 -> false
          10 lt 3 -> false
          10 > 3 -> true
          10 gt 3 -> true
          10 <= 3 -> false
          10 le 3 -> false
          10 >= 3 -> true
          10 ge 3 -> true
          empty "" -> true
          empty null -> true
          empty 666 -> false
          55 > 60 ? "you pass!" : "you fail..." -> you fail...
          • 我認(rèn)為應(yīng)該特別注意兩點

            • 兩個整數(shù)相除的結(jié)果并不是整數(shù)

            • p1 == p2 -> true 和 "ABCDEFG" == "ABCDEFG" -> true顯然不同于Java,EL表達式重載了 == ,對象之間使用 == 比較的時候,并不是比較對象的引用變量(也就是對象地址或指針),而是使用了 equals(Object o) 方法。!= 比較對象也是同理,可以自己測試一下。

          JSTL標(biāo)簽庫

          JSTL(Java server pages standarded tag library)是一個JSP標(biāo)準(zhǔn)標(biāo)簽庫,它封裝了JSP應(yīng)用的通用核心功能。JSTL支持通用的、結(jié)構(gòu)化的任務(wù),比如迭代,條件判斷,XML文檔操作,國際化標(biāo)簽,SQL標(biāo)簽。除了這些,它還提供了一個框架來使用集成JSTL的自定義標(biāo)簽。下文將闡述部分常用的JSTL標(biāo)簽。EL和JSTL核心標(biāo)簽庫通常搭配使用效果最佳

          使用前的準(zhǔn)備

          • 導(dǎo)入相應(yīng)的jar包:standard.jar 和 jstl.jar

          • JSP頁面引入標(biāo)簽庫

            <%@ taglib pre?x="前綴" uri="功能范圍路徑" %>

            功能范圍prefixuri
            corechttp://java.sun.com/jsp/jstl/core
            i18nfmthttp://java.sun.com/jsp/jstl/fmt_rt
            sqlsqlhttp://java.sun.com/jsp/jstl/sql
            xmlxhttp://java.sun.com/jsp/jstl/xml
            functionsfnhttp://java.sun.com/jsp/jstl/function

            ?? 如果在后面使用中出現(xiàn) 500錯誤頁面,其中包含類似這樣的信息:atrribute [value] does not accpet any expressions,有可能是uri的問題,可能需要換一個uri。uri不同版本功能有差別所以會導(dǎo)致一些錯誤。

          標(biāo)簽使用語法

          <prefix:tag attribute="value" ... >
           ...
          </prefix:tag>

          重要標(biāo)簽

          ?? 免責(zé)聲明:以下標(biāo)簽屬性總結(jié)并不全面,只講比較常用的屬性;并且由于uri不同屬性不同。具體內(nèi)容請查看你導(dǎo)入的standard.jar

          <c:tag>標(biāo)簽

          使用標(biāo)簽前不要忘記導(dǎo)入標(biāo)簽,不過IDEA也會自動導(dǎo)入。核心標(biāo)簽按照功能可以分為??

          • 表達式操作: out、set、remove、catch

          • 流程控制: if、choose、when、otherwise

          • 迭代操作: forEach、forTokens

          • URL操作: import、param、url、redirect

          <c:set>標(biāo)簽
          屬性缺省說明
          value-向域中存入的變量值
          var-向域中存入的變量名
          scopepage指定存儲在4個域中的哪一個
          target-Java對象
          property-Java對象的字段(屬性)。因為使用的是反射技術(shù),與前面EL表達式獲取字段值同理:該字段必須有set方法
          <c:out>標(biāo)簽
          屬性缺省說明
          value-需要顯示出來的值
          default-如果value的值為null,則顯示default的值
          escapeXmltrue是否轉(zhuǎn)義xml字符。有些字符如&lt在xml中被認(rèn)為是<,若要它的字面意思,就需要使用轉(zhuǎn)移

          案例 ??

          com.java.testclass.Person

          package com.java.testclass;

          public class Person {
              private String name;
              private int age;

              public Person(String name, int age) {
                  this.name = name;
                  this.age = age;
              }

              @Override
              public String toString() {
                  return name+" is "+age+" years old.";
              }

              public String getName() {
                  return name;
              }

              public void setName(String name) {
                  this.name = name;
              }

              public int getAge() {
                  return age;
              }

              public void setAge(int age) {
                  this.age = age;
              }
          }

          JSTL-test.jsp

          <%@ page import="com.java.testclass.Person" %>
          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
          <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt" %>
          <html>
          <head>
              <title>JSTL-test</title>
          </head>
          <body>

          <%
              pageContext.setAttribute("person1",new Person("Tom",18));
              pageContext.setAttribute("person2",null);
          %>

          <h6>********** set & out Test **********</h6>
          <%--向域中存值--%>
          <c:set var="fruit" value="apple"></c:set>
          <c:set var="fruit" value="banana" scope="session"></c:set>
          <%--設(shè)置Java對象的字段--%>
          <c:set value="David" target="${person1}" property="name"></c:set>
          <c:set target="${person1}" property="age">18</c:set><br>
          <%--輸出--%>
          <c:out value="${fruit} is fruit." default="fruit is null!"></c:out><br>
          person1 : ${person1}<br>
          person2 : <c:out value="${person2}" default="person2 is null!"></c:out><br>
          <c:out value="&lt==when escapeXml is true==&gt"></c:out><br>
          <c:out value="&lt==when escapeXml is false==&gt" escapeXml="false"></c:out><br>

          </body>
          </html>

          結(jié)果

          ********** set & out Test **********

          apple is fruit.
          person1 : David is 18 years old.
          person2 : person2 is null!
          &lt==when escapeXml is true==&gt
          <==when escapeXml is false==>
          <c:if>標(biāo)簽
          屬性缺省說明
          test-if 的條件表達式
          var-定義一個變量存儲if 條件表達式的結(jié)果
          scopepagevar變量的JSP范圍
          <c:choose>標(biāo)簽
          屬性缺省說明
          test如果表達式的結(jié)果為true,則執(zhí)行體內(nèi)容,false則相反
          <c:choose>
              <c:when test="boolean表達式">
              </c:when>
              <c:otherwise>
              </c:otherwise>
          </c:choose>
          <c:forEach>標(biāo)簽

          用于遍歷集合元素

          屬性缺省說明
          var-遍歷用的循環(huán)變量
          items-被遍歷的集合對象
          varStatus-存放本輪循環(huán)變量的相關(guān)參數(shù)
          begin0遍歷起點下標(biāo)
          end最后元素下標(biāo)遍歷終點下標(biāo)
          step1每次迭代的間隔數(shù)

          直接看例子 ??

          <%
              int[] arr = {100,200,300,400,500,600,700,800,900,1000};
              pageContext.setAttribute("arr",arr);
          %>

          <h6>********** process control Test **********</h6>
          foreach arr
          <c:forEach items="${arr}" var="it" begin="1" end="7" step="2" varStatus="status">
              <c:if test="${status.count==1}">
                  from ${status.begin} to ${status.end} by step = ${status.step}<br>
              </c:if>
              arr[${status.index}] = ${it} , count = ${status.count}<br>
          </c:forEach>

          結(jié)果

          ********** process control Test **********

          foreach arr from 1 to 7 by step = 2
          arr[1] = 200 , count = 1
          arr[3] = 400 , count = 2
          arr[5] = 600 , count = 3
          arr[7] = 800 , count = 4

          從結(jié)果count屬性并不是與index屬性關(guān)聯(lián)的值,index是數(shù)組的下標(biāo),count僅作為循環(huán)的計數(shù)器

          <fmt:tag>標(biāo)簽

          <fmt:formatDate>標(biāo)簽

          該標(biāo)簽用于格式化輸出Date類型變量,比較常用

          屬性缺省說明
          value-用于指定被格式化對象
          pattern-格式化的模式,與SimpleDateFormat的參數(shù)設(shè)置一樣
          var-指定產(chǎn)生的格式化字符串所存放的變量,若不指定則直接輸出在頁面中
          scopepage指定var變量的存儲域
          typedate說明value對象包含時間或包含日期還是兩者兼具。取值為date/time/both
          <fmt:parseDate>標(biāo)簽

          <fmt:formatDate>的逆向過程,用于將指定字符串轉(zhuǎn)化為日期類型

          屬性說明
          value用于指定被轉(zhuǎn)化的字符串
          pattern指定解析字符串的格式
          var指定生成的時間對象所存放的變量

          請看測試代碼 ??

          <%
              pageContext.setAttribute("now",new Date());
          %>

          <h6>******************** fmt Test ********************</h6>
          before formatting : ${now}. <br>
          <fmt:formatDate value="${now}" pattern="yyyy-MM-dd" var="parse_date"></fmt:formatDate>
          after formatting  : ${parse_date}. <br>
          <fmt:parseDate value="${parse_date}" var="gotten_date" pattern="yyyy-MM-dd"></fmt:parseDate>
          date get from string : ${gotten_date}. <br>

          結(jié)果

          ******************** fmt Test ********************

          before formatting : Sat Mar 13 23:03:16 CST 2021.
          after formatting : 2021-03-13.
          date get from string : Sat Mar 13 00:00:00 CST 2021

          ? 注意第一個日期與第三個日期的差別,這是由于第一次轉(zhuǎn)換的時候丟失了時間信息

          <fmt:formatNumber>標(biāo)簽

          主要用于控制數(shù)字的展示格式。還記得前面EL運算10/3的結(jié)果展示為3.3333333333333335,通常我們不想展示這么多小數(shù)位。

          屬性說明
          maxIntegerDigits整數(shù)部分最多的位數(shù)
          minIntegerDigits整數(shù)部分最少的位數(shù)
          maxFrctionDigits小數(shù)部分最多的位數(shù)
          minFrctionDigits小數(shù)部分最少的位數(shù)
          var指定存儲格式化結(jié)果的變量
          scope指定var屬性的作用域




          粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

          ??????

          ??長按上方微信二維碼 2 秒


          感謝點贊支持下哈 

          瀏覽 80
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线无.码 | 欧美一区二区三区系列电影 | 久久伊人春色 | 色青草无码视屏 | 婷婷丁香五月亚洲 |