EL表達式與JSTL標籤的基礎知識小結

一、EL表達式


EL表達式語法:${表達式}

特點:
1、可與JSTL結合使用,可與javascript結合使用
2、運算符與優先級:EL會自動進行類型轉換(+可將字符串數值轉換爲數字),除法運算中0爲除數時返回無窮大Infinity
3、訪問數據:EL可以訪問JAVA變量,javabean屬性(jsp:useBean scope="pageScope"),嵌套屬性,集合對象
4、隱含對象:EL可以獲得命名空間,通過PageContext對象可訪問其它內置對象的內置屬性,還可以直接訪問JSP四大作用域的外置屬性
5、EL函數:擴展函數可以與java類靜態方法進行映射

禁用EL
1、元素級【禁用】:使用斜槓“\”: \${expression}
2、頁面級【禁用/啓用】:使用page指令:<%@ page isELIgnored="布爾值" %>
3、應用級【禁用/啓用】:配置web.xml文件
<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <el-ignored>true</el-ignored>
    </jsp-property-group>
</jsp-config>

EL保留字:
變量命名應避免出現下列關鍵字:
and or not             && || !
gt  lt le  ge eq ne    >  <  <=  >=  ==  !=
empty false       
instanceof div
(/ div  % mod)

EL運算符:
訪問數據,算術、邏輯、關係、條件,判斷空

EL隱含對象(共11個):
1、頁面上下文對象pageContext:
【javax.servlet.jsp.pageContext】
不能訪問application,config,pageContext這3個內置對象, 但可以訪問其餘6個內置對象和容器上下文ServletContext對象:
    ${pageContext.request.contextPath}         // 獲取客戶端相關的信息:比如客戶端服務器的上下文根路徑(項目根目錄)
    ${pageContext.request.servletPath}         // 獲取客戶端相關的信息:比如客戶端服務器的當前Servlet路徑(當前Servlet路徑)
    ${pageContext.request.serverName}          // 獲取客戶端相關的信息:比如客戶端服務器的名稱
    ${pageContext.request.serverPort}          // 獲取客戶端相關的信息:比如客戶端服務器的端口號
    【注意:在request中設置的屬性變量不能通過上述方法獲取,只能通過requestScope隱含對象去獲取】
    ${pageContext.response.contentType}        // 獲取與響應相關的信息:比如響應的內容類型
    ${pageContext.session.maxInactiveInterval} // 獲取與session相關的信息:比如session的有效時間
    ${pageContext.out.bufferSize}              // 獲取與輸出相關的信息:比如輸出緩衝區大小
    ${pageContext.page.class}                  // 獲取當前頁面的類文件
    ${pageContext.exception.message}           // 獲取JSP頁面的異常信息:比如異常信息字符串

    ${pageContext.servletContext.contextPath}  // 獲取servlet上下文對象的信息【相當於application】:比如獲取當前上下文頁面的路徑


2、訪問作用域範圍的隱含對象(4個):
應用這4個隱含對象之一指定所要查找標識符的作用域後,系統將不再按照默認的順序:pageContext,request,session,application來查找,將只能用來取得該隱含對象指定範圍內的屬性值。
    pageScope:       返回包含page範圍內(javabean)的屬性值的集合,類型爲java.util.Map對象
    requestScope:    返回包含request範圍內的屬性值的集合,         類型爲java.util.Map對象
    sessionScope:    返回包含session範圍內的屬性值的集合,         類型爲java.util.Map對象
    applicationScope:返回包含application範圍內的屬性值的集合,     類型爲java.util.Map對象


3、訪問環境信息的隱含對象(6個):

param:訪問表單提交的參數(值唯一的情形)
    <input name="career" type="text">
    取值方式:${param.username}
    【如果param指定的參數不存在,則返回 ""】

paramValues:訪問表單提交的參數(值多個的情形,比如複選框)
    <input name="affect" type="checkbox" value="a">A
    <input name="affect" type="checkbox" value="b">B
    <input name="affect" type="checkbox" value="c">C
    取值方式:${paramValues.affect[0]} ${paramValues.affect[1]} ${paramValues.affect[2]}
    【如果paramValues指定的參數不存在,則返回 ""】

header:獲取HTTP請求的一個具體header的值(值唯一的情形)
headerValues:獲取HTTP請求的一個具體header的值(值多個的情形)
    獲取方式:${header.connection} ${header["user-agent"]

initParam:獲取web應用(ServletContext)的初始化參數值
    <context-param>
        <param-name>author</param-name>
        <param-value>hello</param-value>
    </context-param>
    獲取方式:${initParam.author}

cookie:獲取設置的cookie對象和該cookie對象的值
    Cookie ck = new Cookie("shape","circle");
    response.addCookie(ck);
    獲取cookie對象:${cookie.shape}
    獲取cookie名:${cookie.shape.name}
    獲取cookie值:${cookie.shape.value}


EL函數:有問題???




二、JSTL標籤


導入方法:
第1種方法:手動複製jstl.jar和standard.jar到WEB-INF/lib目錄下即可
第2種方法:[測試無效,報錯]將兩個jar包放任意位置,然後通過eclipse->Build path->Libraries->Add Library導入

JSTL標準標籤庫(5部分組成):

★核心標籤庫★:<%@ taglib prefix="c" url="http://java.sun.com/jsp/jstl/core" %>

表達式標籤:  
<c:out> 將表達式值輸出到jsp頁面中,相當於<%=表達式%>
<c:set> 在指定範圍中定義變量,或爲指定對象設置屬性值
<c:remove> 在指定範圍中移除指定變量
<c:catch> 捕獲程序中異常,相當於try...catch語句

URL標籤:     
<c:import> 導入(站內或其它網站)靜態和動態文件到web頁面
<c:url> 按url重寫規則構造一個URL
<c:redirect> 將客戶端request請求重定向到其它url服務端
    <c:param> 爲其它標籤提供參數信息,通常與其它標籤結合使用

流程控制標籤:
<c:if> 根據不同條件處理不同業務,類似於if語句,但沒有else
<c:choose> 根據不同條件完成不同業務邏輯,類似於switch語句
<c:when>
<c:otherwise>

循環標籤:    
<c:forEach> 根據循環條件,遍歷數組和集合類中的數據
<c:forTokens> 迭代字符串中指定分隔符分隔的各成員

格式標籤庫:<%@ taglib prefix="fmt" url="http://java.sun.com/jsp/jstl/fmt" %>
SQL標籤庫:<%@ taglib prefix="sql" url="http://java.sun.com/jsp/jstl/sql" %>
XML標籤庫:<%@ taglib prefix="xml" url="http://java.sun.com/jsp/jstl/xml" %>
函數標籤庫:<%@ taglib prefix="fn" url="http://java.sun.com/jsp/jstl/functions" %>





★所有value屬性值字符串中都可以使用EL表達式★:
【注意:即使在title中也不允許簡單使用標籤<c:set>描述語,而應該用轉義符&lt;c:set&gt;,否則報錯】
<c:out value="${null}" escapeXml="true" default="0"></c:out>

<c:set var="username" value="zhangs" [scope="範圍"] />
<c:set var="username" [scope="page|request|session|application"]>標籤體</c:set>

<c:set target="obj" property="propName" value="red" />
<c:set target="obj" property="propName">標籤體</c:set>

<c:remove var="username" [scope="範圍"] />
【注意:若不指定範圍,將遍歷4個作用域刪除所有找到的變量】

<c:catch var="err"> 可能存在jstl異常和運行時異常的代碼 </c:catch>


★標籤體可包含參數標籤★:<c:param name="xxx" value="xxx"/>
【注意:如果指定了var屬性,將不再輸出,而是將資源保存在該變量中備用】
【注意:context屬性必須以'/'開頭,用於訪問同一服務器的其它web工程,若指定該屬性,則url也必須以'/'開頭】
<c:import url="xxx" [context="context"] [charEncoding="xxx"] [var="xxx"] [scope="xxx"]>標籤體</c:import>
<c:import url="xxx" [context="context"] [charEncoding="xxx"] varReader="xxx">標籤體</c:import>
注意:import可導入站內和站外資源
【注意:import導入拷貝的文件時,記得刷新下項目目錄,否則報錯】

<c:url value="xxx" [var="xxx"] [scope="xxx"] [context="xxx"] >標籤體</c:url>

<c:redirect url="xxx" [context="xxx"]>標籤體</c:redirect>


<c:if test="xxx" [var="xxx"] [scope="xxx"]>標籤體</c:if>
相當於:var result = testValue ;if(result){ ... }

<c:choose>
    <c:when test="xxx">標籤體</c:when>
    [<c:otherwise>標籤體</c:otherwise>]
</c:choose>
其中:<c:when>標籤至少有一個,<c:otherwise>標籤最多一個,且必須放最後


<c:forEach items="xxx" [begin="xxx"] [end="xxx"] [step="xxx"] [var="xxx"] [varStatus="xxx"]>標籤體</c:forEach>
其中:begin,end都是下標從0開始的原始索引
<c:forEach              begin="xxx"   end="xxx"  [step="xxx"] [var="xxx"] [varStatus="xxx"]>標籤體</c:forEach>
若沒有items屬性,則var指定的變量爲數字索引,從begin開始,end結束,step爲步長
    forEach標籤的varStatus有4個屬性:
        index:當前索引值(從0開始的原始索引)
        count:當前計數值(從1開始的自然序列)
        first:當前是否第1次循環,
        last: 當前是否最後1次循環

<c:forTokens items="xxx" delims="xxx" [begin="xxx"] [end="xxx"] [step="xxx"] [var="xxx"] [varStatus="xxx"]>標籤體</c:forTokens>
用指定的分隔符(可以有多個)將字符串分割開,根據分割的數量確定循環的次數






























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章