<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-26  評論-13  文章-46  trackbacks-0

    在開發(fā)復(fù)雜的企業(yè)應(yīng)用程序時(shí),很多人更喜歡使用企業(yè) JavaBean (EJB) 技術(shù),讓應(yīng)用服務(wù)器來管理對象可持續(xù)性。其他人可能更喜歡使用 Java 數(shù)據(jù)庫連接 (JDBC) 標(biāo)準(zhǔn) API,以便手動(dòng)地優(yōu)化數(shù)據(jù)庫訪問。這些解決方案可能不適合于簡單的由數(shù)據(jù)庫支持的網(wǎng)站,這種網(wǎng)站只需使用 JSP 盡可能快地進(jìn)行原型開發(fā)。如果您只需要查詢和更新一個(gè)簡單的數(shù)據(jù)庫,則提供數(shù)據(jù)庫訪問特性的標(biāo)記庫可能是最佳的解決方案。

    JSTL 具有一系列簡單的 SQL 標(biāo)記,我們將在以下的示例中使用它們。不要直接從您的頁面調(diào)用 JSTL SQL 標(biāo)記,而使用標(biāo)記文件將表達(dá)與數(shù)據(jù)庫訪問腳本相分離是個(gè)好辦法。這種分離允許您以后能夠方便地切換到另一個(gè)數(shù)據(jù)庫連接解決方案,以便提高應(yīng)用程序的性能和可伸縮性。

    JSTL 不是唯一提供數(shù)據(jù)庫訪問特性的標(biāo)記庫。Oracle 應(yīng)用程序開發(fā)框架 (ADF) 提供了一個(gè)稱為商務(wù)組件數(shù)據(jù)標(biāo)記的 JSP 庫,它包含一系列與數(shù)據(jù)庫相關(guān)的更加高級的 JSP 標(biāo)記。注意,ADF 特性集的范圍更廣泛,使得 Oracle ADF 適合于簡單的和復(fù)雜的應(yīng)用程序。Oracle ADF 與 JDeveloper 10g 綁定在一起,后者具有用于 ADF 的可視設(shè)計(jì)工具。

    以下的六個(gè)示例創(chuàng)建一個(gè)表、插入三行、更新一行、刪除另一行、執(zhí)行一些查詢再刪除該表。這一切都是利用通用標(biāo)記文件完成的,這些標(biāo)記文件不依賴于表的結(jié)構(gòu)。

    第 1 步:創(chuàng)建表。本示例的 JSP 頁 (create.jsp) 調(diào)用標(biāo)記文件 (create.tag) 來創(chuàng)建表,該表的結(jié)構(gòu)以 <db:create> 自定義標(biāo)記的主體內(nèi)容提供。表的屬性指定了表名 (People)。在創(chuàng)建表后,JSP 頁輸出一條消息,通知用戶該操作已完成:

    <db:create table="People">
    userID INTEGER,
    name VARCHAR2(
    60),
    email VARCHAR2(
    60)
    </db:create>

    <p> Table created.</p>

    create.tag 文件包含一個(gè)標(biāo)記片段 (init.tagf),該片段利用 JSTL 的 <sql:setDataSource> 標(biāo)記,在應(yīng)用程序范圍內(nèi)設(shè)置一個(gè)名為 tags_db_dataSource 的 javax.sql.DataSource 變量。只有當(dāng)該變量尚未存在,并且將要與 JSTL 的 <sql:update> 標(biāo)記(該標(biāo)記執(zhí)行其主體中的 SQL 語句)一同在標(biāo)記文件中使用時(shí),才會(huì)創(chuàng)建該變量。create.tag 文件動(dòng)態(tài)地創(chuàng)建 CREATE TABLE 語句,利用 ${table} 獲取表名,并利用 <jsp:doBody> 插入表的結(jié)構(gòu):

    <sql:update dataSource="${tags_db_dataSource}">
    CREATE TABLE $
    {table} ( <jsp:doBody/> )
    </sql:update>

    為了運(yùn)行示例,您必須配置一個(gè)名為 dbtags 的數(shù)據(jù)源。在 Web 應(yīng)用程序的描述器 (web.xml) 中聲明了對該資源的引用:

    <resource-ref>
    <res-ref-name>jdbc/dbtags</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    </resource-ref>

    init.tagf 片段從一個(gè)初始化參數(shù)那里獲得資源的路徑,這個(gè)初始化參數(shù)也是在 web.xml 中定義的:

    <context-param>
    <param-name>tags_db_dataSource</param-name>
    <param-value>jdbc/dbtags</param-value>
    </context-param>

    如果您要使用另一個(gè)數(shù)據(jù)源,只需在 web.xml 文件中將 dbtags 替換為您的數(shù)據(jù)源名稱。

    init.tagf

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

    <c:if test="${applicationScope.tags_db_dataSource == null}">
    <sql:setDataSource
    dataSource
    ="${initParam.tags_db_dataSource}"
    var
    ="tags_db_dataSource" scope="application"/>
    </c:if>

    create.tag

    <%@ tag body-content="scriptless" %>
    <%@ attribute name="table" required="true" %>
    <%@ include file="init.tagf" %>

    <sql:update dataSource="${tags_db_dataSource}">
    CREATE TABLE $
    {table} ( <jsp:doBody/> )
    </sql:update>

    create.jsp

    <%@ taglib prefix="db" tagdir="/WEB-INF/tags/db" %>

    <db:create table="People">
    userID INTEGER,
    name VARCHAR2(
    60),
    email VARCHAR2(
    60)
    </db:create>

    <p> Table created.</p>

    第 2 步:插入。在您擁有表之后,可以使用 <db:insert> 標(biāo)記每次插入一行,該標(biāo)記利用以下語法調(diào)用標(biāo)記文件 (insert.tag):

    <db:insert table="" column1="value1" column2="value2" />

    一個(gè)示例 JSP 頁 (insert.jsp) 使用 <db:insert> 將三行插入到 People 表中。在每次調(diào)用時(shí),標(biāo)記文件使用以下語法創(chuàng)建和執(zhí)行一條 SQL 語句:

    INSERT INTO table (column1, column2, )VALUES (value1, value2, 

    列名和值被指定為動(dòng)態(tài)屬性,因而 <db:insert> 可用于任何表,而無論表的列是如何命名的。標(biāo)記文件使用 <c:forEach>,對 java.util.Map 實(shí)例 (columnAttr) 的項(xiàng)目進(jìn)行迭代,該實(shí)例持有 <db:insert> 的動(dòng)態(tài)屬性。每個(gè)動(dòng)態(tài)屬性的名稱表示一個(gè)列名,并且利用 ${v_entry.key} 而獲得。標(biāo)記文件利用 ${v_entry.value} 獲得那些必須被插入到表中的值。

    在 <sql:update> 的主體內(nèi),標(biāo)記文件創(chuàng)建一個(gè)列名的列表 (v_columnNames) 和另一個(gè)包含參數(shù)標(biāo)志的列表 (v_paramMarkers)。JSTL 的 <sql:param> 標(biāo)記與傳送 SQL 參數(shù)值的 <sql:update> 協(xié)作。在執(zhí)行了不產(chǎn)生任何輸出的 <c:forEach> 循環(huán)之后,標(biāo)記文件利用以下語句產(chǎn)生 SQL 語句

    INSERT INTO ${table} (${v_columnNames}) VALUES (${v_paramMarkers})

    當(dāng) insert.jsp 調(diào)用標(biāo)記文件時(shí),<sql:update> 標(biāo)記求出其主體所得的值

    INSERT INTO People (userID, name, email) VALUES (???)

    然后,<sql:update> 使用 JDBC API 并傳遞由 <sql:param> 所發(fā)送的參數(shù)值,執(zhí)行以上的 SQL 語句。注意,列及其相應(yīng)的值可能以不同的順序出現(xiàn),因?yàn)樗鼈兪菑?java.util.Map 實(shí)例中檢索出來的。因此,我們必須確保 SQL 語句不依賴于列的順序。

    insert.tag

    <%@ tag body-content="empty" dynamic-attributes="columnAttr" %>
    <%@ attribute name="table" required="true" %>
    <%@ include file="init.tagf" %>

    <c:set var="v_columnNames" value=""/>
    <c:set var="v_paramMarkers" value=""/>
    <c:set var="v_separator" value=""/>
    <sql:update dataSource="${tags_db_dataSource}">
    <c:forEach var="v_entry" items="${columnAttr}">
    <sql:param value="${v_entry.value}"/>
    <c:set var="v_columnNames"
    value
    ="${v_columnNames}${v_separator}${v_entry.key}"/>
    <c:set var="v_paramMarkers"
    value
    ="${v_paramMarkers}${v_separator}${'?'}"/>
    <c:set var="v_separator" value=""/>
    </c:forEach>
    INSERT INTO $
    {table} (${v_columnNames})
    VALUES ($
    {v_paramMarkers})
    </sql:update>

    insert.jsp

    <%@ taglib prefix="db" tagdir="/WEB-INF/tags/db" %>

    <db:insert table="People" userID="1" name="John Smith"
    email
    ="JohnSmith@company.com" />

    <db:insert table="People" userID="2" name="Mark Johnson"
    email
    ="MarkJohnson@company.com" />

    <db:insert table="People" userID="3" name="Bill Davis"
    email
    ="BillDavis@company.com" />

    <p> Rows inserted.</p>

    第 3 步:更新。update.jsp 頁使用 <db:update> 來更改那些利用 insert.jsp 插入的行中的某一行的 email 值。update.tag 文件類似于 insert.tag,但此時(shí) JSTL 的 <sql:update> 標(biāo)記用于執(zhí)行 UPDATE 語句:

    UPDATE table SET column1=value1, column2=value2, WHERE 

    使用以下語法將列及其值指定為動(dòng)態(tài)屬性:

    <db:update table="" column1="value1" column2="value2"  
    where
    =""/>

    標(biāo)記文件使用動(dòng)態(tài)屬性來創(chuàng)建一個(gè)包含 column=? 結(jié)構(gòu)的列表 (v_setList)。利用前面示例中的 <sql:param>,將列值傳送到 <sql:update>。然后,update.tag 利用以下語句生成 SQL 語句

     
    
    UPDATE ${table} SET ${v_setList} WHERE ${where}

    當(dāng) update.jsp 調(diào)用標(biāo)記文件時(shí),<sql:update> 標(biāo)記求出其主體所得的值

    UPDATE People SET email=?WHERE userID=2

    不同于每次只能用于插入一行的 <db:insert> 標(biāo)記,<db:update> 標(biāo)記可用于在單次調(diào)用中更新多行。

    update.tag
    資源

    使用以下資源來測試這些示例,并了解有關(guān) JSP 2.0 標(biāo)記文件以及 JSTL 核心和 SQL 標(biāo)記的更多信息。

    下載源代碼
    tagfiles_src.zip 文件包含了本文中的示例。為運(yùn)行這些示例,您需要 J2SE、J2EE 1.4 應(yīng)用服務(wù)器、JSTL 1.1 以及數(shù)據(jù)庫服務(wù)器。

    下載 OC4J 10g
    Oracle Application Server Containers for J2EE 10g 充分實(shí)施了包括 JSP 2.0 在內(nèi)的 J2EE 1.4 規(guī)范。你可以使用 OC4J 10g (10.0.3) 來測試這些示例。它可用于所有主要的數(shù)據(jù)庫服務(wù)器 — 當(dāng)然 — 包括 Oracle 數(shù)據(jù)庫。

    下載 JSTL 1.1
    在部署示例之前,下載 JSTL 并將 jstl.jar 和 standard.jar 復(fù)制到 Web 應(yīng)用程序的 WEB-INF/lib 目錄。此外,不要忘記配置 dbtags 數(shù)據(jù)源,并確??梢允褂谜_的數(shù)據(jù)庫驅(qū)動(dòng)程序。

    閱讀 JSP 2.0 規(guī)范
    JSP 2.0 規(guī)范中有整整一章專門針對標(biāo)記文件(“第一部分:JSP 章節(jié)。8 標(biāo)記文件”)。JSP 2.0 所推出的新的標(biāo)準(zhǔn)操作在另一章(“第一部分:JSP 章節(jié)。5 標(biāo)準(zhǔn)操作”)中予以說明。

    閱讀 JSTL 1.1 規(guī)范
    JSTL 規(guī)范說明了本文示例中所使用的 <c:set>、<c:if>、<c:forEach>、<sql:setDataSource>、<sql:query>、<sql:update> 和 <sql:param> 標(biāo)記。

    相關(guān)文章與下載

    如何:向 JDeveloper 10g 添加自定義的 JSP 標(biāo)記庫

    Oracle JDeveloper 10g

    JSP 示例代碼

    教程:了解 JSP 2.0 的新特性,“標(biāo)記文件”模塊

    <%@ tag body-content="empty" dynamic-attributes="columnAttr" %>
    <%@ attribute name="table" required="true" %>
    <%@ attribute name="where" required="false" %>
    <%@ include file="init.tagf" %>

    <c:set var="v_setList" value=""/>
    <c:set var="v_separator" value=""/>
    <sql:update dataSource="${tags_db_dataSource}">
    <c:forEach var="v_entry" items="${columnAttr}">
    <sql:param value="${v_entry.value}"/>
    <c:set var="v_setList"
    value
    ="${v_setList}${v_separator}${v_entry.key}=?"/>
    <c:set var="v_separator" value=""/>
    </c:forEach>
    UPDATE $
    {table} SET ${v_setList}
    <c:if test="${!empty where}"> WHERE ${where} </c:if>
    </sql:update>

    update.jsp

    <%@ taglib prefix="db" tagdir="/WEB-INF/tags/db" %>

    <db:update table="People"
    email
    ="markj@company.com" where="userID=2"/>

    <p> Row updated.</p>

    第 4 步:刪除。以下的標(biāo)記文件 (delete.tag) 可用于刪除一行或多行,它位于 delete.jsp 頁中。

    delete.tag

    <%@ tag body-content="empty" %>
    <%@ attribute name="table" required="true" %>
    <%@ attribute name="where" required="false" %>
    <%@ include file="init.tagf" %>

    <sql:update dataSource="${tags_db_dataSource}">
    DELETE FROM $
    {table}
    <c:if test="${!empty where}"> WHERE ${where} </c:if>
    </sql:update>

    delete.jsp

    <%@ taglib prefix="db" tagdir="/WEB-INF/tags/db" %>

    <db:delete table="People" where="userID=1"/>

    <p> Row deleted.</p>

    第 5 步:選擇。下一個(gè)標(biāo)記文件 (select.tag) 使用 JSTL 的 <sql:query> 標(biāo)記來執(zhí)行 SELECT 語句。<db:select> 的語法包括在下面:

    <db:select var="row" table="" columns="" 
    where
    ="" groupBy="" having="" orderBy="">

    process the result of the query, one row at a time

    </db:select>

    <db:select> 標(biāo)記創(chuàng)建和執(zhí)行以下的 SQL 語句,其子句被指定為標(biāo)記的屬性。

    SELECT columns FROM table WHERE  
    GROUP BY HAVING ORDER BY 

    當(dāng) <db:select> 出現(xiàn)在 JSP 頁中時(shí),利用 select.tag 的 <jsp:doBody> 操作為每行調(diào)用它的主體。JSP 頁從一個(gè)由標(biāo)記文件與 JSTL 所創(chuàng)建的 java.util.Map 中獲取行數(shù)據(jù)。例如,當(dāng)前行的值可以利用類似 ${row.userID}、${row.name} 和 ${row.email} 的 JSP 結(jié)構(gòu)而獲得,此時(shí)假定 JSP 頁調(diào)用的標(biāo)記文件指定應(yīng)該將持有數(shù)據(jù)的變量命名為 row

    <db:select var="row" table="People" columns="*">
    $
    {row.userID} ${row.name} ${row.email} 
    </db:select>

    select.jsp 頁兩次調(diào)用了標(biāo)記文件。首先它使用 <db:select> 來迭代關(guān)系表的行,生成一個(gè) HTML 表,然后 JSP 頁使用 <db:select> 來計(jì)算 People 表的行數(shù)。

    select.tag

    <%@ tag body-content="scriptless" %>
    <%@ attribute name="var" required="true" %>
    <%@ variable name-from-attribute="var"
    alias
    ="v_row" scope="NESTED" %>
    <%@ attribute name="table"   required="true"  %>
    <%@ attribute name="columns" required="false" %>
    <%@ attribute name="where"   required="false" %>
    <%@ attribute name="groupBy" required="false" %>
    <%@ attribute name="having"  required="false" %>
    <%@ attribute name="orderBy" required="false" %>
    <%@ include file="init.tagf" %>

    <sql:query dataSource="${tags_db_dataSource}" var="v_result">
    SELECT $
    {empty columns ?"*" : columns} FROM ${table}
    <c:if test="${!empty where}">   WHERE    ${where}   </c:if>
    <c:if test="${!empty groupBy}"> GROUP BY ${groupBy} </c:if>
    <c:if test="${!empty having}">  HAVING   ${having}  </c:if>
    <c:if test="${!empty orderBy}"> ORDER BY ${orderBy} </c:if>
    </sql:query>

    <c:forEach var="v_row" items="${v_result.rows}">
    <jsp:doBody/>
    </c:forEach>

    select.jsp

    <%@ taglib prefix="db" tagdir="/WEB-INF/tags/db" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <table border="2" cellspacing="1" cellpadding="3">
    <tr>
    <th> User ID </th>
    <th> Name </th>
    <th> Email </th>
    </tr>
    <db:select var="row" table="People" orderBy="name">
    <tr>
    <td> ${row.userID} </td>
    <td> ${row.name} </td>
    <td> ${row.email} </td>
    </tr>
    </db:select>
    </table>

    <db:select var="c" table="People" columns="count(*) as n">
    <p> ${c.n} people.</p>
    </db:select>

    輸出

    圖 7

    第 6 步:刪除表。如果您希望再次執(zhí)行 JSP 示例,則必須利用 drop.jsp 頁刪除表,該頁使用了 drop.tag 文件。

    drop.tag

    <%@ tag body-content="scriptless" %>
    <%@ attribute name="table" required="true" %>
    <%@ include file="init.tagf" %>

    <sql:update dataSource="${tags_db_dataSource}">
    DROP TABLE $
    {table}
    </sql:update>

    drop.jsp

    <%@ tag body-content="scriptless" %>
    <%@ attribute name="table" required="true" %>
    <%@ include file="init.tagf" %>

    <sql:update dataSource="${tags_db_dataSource}">
    DROP TABLE $
    {table}
    </sql:update>

    引自http://www.oracle.com/technology/global/cn/pub/articles/cioroianu_tagfiles.html
    posted on 2005-06-07 15:04 似水流年 閱讀(779) 評論(1)  編輯  收藏 所屬分類: JSP/Servlet

    評論:
    # re: 使用標(biāo)記文件更新和查詢數(shù)據(jù)庫 2005-12-15 06:55 | fanxin
    非常好的文章.我現(xiàn)在正在做類似的程序.以前沒有接促過JSP?,F(xiàn)在,有了比較完整的概念。不過我有個(gè)問題。不知道能否給些提示。

    如何動(dòng)態(tài)進(jìn)行網(wǎng)頁的存儲(chǔ)。有源代碼就更好了。
    先謝謝了。  回復(fù)  更多評論
      
    主站蜘蛛池模板: 三年片在线观看免费大全电影| 亚洲中文字幕第一页在线| 国产成人亚洲综合色影视| 免费无码专区毛片高潮喷水| 成年女人毛片免费播放人| 亚洲国产成人久久精品app| 无码av免费网站| 久久国产精品亚洲综合| 99视频在线观看免费| 久久亚洲精品无码播放| 亚洲日韩在线观看免费视频| 亚洲国产精品第一区二区三区| 高潮毛片无遮挡高清免费视频| 免费人成在线观看网站品爱网日本 | 亚洲视频日韩视频| 小草在线看片免费人成视久网| 亚洲中文字幕无码av永久| 日韩免费在线观看| 免费一级毛suv好看的国产网站| 久久精品亚洲一区二区 | 国产婷婷高清在线观看免费| 青青青亚洲精品国产| 亚洲AV成人精品日韩一区18p| 一级中文字幕乱码免费| 亚洲理论电影在线观看| 久久国产精品免费看| 亚洲人成电影在线观看网| 亚洲国产综合精品中文字幕| a级毛片免费完整视频| 亚洲熟妇无码八V在线播放| 亚洲av中文无码乱人伦在线播放| 18禁在线无遮挡免费观看网站| 国产国拍亚洲精品福利| 久草免费福利视频| 亚洲精品中文字幕无乱码麻豆| 91香蕉视频免费| 美女黄频a美女大全免费皮| 青青草原精品国产亚洲av| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 国产色婷婷精品免费视频| 日本视频在线观看永久免费|