JSTL SQL標簽庫 使用


推薦博客:http://blog.sina.com.cn/s/blog_4f925fc30101820u.html

怕博主把原文刪了,所以在這里先保存一下、

SQL標簽庫

JSTL提供了與數據庫相關操作的標簽,可以直接從頁面上實現數據庫操作的功能,在開發小型網站是可以很方便的實現數據的讀取和操作。本章將詳細介紹這些標簽的功能和使用方法。

SQL簽庫從功能上可以划分為兩類:設置數據源標簽、SQL指令標簽。

引入SQL標簽庫的指令代碼為:

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

設置數據源

使用<sql:setDataSource>標簽可以實現對數據源的配置。

【語法1】:直接使用已經存在的數據源。

<sql:setDataSource dataSource=”dataSource”[var=”name”]

                           [scope=”page|request|session|application”]/>

【語法2】:使用JDBC方式建立數據庫連接。

<sql:setDataSource driver=”driverClass” url=”jdbcURL”

                                              user=”username”

                                              password=”pwd”                

                                              [var=”name”]

                                              [scope=”page|request|session|application”]/>

【參數說明】:見表9-15

9-15 <sql:DataSource>標簽屬性說明

 

參數名

說明

EL

類型

必須

默認值

dataSource

數據源

String

Javax.sql.DataSource

driver

使用的JDBC驅動

String

url

連接數據庫的路徑

String

user

連接數據庫的用戶名

String

password

連接數據庫的密碼

String

var

指定存儲數據源的變量名

String

scope

指定數據源存儲的JSP范圍

String

page

 

提示:是否必須是相對的,比如說如果使用數據源則,driverurl等就不再被使用。如果使用JDBC則要用到driverurluserpassword屬性。

例如連接SQL Server需要進行如下配置:

Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"

url=” jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs"

user=”sa”

password=””

使用<fmt:setDataSource>配置的代碼如下:

<fmt:setDataSource driver=”com.microsoft.jdbc.sqlserver.SQLServerDriver”

                  url=”jdbc.microsoft:sqlserver://localhost:1433;DatabaseName=pubs”

                  user=”sa”

                  password=””>

如果連接其他數據庫,只須把相對應的項修改即可。

提示:可以把數據連接的配置存入session中,如果再用到數據庫連接只須配置使用DataSource屬性。

2 SQL操作標簽

JSTL提供了<sql:query><sql:update><sql:param><sql:dateParam><sql:transaction>5個標簽,通過使用SQL語言操作數據庫,實現增加、刪除、修改等操作。下面將介紹這5個標簽的功能和使用方式。

1<sql:query>標簽

<sql:query>標簽用來查詢數據。

【語法1】:

<sql:query sql=”sqlQuery” var=”name” [scope=”page|request|session|application”]

                  [dataSource=”dateSource”]

                  [maxRow=”maxRow”]

                  [startRow=”starRow”]/>

【語法2】:

<sql:query var=”name” [scope=”page|request|session|application”]

                  [dataSource=”dateSource”]

                  [maxRow=”maxRow”]

                  [startRow=”starRow”]

sqlQuery

</sql:query>

【屬性說明】:見表9-16

9-16 <sql:query>標簽屬性說明

 

參數名

說明

EL

類型

必須

默認值

sql

查詢數據的SQL語句

String

dataSource

數據源對象

String

Javax.sql.DataSoutce

maxRow

設定最多可以暫存數據的行數

String

startRow

設定從那一行數據開始

String

var

指定存儲查詢結果的變量名

String

scope

指定結果的作用域

String

page

 

使用<sql:query>必須指定數據源,dataSource是可選的,如果未給定該屬性標簽會在page范圍內查找是否設置過數據源,如果沒有找到將拋出異常。

一般情況下使用<sql:setDateSource>標簽設置一個數據源存儲在session范圍中,當需要數據庫連接時使用dataSource屬性並實現數據庫的操作。

<sql:query>var屬性是必須的用來存放結果集,如果沒有指定scope范圍則默認為page,即在當前頁面我們可以隨時輸出查詢結果。結果集有一系列的屬性如表9-17所示。

maxRowsstartRow屬性用來操作結果集,使用SQL語句首先吧數據放入內存中,檢查是否設置了startRow屬性,如果設置了就從starRow指定的那一行開始取maxRows個值,如果沒有設定則從第一行開始取。

9-17 結果集參數說明

 

屬性名

類型

說明

rowCount

int

結果集中的記錄總數

Rows

Java.util.Map

以字段為索引查詢的結果

rowsByIndex

Object[]

以數字為作索引的查詢結果

columnNames

String[]

字段名稱數組

limitedByMaxRows

boolean

是否設置了maxRows屬性來限制查詢記錄的數量

 

提示:limitedByMaxRows用來判斷程序是否收到maxRows屬性的限制。並不是說設定了maxRows屬性,得到結果集的limitedByMaxRows的屬性都為true,當取出的結果集小於maxRows時,則maxRows沒有對結果集起到作用此時也為false。例如可以使用startRow屬性限制結果集的數據量。

結果集的作用就是定義了數據在頁面中的顯示方式。下面給出了結果集每個屬性的作用。

q        rowCount屬性。該屬性統計結果集中有效記錄的量,可以使用於大批量數據分頁顯示。

q        Rows屬性。等到每個字段對應的值。返回的結果為:字段名={字段值···}

q        rowsByIndex屬性。常用得到數據庫中數據的方式,從有效行的第一個元素開始遍歷,到最后一個有效行的最后一個元素。

q        columnNames屬性。用於得到數據庫中的字段名。

q        limitedByMaxRows屬性。用於判斷是否受到了maxRows的限制。

【示例代碼】:代碼9.20給出了配置數據庫連接,和使用<sql:query>查詢數據以及結果集屬性的使用。

代碼9.20 數據庫示查詢示例:sqldemo01.jsp

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

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

<%@ page contentType="text/html;charset=GBK"%>

<html>

<head>

 <title>JSTL: SQL標簽</title>

</head>

<body >

<h3>SQL標簽庫</h3>

<hr>

<sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"

        url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"

        user="sa" password="" />

<sql:query var="result" sql="select * from person" maxRows="2" startRow="1"/>

結果集的實質是:${result}<br>

得到的行數為:${result.rowCount}<br>

是否收到了maxRows的限制:${result.limitedByMaxRows}

<hr>

<table border="1" align="center">

<tr><c:forEach var="columnName" items="${result.columnNames}">

<td>

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

</td>

</c:forEach> </tr>

<c:forEach var="row" items="${result.rowsByIndex}">

<tr>

<c:forEach var="column" items="${row}">

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

</c:forEach>

</tr>

</c:forEach>

</table>

</body>

</html>

【代碼解析】:

1)配置數據源。使用<sql:dataSource>標簽配置數據源,因為只共本頁使用因此存儲在默認的page范圍中。

2)使用<sql:query>標簽進行數據庫查詢,並定義了maxRowsstartRow屬性。並把結果集存儲於作用於page范圍的result變量。使用${result}輸出可以發現結果集就是一個ResultImpl類。

提示:在進行數據源配置時程序不會檢查數據庫連接是否配置正確,直接根據設定的數據庫及連接訪問,如果沒有找到則拋出操作的表異常,因此要放如<c:catch></c:catch>同時在編寫程序時一定要注意數據源是否配置正確。

3)使用結果集的rowCount屬性得到記錄的總量。代碼為:

${result.rowCount}

4)使用結果集的limitedMaxRows屬性判斷是否收到maxRows設定的影響。代碼為:

${result.limitedMaxRows}

5)從結果集中得到數據庫中定義的所有的字段。${result.columnnames}得到的結果是一個字符串數組,因此需要使用<c:forEach>循環輸出。代碼如下:

<c:forEach var="columnName" items="${result.columnNames}">

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

</c:forEach>

6)從結果集中得到所有的值。首先要遍歷每一行,然后遍歷每一行中的元素,因此需要循環嵌套。代碼如下:

<c:forEach var="columnName" items="${result.columnNames}">

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

</c:forEach>

<c:forEach var="row" items="${result.rowsByIndex}">

<c:forEach var="column" items="${row}">

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

</c:forEach>

</c:forEach>

提示:在代碼解析中省略了html元素表格等標簽的元素,本示例適用於任何數據庫表,只要把數據庫的URL、使用的JDBC進行相應的配置和操作的數據表名進行相應的修改即可看到結果。

2<sql:update>標簽

<sql:update>用來實現操作數據庫如:使用createupdatedeleteinsertSQL語句,並返回影響記錄的條數。

【語法1】:SQL語句放在標簽屬性中。

<sql:update sql=”SQL語句” [var=”name”] [scope=”page|request|session|application”]

                                                       [dateSource=”dateSource”]/>

【語法2】:SQL語句放在標簽體內。

<sql:update [var=”name”] [scope=”page|request|session|application”]

                                                       [dateSource=”dateSource”]

SQL語句

</sql:update>

【參數說明】:見表9-18

9-18 <sql:update>標簽屬性說明

 

參數名

說明

EL

類型

必須

默認值

sql

查詢數據的SQL語句

String

dataSource

數據源對象

String

Javax.sql.DataSoutce

var

指定存儲查詢結果的變量名

String

scope

指定結果的作用域

String

page

 

提示:<sql:update>標簽的屬性同<sql:query>標簽的屬性相比只減少了maxRowsstartRow2個屬性。其他參數用法一樣。

使用<sql:update>可以實現數據表的創建、插入數據、更行數據、刪除數據。使用時只須在標簽中放入正確的SQL語句即可,同時要捕獲可能產生的異常。本節只對一個簡單的插入操作進行說明。

【示例代碼】:代碼9.21實現了創建一個表、實現數據的插入。

代碼9.21 數據庫創建、數據插入示例:sqldemo02.jsp

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

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

<%@ page contentType="text/html;charset=GBK"%>

<html>

<head>

 <title>JSTL: SQL標簽</title>

</head>

<body >

<h3>SQL標簽庫</h3>

<hr>

<sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"

        url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"

        user="sa" password="" />

實現數據庫表的創建<br>

<sql:update var="result1">

create table c_user (

         id int primary key ,

    name varchar(80),

    sex varchar(80),

)

</sql:update>

<c:catch var="error">

<sql:update var="result2" >

insert c_user values(05,'Linda','')

insert c_user values(01,'Rom','' )

</sql:update>

影響的記錄數為:<c:out value="${result2}"></c:out>

</c:catch>

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

<hr>

</body>

</html>

【代碼解析】:

1)配置數據源。

2)使用<sql:update>標簽創建一個新表。

3)向表中插入兩行數據。

提示:本示例也沒有針對固定的表進行操作,在使用時直接運行即可,如果使用的是其他數據庫,需要更改數據源配置和SQL語句部分修改。

使用<sql:update>var屬性記錄結果是不准確的,尤其是在一個標簽中使用多條sql語句只能記錄下第一條。

3<sql:param>標簽

<sql:param>標簽用於動態的為SQL語句設定參數,同<sql:query>標簽共同使用。可以防止SQL注入作用類似於java.sql.PreparedStatement

【語法1】:

<sql:param value=”value”/>

【語法2】:

<sql:param>

Value

</sql:param>

【參數說明】:

value的作用為SQL中的參數賦值。

【使用示例】:

<sql:query var=”result”>

select * from person where 序號=

<sql:query>

4<sql:dateParam>標簽

<sql:dataParam>標簽主要用於為SQL標簽填充日期類型的參數值。

【語法】:

<sql:dateParam value=”date”[type=”timestamp|time|date”]/>

【參數說明】:

q        value屬性:java.util.Date類型的參數。

q        type屬性:指定填充日期的類型timestamp(全部日期和時間)、time(填充的參數為時間)、date(填充的參數為日期)。

5<sql:transaction>標簽

<sql:transaction>標簽提供了數據操作的一種安全機制(即事務回滾),當操作數據庫的某條SQL語句發生異常時,取消<sql:transaction>標簽體中的所有操作,恢復原來的狀態,重新對數據庫進行操作。

【語法】:

<sql:transaction [dataSource=”dataSource”]

[isolation=”read_committed|read_uncommitted|repeatable|serializable”]

<sql:query>

<sql:uptade>

</sql:transation>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM