javaweb開發之EL和JSTL

1、EL

1.概述

EL 全名爲Expression Language。 html

EL表達式可用在全部的HTML和JSP標籤中做用是代替JSP頁面中複雜的JAVA代碼。 java

EL主要做用以下:
(1)獲取數據:
EL表達式主要用於替換JSP頁面中的腳本表達式,以從各類類型的web域 中檢索java對象、獲取數據。(例如:某個web域 中的對象,訪問javabean的屬性、訪問list集合、訪問map集合、訪問數組)
(2)執行運算:
利用EL表達式能夠在JSP頁面中執行一些基本的關係運算、邏輯運算和算術運算,以在JSP頁面中完成一些簡單的邏輯運算。如:${user==null}
(3)獲取web開發經常使用對象
EL 表達式定義了一些隱式對象,利用這些隱式對象,web開發人員能夠很輕鬆得到對web經常使用對象的引用,從而得到這些對象中的數據。
(4)調用Java方法
EL表達式容許用戶開發自定義EL函數,以在JSP頁面中經過EL表達式調用Java類的方法。  

mysql

EL表達式是JSP 2.0規範中的一門技術 。所以,若想正確解析EL表達式,需使用支持Servlet2.4/JSP2.0技術的WEB服務器。 程序員

注意:當有些Tomcat服務器如不能使用EL表達式時:
(1)升級成tomcat6;
(2)在JSP中加入<%@ page isELIgnored="false" %>。
web

<%@ page isELIgnored="true"%> 表示是否禁用EL語言,TRUE表示禁止,FALSE表示不由止。JSP2.0中默認的啓用EL語言。
spring

2.語法結構

${expression}

3.訪問EL做用域屬性

3.1 []與.運算符

EL 提供.和[]兩種運算符來存取數據。 sql

當要存取的屬性名稱中包含一些特殊字符,如.或?等並不是字母或數字的符號,就必定要使用 []。例如: 數據庫

${user.My-Name}
應當改成:
${user["My-Name"] }
若是要動態取值時,就能夠用[]來作,而.沒法作到動態取值。例如:
//data是一個變量
${sessionScope.user[data]}

3.2 變量

EL存取變量數據的方法很簡單,例如:${username}。它的意思是取出某一範圍中名稱爲username的變量。由於咱們並無指定哪個範圍的username,因此它會依序從Page、Request、Session、Application範圍查找。假如途中找到username,就直接回傳,再也不繼續找下去,可是假如所有的範圍都沒有找到時,就返回空字符串。 express

屬性範圍在EL中的名稱
    Page             PageScope
    Request         RequestScope
    Session         SessionScope
    Application     ApplicationScope 數組

若是咱們須要指定變量的尋找範圍,能夠在EL表達式中指定搜尋範圍。如:
 ${pageScope.username}
 ${requestScope.username}
 ${sessionScope.username}
 ${applicationScope.username}

在Spring中,全部邏輯處理單元返回的結果數據,都將做爲Attribute被放置到HttpServletRequest 對象中返回(具體實現可參見Spring源碼中org.springframework.web.servlet.view.InternalResourceView.exposeModelAsRequestAttributes方法的實現代碼),也就是說SpringMVC 中,結果數據對象默認都是requestScope。所以,在Spring MVC中,如下尋址方法應慎用:
 ${sessionScope.logininfo.username}
 ${applicationScope.logininfo.username}

4.EL隱含對象

4.1 與範圍有關的隱含對象

與範圍有關的EL隱含對象包含如下四個:pageScope、requestScope、sessionScope和applicationScope,它們基本上就和JSP的pageContext、request、session和application同樣。在EL中,這四個隱含對象只能用來取得範圍屬性值,即getAttribute(String name),卻不能取得其餘相關信息。

例如:咱們要取得session中儲存一個屬性username的值,能夠利用下列方法取得username的值

session.getAttribute("username")
在EL中則使用下列方法:
${sessionScope.username}

4.2 與輸入有關的隱含對象

與輸入有關的隱含對象有兩個:param和paramValues,它們是EL中比較特別的隱含對象。

例如:咱們要取得用戶的請求參數時,能夠利用下列方法:

request.getParameter(String name)
request.getParameterValues(String name)
在EL中則可使用param和paramValues二者來取得數據:
${param.name}
${paramValues.name}

4.3 其餘隱含對象

 1)cookie

 JSTL並無提供設定cookie的動做。

 例:要取得cookie中有一個設定名稱爲userCountry的值,可使用${cookie.userCountry}來取得它。

 2)header和headerValues

 header儲存用戶瀏覽器和服務端用來溝通的數據。

 例:要取得用戶瀏覽器的版本,可使用${header["User-Agent"]}。

 另外在鮮少機會下,有可能同一標頭名稱擁有不一樣的值,此時必須改成使用headerValues 來取得這些值。

 3)initParam

 initParam取得設定web站點的環境參數(Context)。

 例:通常的方法

String userid = (String)application.getInitParameter("userid");
可使用EL表達式獲取:
${initParam.userid}

 4)pageContext

 pageContext取得其餘有關用戶要求或頁面的詳細信息。

${pageContext.request.queryString}         取得請求的參數字符串
${pageContext.request.requestURL}          取得請求的URL,但不包括請求之參數字符串
${pageContext.request.contextPath}         服務的web application 的名稱
${pageContext.request.method}              取得HTTP 的方法(GET、POST)
${pageContext.request.protocol}            取得使用的協議(HTTP/1.一、HTTP/1.0)
${pageContext.request.remoteUser}          取得用戶名稱
${pageContext.request.remoteAddr }         取得用戶的IP 地址
${pageContext.session.new}                 判斷session 是否爲新的
${pageContext.session.id}                  取得session 的ID
${pageContext.servletContext.serverInfo}   取得主機端的服務信息

5.EL運算符

5.1 算術運算符有五個:+、-、*或$、/或div、%或mod

    例:${5+5}    結果是10

5.2 關係運算符有六個:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge

    例:${5>6}    結果是false

5.3 邏輯運算符有三個:&&或and、||或or、!或not

    例:${true and false}    結果是false

5.4 其它運算符有三個:Empty運算符、條件運算符、()運算符

    例:${empty param.name}、${A?B:C}、${A*(B+C)}

6.EL函數

在JSP頁面中調用EL函數庫的步驟:

  1)在工程中導入JSTL包。

  2)在JSP頁面中導入EL函數庫。

<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
   3 )在須要的位置調用EL函數。例如:
${fn:length(list)}

2、自定義標籤

1. 概述

JSP1.1規範中新增了自定義標籤庫規範。

自定義標籤的好處:
能夠將jsp頁面一大段很複雜的代碼簡化成使用一個標籤完成,保持頁面代碼的可讀性。
把jsp中的java代碼隱藏起來,有利於和美工的協同合做。
能夠將jsp頁面重複的代碼封裝後重復使用。

2. 自定義標籤

JSP2.1新版的TagLib容易寫了不少。具體實現和使用方法:

第一步,自定義標籤:

在WEB-INF/tags目錄下放一個hello.tag文件,內容以下,先聲明瞭編碼,和傳入的變量,剩下就是普通的JSP內容了:

<%@tag pageEncoding="UTF-8"%>
<%@ attribute name="user" type="java.lang.String" required="true"%>
Hello, <%==username%>

第二步,使用自定義標籤:

在jsp中指向以前的目錄,以tag文件名做爲tag名稱進行調用:

<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<tags:hello username="admin"/>

3、JSTL

JSTL(JavaServer Pages Standard Tag Library,JSP標準標籤庫)。

從JSP1.1規範開始,JSP就支持在JSP中使用自定義標籤了,自定義標籤的普遍使用,致使了程序員對相同功能的標籤重複定義。爲了解決這個問題,JSTL就誕生了。

JSTL只能運行在支持JSP1.2和Servlet2.3規範的容器上。

JSTL包含兩部分:標籤庫和EL表達式語言。

標籤庫目前支持四種標籤:

1. Core

說明:支持JSP中的一些基本操做。
頁面引入標籤:

<%@ taglib prefix='c' uri="http://java.sun.com/jsp/jstl/core" %>
頁面使用標籤示例:
<c:set var="ctx" value="${pageContext.request.contextPath}" />

2. XML processing

說明:支持XML文檔的處理
頁面引入標籤:

<%@ taglib prefix='x' uri="http://java.sun.com/jsp/jstl/x" %>
頁面使用標籤示例:
<x:parse var="doc" xml="${citizenXML}" />

3. I18N capable formatting

說明:支持JSP頁面的國際化。
頁面引入標籤:

<%@ taglib prefix='fmt' uri="http://java.sun.com/jsp/jstl/fmt" %> 
頁面使用標籤示例:
<fmt:formatDate  value="${now}" type="date" />

4. Database access(sql)

說明:支持JSP對數據庫的操做。
頁面引入標籤:

<%@ taglib prefix='sql' uri="http://java.sun.com/jsp/jstl/sql" %>
頁面使用標籤示例:
<sql:setDataSource var="mysqlDS" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" user="root" password="" />

咱們使用最多的是Core核心標籤庫。更多關於JSTL的資料能夠訪問http://www.codejava.net/java-ee/jstl/

相關文章
相關標籤/搜索