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

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

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

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

          以下的六個示例創建一個表、插入三行、更新一行、刪除另一行、執行一些查詢再刪除該表。這一切都是利用通用標記文件完成的,這些標記文件不依賴于表的結構。

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

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

          <p> Table created.</p>

          create.tag 文件包含一個標記片段 (init.tagf),該片段利用 JSTL 的 <sql:setDataSource> 標記,在應用程序范圍內設置一個名為 tags_db_dataSource 的 javax.sql.DataSource 變量。只有當該變量尚未存在,并且將要與 JSTL 的 <sql:update> 標記(該標記執行其主體中的 SQL 語句)一同在標記文件中使用時,才會創建該變量。create.tag 文件動態地創建 CREATE TABLE 語句,利用 ${table} 獲取表名,并利用 <jsp:doBody> 插入表的結構:

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

          為了運行示例,您必須配置一個名為 dbtags 的數據源。在 Web 應用程序的描述器 (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 片段從一個初始化參數那里獲得資源的路徑,這個初始化參數也是在 web.xml 中定義的:

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

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

          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> 標記每次插入一行,該標記利用以下語法調用標記文件 (insert.tag):

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

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

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

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

          在 <sql:update> 的主體內,標記文件創建一個列名的列表 (v_columnNames) 和另一個包含參數標志的列表 (v_paramMarkers)。JSTL 的 <sql:param> 標記與傳送 SQL 參數值的 <sql:update> 協作。在執行了不產生任何輸出的 <c:forEach> 循環之后,標記文件利用以下語句產生 SQL 語句

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

          當 insert.jsp 調用標記文件時,<sql:update> 標記求出其主體所得的值

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

          然后,<sql:update> 使用 JDBC API 并傳遞由 <sql:param> 所發送的參數值,執行以上的 SQL 語句。注意,列及其相應的值可能以不同的順序出現,因為它們是從 java.util.Map 實例中檢索出來的。因此,我們必須確保 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,但此時 JSTL 的 <sql:update> 標記用于執行 UPDATE 語句:

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

          使用以下語法將列及其值指定為動態屬性:

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

          標記文件使用動態屬性來創建一個包含 column=? 結構的列表 (v_setList)。利用前面示例中的 <sql:param>,將列值傳送到 <sql:update>。然后,update.tag 利用以下語句生成 SQL 語句

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

          當 update.jsp 調用標記文件時,<sql:update> 標記求出其主體所得的值

          UPDATE People SET email=?WHERE userID=2

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

          update.tag
          資源

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

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

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

          下載 JSTL 1.1
          在部署示例之前,下載 JSTL 并將 jstl.jar 和 standard.jar 復制到 Web 應用程序的 WEB-INF/lib 目錄。此外,不要忘記配置 dbtags 數據源,并確保可以使用正確的數據庫驅動程序。

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

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

          相關文章與下載

          如何:向 JDeveloper 10g 添加自定義的 JSP 標記庫

          Oracle JDeveloper 10g

          JSP 示例代碼

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

          <%@ 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 步:刪除。以下的標記文件 (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 步:選擇。下一個標記文件 (select.tag) 使用 JSTL 的 <sql:query> 標記來執行 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> 標記創建和執行以下的 SQL 語句,其子句被指定為標記的屬性。

          SELECT columns FROM table WHERE  
          GROUP BY HAVING ORDER BY 

          當 <db:select> 出現在 JSP 頁中時,利用 select.tag 的 <jsp:doBody> 操作為每行調用它的主體。JSP 頁從一個由標記文件與 JSTL 所創建的 java.util.Map 中獲取行數據。例如,當前行的值可以利用類似 ${row.userID}、${row.name} 和 ${row.email} 的 JSP 結構而獲得,此時假定 JSP 頁調用的標記文件指定應該將持有數據的變量命名為 row

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

          select.jsp 頁兩次調用了標記文件。首先它使用 <db:select> 來迭代關系表的行,生成一個 HTML 表,然后 JSP 頁使用 <db:select> 來計算 People 表的行數。

          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 步:刪除表。如果您希望再次執行 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 似水流年 閱讀(781) 評論(1)  編輯  收藏 所屬分類: JSP/Servlet

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

          如何動態進行網頁的存儲。有源代碼就更好了。
          先謝謝了。  回復  更多評論
            
          主站蜘蛛池模板: 阿克| 麦盖提县| 昭平县| 朔州市| 太和县| 纳雍县| 麦盖提县| 榆中县| 平凉市| 清远市| 江门市| 新泰市| 虹口区| 海城市| 玛纳斯县| 宣威市| 呼玛县| 遂宁市| 南部县| 莲花县| 南宫市| 洞头县| 天峨县| 温州市| 弥勒县| 高阳县| 德清县| 苍梧县| 荃湾区| 淮安市| 汉川市| 宜宾县| 丹寨县| 射洪县| 洛宁县| 乐山市| 阳信县| 徐汇区| 罗城| 黄龙县| 黄冈市|