一:EL表達(dá)式:
1.定義:為了計算和輸出存儲在標(biāo)志位置的Java對象的值,JSP2.0引入了一種簡潔的語言。
2.基本格式:${表達(dá)式}
所有的EL都是以“${”開始,以“}”結(jié)尾
表達(dá)式與開始符和終結(jié)符的空格被忽略
表達(dá)式的值為null,則在頁面中顯示為一個空字符串,而不是null
3.EL表達(dá)式運算符
4.EL的作用域
使用EL的時候,默認(rèn)會以一定順序搜索四個作用域,將最先找到的變量值顯示出來。
5.EL表達(dá)式的隱式對象
EL提供了四個與范圍有關(guān)的隱式對象,對應(yīng)四個存取范圍
pageScope:范圍和JSP的page相同,只限于當(dāng)前頁面
requestScope:范圍和JSP的request相同,范圍限于一次請求
sessionScope:范圍和JSP的session相同,范圍為一次會話
applicationScope:從服務(wù)器一開始執(zhí)行服務(wù),到服務(wù)器關(guān) 閉為止
在EL中,四個隱含對象只能單純用來取得對應(yīng)范圍內(nèi)的屬性值
6.使用EL表達(dá)式的好處
1)代替復(fù)雜代碼,省去條件判斷
2)簡單訪問Bean的屬性:${user.name}
3)使用EL表達(dá)式可以輸出MVC中的內(nèi)容,代碼簡單
例如:Servlet的 doPost()或doGet()方法中,保存在作用域范圍內(nèi)
數(shù)據(jù),可以在其它的JSP頁面獲取。如Servlet中有如下代碼:
request.getSession().setAttribute(“loginedUser”,user);
在JSP頁面中可以這樣獲取:${loginedUser.name}
7.EL顯示Form表單請求參數(shù)信息
EL提供了兩個與輸入有關(guān)的隱含對象:param 和paramValues
用于獲取<form></form>表單提交的信息,用來解析request中的參數(shù)
格式:${param.參數(shù)名}或${paramValues.參數(shù)名}
等同于Java中的request.getParameter(“參數(shù)名”)或request.getParameterValues(“參數(shù)名”)
8.總結(jié)EL表達(dá)式的主要功能
1)EL的功能
2)與<jsp:getProperty />類似
3)簡化<jsp:getProperty />
4)精確的訪問存儲對象
5)Bean屬性的簡略記法
6)空值取代錯誤消息
二.JSTL
1.什么是JSTL
JSTL(JavaServerPages Standard Tag Library)JSP標(biāo)準(zhǔn)標(biāo)簽庫
2.JSTL標(biāo)準(zhǔn)標(biāo)簽庫內(nèi)的標(biāo)簽
3. 核心標(biāo)簽庫
JSTL的核心標(biāo)簽庫標(biāo)簽共13個,從功能上可以分為4類:表達(dá)式控制標(biāo)簽、流程控制標(biāo)簽、循環(huán)標(biāo)簽、URL操作標(biāo)簽。使用這些標(biāo)簽?zāi)軌蛲瓿?/span>JSP頁面的基本功能,減少編碼工作。
(1)表達(dá)式控制標(biāo)簽:out標(biāo)簽、set標(biāo)簽、remove標(biāo)簽、catch標(biāo)簽。
(2)流程控制標(biāo)簽:if標(biāo)簽、choose標(biāo)簽、when標(biāo)簽、otherwise標(biāo)簽。
(3)循環(huán)標(biāo)簽:forEach標(biāo)簽、forTokens標(biāo)簽。
(4)URL操作標(biāo)簽:import標(biāo)簽、url標(biāo)簽、redirect標(biāo)簽。
在JSP頁面引入核心標(biāo)簽庫的代碼為:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
下面將按照功能分類,分別講解每個標(biāo)簽的功能和使用方式。
1) 表達(dá)式控制標(biāo)簽
表達(dá)式控制分類中包括<c:out>、<c:set>、<c:remove>、<c:catch>4個標(biāo)簽,現(xiàn)在分別介紹它們的功能和語法。
1.<c:out>標(biāo)簽
【功能】:用來顯示數(shù)據(jù)對象(字符串、表達(dá)式)的內(nèi)容或結(jié)果。
在使用Java腳本輸出時常使用的方式為:
<% out.println(“字符串”)%>
<%=表達(dá)式%>
使用<c:out>標(biāo)簽就可以實現(xiàn)以上功能。
<c:out value=”字符串”>
<c:out value=”EL表達(dá)式”>
提示:JSTL的使用是和EL表達(dá)式分不開的,EL表達(dá)式雖然可以直接將結(jié)果返回給頁面,但有時得到的結(jié)果為空,<c:out>有特定的結(jié)果處理功能,EL的單獨使用會降低程序的易讀性,建議把EL的結(jié)果輸入放入<c:out>標(biāo)簽中。
<c:out>標(biāo)簽的使用有兩種語法格式。
【語法1】:
<c:out value=”要顯示的數(shù)據(jù)對象” [escapeXml=”true|false”] [default=”默認(rèn)值”]>
【語法2】:
<c:out value=”要顯示的數(shù)據(jù)對象” [escapeXml=”true|false”]>默認(rèn)值
2.<c:set>標(biāo)簽
功能:主要用于將變量存取于JSP范圍中或JavaBean屬性中。
<c:set>標(biāo)簽的編寫共有4種語法格式。
語法1:存值,把一個值放在指定(page、session等)的map中。
<c:set value=”值1” var=”name1” [scope=”page|request|session|application”]>
含義:把一個變量名為name1值為“值1”的變量存儲在指定的scope范圍內(nèi)。
含義:把一個變量名為name2,值為值2的變量存儲在指定的scope范圍內(nèi)。
語法3:<c:set value=”值3” target=”JavaBean對象” property=”屬性名”/>
含義:把一個值為“值3”賦值給指定的JavaBean的屬性名。相當(dāng)與setter()方法。
提示:從共能上分語法1和語法2(未寫)、語法3和語法4(未寫)的效果是一樣的只是把value值放置的位置不同至于使用那個根據(jù)個人的喜愛,語法1和語法2是向scope范圍內(nèi)存儲一個值,語法3和語法4是給指定的JavaBean賦值。
3.<c:remove>標(biāo)簽
<c:remove>標(biāo)簽主要用來從指定的JSP范圍內(nèi)移除指定的變量。
【語法】:
<c:remove var=”變量名” [scope=”page|request|session|application”]/>
其中var屬性是必須的,scope可以以省略。
4.<c:catch>標(biāo)簽:用來處理JSP頁面中產(chǎn)生的異常,并將異常信息存儲。
【語法】:<c:catch var=”name1”>
容易產(chǎn)生異常的代碼
</c:catch>
【參數(shù)說明】:
var表示由用戶定義存取異常信息的變量的名稱。省略后也可以實現(xiàn)異常的捕獲,當(dāng)就不能顯示的輸出異常信息。
4.流程控制標(biāo)簽
流程控制標(biāo)簽主要用于對頁面簡單業(yè)務(wù)邏輯進(jìn)行控制。流程控制標(biāo)簽包含有4個:<c:if>標(biāo)簽、<c:choose>標(biāo)簽、<c:when>標(biāo)簽和<c:otherwise>標(biāo)簽。下面將介紹這些標(biāo)簽的功能和使用方式。
1).<c:if>標(biāo)簽
<c:if>同程序中的if作用相同,用來實現(xiàn)條件控制。
【語法1】:
<c:if test=”條件1” var=”name” [scope=”page|request|session|application”]>
【語法2】:
<c:if test=”條件2” var=”name”[scope=”page|request|session|application”]>
【參數(shù)說明】:
(1)test屬性用于存放判斷的條件,一般使用EL表達(dá)式來編寫。
(2)var指定名稱用來存放判斷的結(jié)果類型為true或false。
(3)scope用來存放var屬性存放的范圍。
【使用場景】:在開發(fā)中經(jīng)常會出現(xiàn)不同用戶的權(quán)限,首先對用戶名進(jìn)行判斷(包括進(jìn)行數(shù)據(jù)庫驗證,該功能可以由JavaBean實現(xiàn),使用EL表達(dá)式得到一個布爾型的結(jié)果),把判斷的結(jié)果存放在不同的JSP范圍內(nèi)(比如常用的session內(nèi)),這樣在每個頁面都可以得到該用戶的權(quán)限信息,根據(jù)不同權(quán)限的用戶顯示不同的結(jié)果。
2).<c:choose>、<c:when>和<c:otherwise>標(biāo)簽
這3個標(biāo)簽通常情況下是一起使用的,<c:choose>標(biāo)簽作為<c:when>和<c:otherwise>標(biāo)簽的父標(biāo)簽來使用。
【語法1】:
<c:choose> <c:when> …..//業(yè)務(wù)邏輯1 </c:when> <c:otherwise> …..//業(yè)務(wù)邏輯2 </c:otherwise> ….//業(yè)務(wù)邏輯3 </c:choose> 【語法2】: <c:when text=”條件”> 表達(dá)式 </c:when> 【語法3】: <c:otherwise> 表達(dá)式 </c:otherwise>
【參數(shù)說明】:
(1)語法1為3個標(biāo)簽的嵌套使用方式,<c:choose>標(biāo)簽只能和<c:when>標(biāo)簽共同使用。
(2)語法2為<c:when>標(biāo)簽的使用方式,該標(biāo)簽都條件進(jìn)行判斷,一般情況下和<c:choose>共同使用。
(3)<c:otherwise>不含有參數(shù),只能跟<c:when>共同使用,并且在嵌套中只允許出現(xiàn)一次。
5.循環(huán)標(biāo)簽
循環(huán)標(biāo)簽主要實現(xiàn)迭代操作。主要包含兩個標(biāo)簽:<c:forEach>和<c:forTokens>標(biāo)簽,我們主要是看<c:forEach>標(biāo)簽
該標(biāo)簽根據(jù)循環(huán)條件遍歷集合(Collection)中的元素。
【語法】:
<c:forEach var=”name” items=”Collection” varStatus=”StatusName” begin=”begin” end=”end” step=”step”>
本體內(nèi)容
</c:forEach>
【參數(shù)解析】:
(1)var設(shè)定變量名用于存儲從集合中取出元素。
(2)items指定要遍歷的集合。
(3)varStatus設(shè)定變量名,該變量用于存放集合中元素的信息。
(4)begin、end用于指定遍歷的起始位置和終止位置(可選)。
(5)step指定循環(huán)的步長。
其中varStatus有4個狀態(tài)屬性(見表9-2)。
表9-2 varStatus的4個狀態(tài)
屬性名 |
類型 |
說明 |
index |
int |
當(dāng)前循環(huán)的索引值 |
count |
int |
循環(huán)的次數(shù) |
frist |
boolean |
是否為第一個位置 |
last |
boolean |
是否為第二個位置 |
6.SQL標(biāo)簽庫
JSTL提供了與數(shù)據(jù)庫相關(guān)操作的標(biāo)簽,可以直接從頁面上實現(xiàn)數(shù)據(jù)庫操作的功能,在開發(fā)小型網(wǎng)站是可以很方便的實現(xiàn)數(shù)據(jù)的讀取和操作。SQL標(biāo)簽庫從功能上可以劃分為兩類:設(shè)置數(shù)據(jù)源標(biāo)簽、SQL指令標(biāo)簽。
引入SQL標(biāo)簽庫的指令代碼為:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
1) 設(shè)置數(shù)據(jù)源
使用<sql:setDataSource>標(biāo)簽可以實現(xiàn)對數(shù)據(jù)源的配置。
【語法1】:直接使用已經(jīng)存在的數(shù)據(jù)源。
<sql:setDataSource dataSource=”dataSource”[var=”name”] [scope=”page|request|session|application”]/>
【語法2】:使用JDBC方式建立數(shù)據(jù)庫連接。
<sql:setDataSource driver=”driverClass” url=”jdbcURL” user=”username” password=”pwd”
[var=”name”]
[scope=”page|request|session|application”]/>
表9-15 <sql:DataSource>特殊標(biāo)簽屬性說明
參數(shù)名 |
說明 |
EL |
類型 |
必須 |
默認(rèn)值 |
dataSource |
數(shù)據(jù)源 |
是 |
String Javax.sql.DataSource |
否 |
無 |
var |
指定存儲數(shù)據(jù)源的變量名 |
否 |
String |
否 |
無 |
提示:是否必須是相對的,比如說如果使用數(shù)據(jù)源則,driver、url等就不再被使用。如果使用JDBC則要用到driver、url、user、password屬性。
提示:可以把數(shù)據(jù)連接的配置存入session中,如果再用到數(shù)據(jù)庫連接只須配置使用DataSource屬性。
2 )SQL操作標(biāo)簽
JSTL提供了<sql:query>、<sql:update>、<sql:param>、<sql:dateParam>和<sql:transaction>這5個標(biāo)簽,通過使用SQL語言操作數(shù)據(jù)庫,實現(xiàn)增加、刪除、修改等操作。下面將介紹這5個標(biāo)簽的功能和使用方式。
1.<sql:query>標(biāo)簽用來查詢數(shù)據(jù)。
【語法】:
<sql:query sql=”sqlQuery” var=”name” [scope=”page|request|session|application”] [dataSource=”dateSource”] [maxRow=”maxRow”] [startRow=”starRow”]/>
【屬性說明】:見表9-16。
表9-16 <sql:query>標(biāo)簽屬性說明
參數(shù)名 |
說明 |
EL |
類型 |
必須 |
默認(rèn)值 |
sql |
查詢數(shù)據(jù)的SQL語句 |
是 |
String |
是 |
無 |
dataSource |
數(shù)據(jù)源對象 |
是 |
String Javax.sql.DataSoutce |
否 |
無 |
maxRow |
設(shè)定最多可以暫存數(shù)據(jù)的行數(shù) |
是 |
String |
否 |
無 |
startRow |
設(shè)定從那一行數(shù)據(jù)開始 |
是 |
String |
否 |
無 |
var |
指定存儲查詢結(jié)果的變量名 |
否 |
String |
是 |
無 |
scope |
指定結(jié)果的作用域 |
否 |
String |
否 |
page |
使用<sql:query>必須指定數(shù)據(jù)源,dataSource是可選的,如果未給定該屬性標(biāo)簽會在page范圍內(nèi)查找是否設(shè)置過數(shù)據(jù)源,如果沒有找到將拋出異常。
一般情況下使用<sql:setDateSource>標(biāo)簽設(shè)置一個數(shù)據(jù)源存儲在session范圍中,當(dāng)需要數(shù)據(jù)庫連接時使用dataSource屬性并實現(xiàn)數(shù)據(jù)庫的操作。
<sql:query>的var屬性是必須的用來存放結(jié)果集,如果沒有指定scope范圍則默認(rèn)為page,即在當(dāng)前頁面我們可以隨時輸出查詢結(jié)果。結(jié)果集有一系列的屬性如表9-17所示。
maxRows和startRow屬性用來操作結(jié)果集,使用SQL語句首先吧數(shù)據(jù)放入內(nèi)存中,檢查是否設(shè)置了startRow屬性,如果設(shè)置了就從starRow指定的那一行開始取maxRows個值,如果沒有設(shè)定則從第一行開始取。
表9-17 結(jié)果集參數(shù)說明
屬性名 |
類型 |
說明 |
rowCount |
int |
結(jié)果集中的記錄總數(shù) |
Rows |
Java.util.Map |
以字段為索引查詢的結(jié)果 |
rowsByIndex |
Object[] |
以數(shù)字為作索引的查詢結(jié)果 |
columnNames |
String[] |
字段名稱數(shù)組 |
limitedByMaxRows |
boolean |
是否設(shè)置了maxRows屬性來限制查詢記錄的數(shù)量 |
提示:limitedByMaxRows用來判斷程序是否收到maxRows屬性的限制。并不是說設(shè)定了maxRows屬性,得到結(jié)果集的limitedByMaxRows的屬性都為true,當(dāng)取出的結(jié)果集小于maxRows時,則maxRows沒有對結(jié)果集起到作用此時也為false。例如可以使用startRow屬性限制結(jié)果集的數(shù)據(jù)量。
結(jié)果集的作用就是定義了數(shù)據(jù)在頁面中的顯示方式。下面給出了結(jié)果集每個屬性的作用。
q rowCount屬性。該屬性統(tǒng)計結(jié)果集中有效記錄的量,可以使用于大批量數(shù)據(jù)分頁顯示。
q Rows屬性。等到每個字段對應(yīng)的值。返回的結(jié)果為:字段名={字段值···}
q rowsByIndex屬性。常用得到數(shù)據(jù)庫中數(shù)據(jù)的方式,從有效行的第一個元素開始遍歷,到最后一個有效行的最后一個元素。
q columnNames屬性。用于得到數(shù)據(jù)庫中的字段名。
q limitedByMaxRows屬性。用于判斷是否受到了maxRows的限制。
2).<sql:update>標(biāo)簽
<sql:update>用來實現(xiàn)操作數(shù)據(jù)庫如:使用create、update、delete和insert等SQL語句,并返回影響記錄的條數(shù)。
【語法】:SQL語句放在標(biāo)簽屬性中。
<sql:update sql=”SQL語句” [var=”name”] [scope=”page|request|session|application”] [dateSource=”dateSource”]/>
提示:<sql:update>標(biāo)簽的屬性同<sql:query>標(biāo)簽的屬性相比只減少了maxRows和startRow2個屬性。其他參數(shù)用法一樣。
使用<sql:update>可以實現(xiàn)數(shù)據(jù)表的創(chuàng)建、插入數(shù)據(jù)、更行數(shù)據(jù)、刪除數(shù)據(jù)。使用時只須在標(biāo)簽中放入正確的SQL語句即可,同時要捕獲可能產(chǎn)生的異常。本節(jié)只對一個簡單的插入操作進(jìn)行說明。
3.<sql:param>標(biāo)簽
<sql:param>標(biāo)簽用于動態(tài)的為SQL語句設(shè)定參數(shù),同<sql:query>標(biāo)簽共同使用。可以防止SQL注入作用類似于java.sql.PreparedStatement。
【語法】:
<sql:param value=”value”/>
【參數(shù)說明】:
value的作用為SQL中的參數(shù)賦值。
4.<sql:dataParam>標(biāo)簽主要用于為SQL標(biāo)簽填充日期類型的參數(shù)值。
【語法】:<sql:dateParam value=”date”[type=”timestamp|time|date”]/>
【參數(shù)說明】:
q value屬性:java.util.Date類型的參數(shù)。
q type屬性:指定填充日期的類型timestamp(全部日期和時間)、time(填充的參數(shù)為時間)、date(填充的參數(shù)為日期)。
5.<sql:transaction>標(biāo)簽
<sql:transaction>標(biāo)簽提供了數(shù)據(jù)操作的一種安全機(jī)制(即事務(wù)回滾),當(dāng)操作數(shù)據(jù)庫的某條SQL語句發(fā)生異常時,取消<sql:transaction>標(biāo)簽體中的所有操作,恢復(fù)原來的狀態(tài),重新對數(shù)據(jù)庫進(jìn)行操作。
【語法】:
<sql:transaction [dataSource=”dataSource”] [isolation=”read_committed|read_uncommitted|repeatable|serializable”] > <sql:query> <sql:uptade> </sql:transation>