JSP/Servlet開發——第八章 JSTL和EL

一、 EL表達式:java

●須要EL表達式的緣由:正則表達式

  ◆在JSP中使用Java腳本的侷限:數據庫

    1)、在JSP頁面中嵌入大量的Java代碼;express

    2)、訪問結構比較複雜的數據時代碼煩瑣,且常常須要強制類型轉換;數組

      eg:<% session

               Employee employee = (Employee) request.getAttribute("employee");app

               Computer comp = employee.getComputer();jsp

               String manufacturer = comp.getManufacturer();工具

        %>測試

       3)、EL表達式使JSP的開發變得更加簡單;

            eg:${requestScope.employee.computer.manufacturer}

EL表達式:EL表達式的全稱是 Expression Language , 它是一種借鑑了 JavaScript 和 XPath 的表達式語言,EL表達式定義了一系列的隱含對象和操做符,使開發人員可以很方便地訪問頁面的上下文,以及不用域內的對象,而無須在 JSP 頁面嵌入Java 代碼,從而使開發人員即便不熟悉 Java 也能輕鬆地編寫JSP程序;

EL表達式的功能:替代JSP頁面中數據訪問時的複雜編碼;

EL表達式的特色和使用範圍:

  ◆EL表達式提供了在 Java 代碼以外, 訪問和處理應用程序數據的功能, 一般用於在某個做用域(page、request、session、application 等) 內取得屬性值,或者作簡單的運算和判斷。

  ◆EL 表達式有如下特色:

        自動轉換類型轉換,在使用 EL 獲得某個數據時能夠自動轉換類型,對於類型的限制比較寬鬆;

    ★使用筒單,與 JSP 頁面中嵌入的 Java 代碼相比,EL表達式使用起來很是簡單;

      eg:每一個僱員都擁有一臺計算機,若是想獲得計算機的生產廠商信息,只須要把該僱員對象放在某個做用域(此處以 request 爲例 ) 中,而後在 JSP 頁面中調用 ${requestScope.employee.computer.manufacturer}便可;

EL 表達式的語法:

  ${ EL expression }

     ◆EL表達式的兩個要素:$和{ },二者缺一不可;

    ▲經過變量名取值

    ▲獲取對象的屬性值

    ▲獲取集合元素

    ▲執行表達式

    ★1)、點操做符:EL 表達式一般由兩部分組成:對象和屬性。就像在Java代碼中同樣,在 EL 表達式中也能夠點操做符「.」 來訪問對象的某個屬性。

        eg:經過${ employee.computer }能夠訪問 employee 對象computer屬性,而經過引${ employee.computer.manufacturer}則能夠訪問某個僱員所使用的計算機的產廠商;

         2)、[ ]操做符:與點操做符相似,「[ ]」操做符也能夠訪問對象的某個屬性,${ employee[「computer」] }能夠訪問僱員的計算機屬性。可是,除此以外,「[ ]」操做符還提供了更增強大的功能:

        ▲當屬性名中包含了特殊字符如 「.」或 '一’ 等的狀況下,就不能使用點操做符來訪問,這時只能使用 」[ ]" 操做符;

        ▲訪問數組,若是有一個對象名爲 array 的數組,那麼能夠根據索引值來訪問其中的元素,如:${array[0]}、${array[1]}等;

        ▲「[ ]」操做符中可使用變量實現動態訪問,如 ${employee[propertyNamel],propertyName是另外一個變量,改變其值能夠動態訪問employee的不一樣屬性;

              eg1:<body>

                <%

                          // 在Servlet或JSP中保存數據

                  Map names = new HashMap();

                  names.put("one", "LiYang");

                  names.put("two", "WangHua");

                  request.setAttribute("names", names);

                %>

                  // 在JSP中訪問數據

                  姓名:${ names.one }<br/>

                  姓名:${ names["two"] }<br/>

                   </body>

                  分析:在eg1的代碼中,使用了 Map 存儲姓名的集合,在 JSP 頁面中則分別調用了 EL 表達式的兩運算符進行姓名的輸出顯示:

                   輸出結果:

                          

 

                eg2:<body>

                  <%

                    // 在Servlet或JSP中保存數據

                    List names = new ArrayList();

                    names.add(0, "LiYang");

                    names.add(1,"WangHua");

                    request.setAttribute("names",names);

                  %>

                    // 在JSP中訪問數據

                    姓名:${ names[0] }<br/>

                    姓名:${ names[1] }<br/>

                      </body>

                      分析:在eg2的代碼中,使用了List存儲姓名的集合,在 JSP 頁面中則使用[ ]指定元素下標:輸出結果以下:

                                  

●${變量名}

  eg:   // 在Servlet或JSP中保存數據

      request.setAttribute("username", "LiYang");

      // 在JSP中訪問數據

      姓名: ${username}         ${requestScope.username}

      分析:按照page → request → session → application的做用域順序依次查找,找到即返回,最終找不到返回null;

         ▲指定做用域:

屬性範圍

EL中的名稱

page

pageScope,例如${pageScope.username}表示在page做用域查找變量username,找不到返回null

request

requestScope

session

sessionScope

application

applicationScope

 

●關係操做符:

  關係操做符

說明

示例

結果

==(或eq)

等於

${23==5}${23 eq 5}

${"a" =="a"}${"a" eq "a"}

false

true

!=(或ne)

不等於

${23!=5}或${23 ne 5}  

true

<(或lt)

小於

${23<5}或${23 lt 5}    

false

>(或gt)

大於

${23>5}或${23 gt 5}  

true

<=(或le)

小於等於

${23<=5}或${23 le 5}

false

>=(或ge)

大於等於

${23>=5}或${23 ge 5}     

ture

 

●邏輯操做符:

邏輯操做符

說明

示例

結果

&&(或and)

邏輯與 

若是AtrueBfalse,則${ A && B } (或${ A and B } )

false

||(或or)

邏輯或

若是A爲true,B爲false,則${ A || B} (或 ${ A or B } )

true

! (或not)

邏輯非

若是A爲true,則${ ! A } ( 或${ not A } )

false

 

Empty操做符:Empty操做符是一個前綴操做符,用於檢測一個變量值是否爲 null或者爲empty ( 如長度爲 0的字符串變量或集合變量)。例如,變量 a 不存在,則${ empty a }返回的結果爲true,${ not empty a }或${ ! empty a }返回的結果爲false;

二、 EL表達式隱式對象:

JSP提供了 page、request、session、application. pageContext 等若干隱式對象。這些隱式對象無需聲明,就能夠很方便地在 JSP 頁面中使用。相應地,在 EL 表達式語言中也提供了一系列能夠直接使用的隱式對象。EL 隱式對象按照使用途徑的不一樣分爲做用域訪問對象、參數訪問對象和JSP隱式對象;

以下圖:

     

●做用域訪問對象:開發 Java Web 應用時,能夠把變量存放在不一樣做用域中以知足不一樣範圍的訪問需求,做用域共有四個選項:page、request、session、application。在 EL 表達式中,爲了訪問這四個做用域內的變量和屬性;

對象名稱

說  明

pageScope

與page做用域相關聯的Map對象

requestScope

與request做用域相關聯的Map對象

sessionScope

與session做用域相關聯的Map對象

applicationScope

與application做用域相關聯的Map對象

  當使用 EL 表達式訪問某個變量時,應該指定查找的範圍,如 ${requestScope.employee}即在請求做用域範圍內查找 employee 變量,若是不指定查找範圍,即${ employee},則會按照 page - request- session - application 的順序依次查找 employee 變量;

●參數訪問對象:參數訪問對象是與頁面輸入參數有關的隱式對象,經過它們能夠獲得用戶的請求參數;

  對象名稱

說  明

param

按照請求參數名稱返回單一值的Map對象

paramValues

按照請求參數名稱返回String數組的Map對象

   二者之間的不一樣之處在於,param 對象用於獲得請求中單一名稱的參數,而paramValues對象用於獲得請求中的多個值。

    例如:在用戶註冊時 一般只填寫一個名爲 userName 的參數,那麼就能夠用${param:username}來訪問此參數,等同於調用 request.getParameter (「usernames」);而在用戶註冊時,也能夠選擇多個業餘愛好 (habits) ,這樣經過${paramValues:habits}能夠獲得用戶全部選擇的值等同於調用request.getParameterValues ( 「habits」);

JSP 隱式對象:爲了可以方便地訪問 JSP 隱式對象,EL表達式語言引入了pageContext;它是 JSP和EL的一個公共對象,經過 pageContext 能夠訪問其餘八個 JSP 內置對象,這也是EL表達式語言把它做爲內置對象的一個主要緣由;

對象名稱

說  明

pageContext

提供對頁面信息和JSP內置對象的訪問

 

三、JSTL標籤:

●EL表達式封裝了數據訪問的功能,而JSTL標籤庫則封裝了邏輯控制、循環控制以及數據格式化等功能,兩者結合使用才能完整實現動態頁面的開發需求;

JSTL 的全稱是 Java Server Page Standard Tag Library , 即 JSP 標準標籤庫。它包含了在開發JSP頁面時常常用到的一組標準標籤,這些標籤提供了一種不用嵌入Java 代碼就能夠開發複雜的JSP頁面的途徑。JSTL 標籤庫包含了多種標籤,如通用標籤、條件判斷標籤和迭代標籤等。

優勢:提供一組標準標籤、可用於編寫各類動態功能;

 ●使用JSTL的步驟:

   1)在工程中引用 JSTL 的兩個jar文件和標籤庫描述符文件 (擴展名爲 .tld)。

      ◆正如使用JDBC鏈接數據庫那樣,使用 JSTL定義的標籤庫也必須在工程中導入兩個jar文件,jstl.jar和standard.jar,除此之外,標籤庫描述符文件也是必需的,這些資源都能在網上下載獲得。

      ◆在 MyEclipse 中已經集成了 JSTL,所以這一過程能夠由工具代爲實現,方法以下:首先執行 'File' — 'New' — 'Web Project' 命令, 彈出 'New Web Project'窗口,在該窗口中的’J2EE Specification Level' 選項組中選中 ’J8va EE 5.0" 或 「 Java EE 6.0' 單選按鈕,MyEclipse會自動在項目中添加 JSTL 所需的jar文件和標籤庫描述符文件。而若是選擇更低的版本,則須要勾選「Add JSTL Libraries to WEB-INF/lib folder?「複選框;如圖所示,而後單擊 ’Finish' 按鈕;

                              

     2)、在須要使用 JSTL 的 JSP 頁面中使用 taglib 指令導入標籤庫描述符文件,例如,要使用JSTL核心標籤庫,須要在 JSP 頁面的上方增長以下的 taglib 指令:

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

             taglib 指令經過 uri 屬性引用某個標籤庫的配置文件, JSP 頁面中經過 prefix 屬性指定的前綴便可訪問該標籤庫中的某個標籤功能,語法:<c:標籤名>

     3)、使用JSTL標籤;

JSTL 核心標籤庫:顧名思義,核心標籤庫在 JSTL 中佔有十分重要的地位。JSTL 核心標籤庫按照功能的不一樣又爲通用標籤庫、條件標籤庫、迭代標籤庫等;

           

通用標籤庫:通用標籤庫用於在 JSP 頁面內設置、顯示和刪除變量,它包含三個標籤:<c:set>、<c:out>、<c : remove>;

  ▲<c:set>標籤:<c:set>標籤用於設置做用域變量的值或者做用域變量的屬性值,其語法格式分爲以下兩種

    (1) 將 value 值存儲到範圍爲 scope 的變量 variable 中:

             <c:set  var="variable"  value="value"  scope="scope" />

          ★var:屬性的值是設置的變量名

          ★value:屬性的值是賦予變量的值

          ★scope屬性對應的是變量的做用域,可選值有 page、request、 session和application

        eg:在請求範圍內將變量 currentlndex 的值設置爲 8,用<c:set>標籤能夠寫爲:

          <c:set va=「currentlndex「value=」8「 scope="request">

      (2) 將value值設置到對象的屬性中:

      <c:set  target="target"  property="property"  value="value" />
        
target屬性是操做的 JavaBean 對象 可使用 EL 表達式來表示;

        ★property屬性:對應 JavaBean 對象的屬性名

        ★value 屬性是賦予 Java8ean 對象屬性的值;

      eg:  // 在Servlet或JSP中設置JavaBean

          User  user = new  User();

          request.setAttribute("user",  user);

          // 在JSP中修改JavaBean的屬性值

          <c:set target="${user}" property="name" value="defaultName" />

   ▲<c:out>標籤:<c:out>標籤用於將計算的表達式結果輸出顯示,相似於 JSP 中的<%=%>,可是功能更增強大,代碼也更加簡潔,方便頁面維護。

    ◆其語法格式分爲指定默認值和不指定默認值兩種形式:

      1)、不指定默認值:

          語法:<c:out  value="value" />

             value 屬性指須要輸出的正則表達式的運算結果,能夠經過EL表達式來獲;

      2)、指定默認值:

          語法:<c:out  value="value"  default="default" />

              ★default 屬性是 value屬性的值爲空時輸出的默認值。

              ★<c:out>標籤還有一個escapeXml屬性:表示是否轉換特殊字符,用於指定在使用<c:out>標籤輸出諸如<、>或 ` 或 「 或 & 之類在HTML和XML文件中具備特殊意義的字符時是否應該進行轉義escapeXml屬性設置爲 true , 則會自動進行轉義處理,這也是默認值;    

                      eg:out:計算表達式並將結果輸出顯示,轉義特殊字符

                                  <p>${ "<a href='http://www.baidu.com'>百度</a>" }</p>

            <p>

            <c:out  escapeXml="false" value="<a href='http://www.baidu.com'>百度</a>" />

            </p>

            <p><c:out  value="<a href='http://www.baidu.com'>百度</a>" /></p>

          運行結果:

                

            分析:從運行效果能夠看出,將<c:out>標籤的 escapeXml 屬性設置爲 'false「 與直接使用 EL 表達式效果相同;

    <c : remove>標籤:<c : remove>分用於移除指定做用域內的指定變量;

            語法:<c:remove  var="variable"  scope="scope" />

                    var 屬性是指待移除的變量的名稱;

            ★scope屬性是指移除的變量所在的範圍,可選項有 page、request、session、application,若是沒有指定,則默認爲 page;

        eg:在下面示例中,首先使用<c:set>標籤在 page 範圍內設置一個變量的值,經過<c:out>標籤把該量顯示在頁面上,而後用<c : remove>標籤在page 範圍內刪除該變量,並使用<c:out>標籤檢查該量是否已經刪除;

             

                        運行結果:

                                 

        

 

◆條件標籤庫:JSTL 的條件標籤包括<c : if> 、<c : choose>、<c:when>和<c : otherwise>標籤;

    ▲<c : if>標籤:用於實現 Java 語言中 if 語句的功能;

         語法:

            <c:if   test="codition"   var="variable"  scope="scope" >

                 主體內容

      </c:if>

      ★test 屬性是判斷條件, 當 condition (能夠用EL表達式表示) 的結果爲 true 時,會執行主內容,若是爲 false 則不會執行;

      ★var 屬性定義變最,該變量存放判斷的結果,該屬性能夠省略

      ★scope 屬性是指 var 定義變量的存儲範圍,可選值有 page、request、session 和application,該屬性能夠省略;

          eg:使用if標籤判斷是否登陸:

              

    ▲<c : choose>標籤:<c : choose>、<c:when>和<c : otherwise>一塊兒實現互斥條件的執行、相似於 Java 語言的if-else if-else語句。

         語法:<c:choose var=「vaeName」 scope=「scope」>

                         <c:when test="condition1">

                                 內容1

                        </c:when>

                         <c:when test="condition2">

                               內容2

                        </c:when>

                              ……

                         <c:otherwise>

                               內容n

                         </c:otherwise>

        </c:choose >

          ★<c : choose>是做爲 <c:when>和<c : otherwise>的父標籤使用的,除了空白字符外,<c : choose>的標籤體只能包含這兩個標籤;

          ★<c:when>標籤必須有一個直接的父標籤<c : choose>並且必須在同一個父標籤下<c : otherwise>標籤以前出現,在同一個父標籤<c : choose>中,能夠有多個<c:when>標籤;

          ★<c : otherwise>標籤必須有一個直接的父標籤<c : choose>, 並且必須是<c : choose>標籤最後一個嵌套的標籤;

          ★在運行時,判斷<c:when>標籤的測試條件是否爲 true , 第一個測試條件爲 true 的<c:when>標籤體被 JSP 容器執行。若是沒有知足條件的<c:when>標籤 , 那麼<c : otherwise>的標體將被執行;

 

迭代標籤庫:<c:forEach>標籤有兩種語法格式:一種用於遍歷集合對象的成員,另外一種用於使語句循環執行指定的次數;

     遍歷集合對象的成員:

      語法: <c:forEach   items="collection"   var="varName"   begin="start"  end="end"  step="stepSize"  varStatus="status"  >

                       …循環體代碼…

          </c:forEach>

              ★var屬性是對當前成員的引用, 即若是當前循環到第一個成員,var 就引用第一個成員,若是當前循環到第二個成員,它就引用第二個成員. 以此類推;

              ★ items:指被迭代的集合對象;

              ★varStatus 屬性用於存放 var 引用的成員的相關信息,如索引等;

              ★begin 屬性示開始位置, 默認爲 0, 該屬性能夠省略;

              ★end 屬性表示結束位置,該屬性能夠省略;

              ★step 表示循環的步長,默認爲 1,該屬性能夠省略;

  ▲指定語句執行次數:

      語法:<c:forEach var="varName"  varStatus=" varStatusName" begin=" beginIndex"  end="endIndex"  step="step" >

                     …循環體代碼…

        </c:forEach>

                        var 屬性是對當前成員的引用;

            ★varStatus 屬性用於存放 var 引用的成員的相關信息,如索引等;

            ★begin屬性表示開始位置, 默認爲 0, 該屬性能夠省略;

            ★end 屬性表示結束位置,該屬性能夠省略;

            ★step屬性表示循環的步長, 默認爲 1, 該屬性能夠省略格式;

  ■格式2 與格式 1 的區別是:格式 2 不是對一個集合對象遍歷, 而是根據指定的 begin 屬性、 end屬性以及 step 屬性執行主體內容固定的次數;

四、JSTL遍歷集合:

數組或集合

訪問方式

 int[] ages = { 1, 2, 3, 4, 5 }; 

// 普通數組,JSTL直接使用JSP賦值表達式來取

遍歷數組

<c:forEach var="age" items="<%= ages %>">

  <c:out value="${age}" />

</c:forEach>

List<String> names = new LinkedList<String>(); // List

    names.add("Biao");

    names.add("");

    names.add("");

    request.setAttribute("names", names); // 添加到request

遍歷List:

<c:forEach var="name" items="<%= names %>">

    <c:out value="${name}" />

</c:forEach>

 

遍歷List:

<c:forEach var="name" items="${names}">

    <c:out value="${name}" />

</c:forEach>

List<User> users = new ArrayList<User>(); // JavaBeanList

    users.add(new User("黃彪""xxxxxx"));

    users.add(new User("昊天""xxxxxx"));

    users.add(new User("姐姐""yyyyyy"));

    users.add(new User("丫頭""zzzzzz"));

    session.setAttribute("users", users); // 添加到session

遍歷UserBeanList:

<c:forEach var="user" items="${users}">

  <c:out value="${user.username}"/>

  <c:out value="${user.password}"/>

</c:forEach>

Set<String> set = new TreeSet<String>(); // Set

    set.add("One");

    set.add("One");

    set.add("Two");

    set.add("Three");

    set.add("Set");

遍歷Set:

<c:forEach var="entry" items="<%= set %>">

    <c:out value="${entry}" />

</c:forEach>

 

Map<String, String> map = new HashMap<String, String>(); // Map

    map.put("1""黃彪");

    map.put("2""丫頭");

    map.put("3""哥哥");

    map.put("4""笨蛋");

遍歷Map:

//注意:遍歷map時候var="entry"只能這麼寫

<c:forEach var="entry" items="<%= map %>">

  key<c:out value="${entry.key}"/>

  value<c:out value="${entry.value}"/>

</c:forEach>

五、總結:

      

 
相關文章
相關標籤/搜索