top
Loading...
OracleWeb應用開發之Apache架設與PL/SQL頁面設計

Oracle有多種方法在網頁上顯示數據庫中的數據,如JSP或XML編程。在Oracle8i/9i中應用開發人員可以自由使用Java或PL/SQL,把PL/SQL代碼嵌入網頁中實現業務邏輯的頁面就是PSP頁面。

PSP頁面及其運行環境Apache mod_plsql模塊

Oracle 數據庫中的Oracle HTTP Server組件就是Apache服務器,在Oracle8i/9i中接受PL/SQL調用的Web組件就是Apache的mod_plsql模塊,該模塊為Oracle數據庫產品,在Oracle9iAS中的Oracle Portal中同樣包含,本文不介紹Oracle9iAS中的Web服務。mod_plsql模塊模塊提供了在Apache、Oracle Portal和數據庫之間的嚴密的綜合性和安全性,并改善交互作用和經Web請求調用的程序的執行情況。

Portal開發工具箱(Portal Development Kit,PDK)的兩個主要特點是完全用PL/SQL實現的PDK -PL/SQL和用Java實現調用接口的PDK-Java。它們都能訪問Web資源或數據庫服務器,兩者都能調用Java程序,如果Java程序被導入數據庫中,可以從PL/SQL調用它們。下面是構成全部Portal環境的組件列表:

1.Oracle Database Aerver

2.HTP/HTF包和工具(PL/SQL Web Toolkit)

3.Portal procedures(Portal進程)

4.Portal Schema(數據庫表)

5.Oracle 9iAS Application Server(及Logon Server)

6.Apache HTTP Server

7.Mod_PLSQL Apache Plug-in

8.Portalets

9.External images(外部圖象)

10.建立應用程序需要的Tables和數據

Oracle 9iAS Application Server和Apache HTTP Server是結構中的底層部分,它們成為開發中的最重要的部分之一。Listener和Mod_PLSQL網關是配對的,Listener自身是個完整的Apache HTTP Server,它的作用是管理HTTP樣式請求的進程。Mod_PLSQL網關負責交換數據進出數據庫。Mod_PLSQL網關包括為了和Net8交流的全部必要信息。Oracle把Apache HTTP Server和Mod_PLSQL網關都作為Oracle9iAS和數據庫安裝的一部分進行安裝。

下面說明當在瀏覽器瀏覽網址http://localhost/pls/simpledad/show時(結果如圖1所示)服務器的響應過程。

圖1

Apache監聽器是一個HTTP服務,處理所有通過請求端口(默認端口為80)的請求,請求首先路由到本地主機。因為請求字符串中包含"pls",即虛擬目錄,該字符串(表示請求的實際字符串是可配置的,此處為默認配置)的定義在$ORACLE_HOMEapachemodplsqlcfgplsql.conf文件中,Apache根據這一文件識別出"pls"是一個PL/SQL請求并且把執行任務傳遞給PL/SQL模塊(mod_plsql)。mod_plsql隨后查看網址字符串的剩下部分。"simpledad"是數據庫訪問描述符(Database Access Descriptor,DAD),它給出關于mod_plsql怎樣被連接到數據庫中去執行請求的信息,可以配置多個DAD,它包含用戶名、密碼、認證方式、路徑別名等信息。“show”為mod_plsql執行的PL/SQL過程,如果在URL的最后沒有指定過程名,則mod_plsql會查找默認的過程名,此默認過程名也可在DAD中設置。過程運行并發送結果(使用PL/SQL Web Toolkit生成的)到HTTP緩沖區中,當過程執行完后,HTTP緩沖區的內容通過mod_plsql和Apache返回到瀏覽器。過程可以直接使用PL/SQL Web Toolkit編程,也可以通過loadpsp命令行工具把PSP頁面加載到數據庫中生成過程,瀏覽PSP頁面只需在URL中以過程名結尾即可,不需擴展名“.psp”。

需要注意的是,在Portal體系中,可以由文件夾和文檔來管理用于顯示在瀏覽器中的圖象和多媒體,而本文在僅安裝Oracle數據庫時,圖片等多媒體類型的文件必須存放在“$ORACLE_HOMEapachemodplsqlcfgimages”路徑下,并且在PSP頁面中調用時使用路徑“admin_/images/”。

PL/SQL語言已經長時間作為Oracle數據庫和開發環境的基礎,Oracle本身是使用PL/SQL建立的,并且Oracle已經建立了從PL/SQL過程直接訪問HTML的方法,但太依賴于PL/SQL代碼會使后來的可能不熟悉PL/SQL代碼的開發者難于維護應用程序。使用PL/SQL頁面表示層的優勢之一是實現了表示層與業務邏輯的分離,業務邏輯以存儲過程的形式存儲在數據庫中,優勢之二是PL/SQL頁面頁面的運行取決于對數據庫過程的調用,獨立于應用服務器,在數據庫緩存服務器支持下運行性能好。

配置Apache的mod_plsql模塊

設置Apache Web 服務器中的mod_plsql模塊來接收瀏覽器對數據庫中的存儲過程的調用。Oracle HTTP Server組件已經包含在Oracle9.0.1服務器中,使用缺省的端口和主機參數,配置文件$ORACLE_HOMEapacheapacheconfhttpd.conf不用修改。需要為Apache Web 服務器設置DAD,步驟如下:

1.瀏覽網址http://202.99.18.136,也是本機地址或Apache服務器的主機地址.如圖2所示。

圖2

2.打開組件mod_plsql的鏈接,如圖3所示。

圖3

3.點擊"網關數據庫訪問描述符設置",如圖4所示。可以將新的數據庫訪問描述符添加到現有列表。此處配置的信息包括:用戶名、口令、連接字符串、文檔上載路徑和過程、需要進行 long raw 上載的文件擴展名、路徑別名和相關過程,以及確認連接的信息。本例中修改SIMPLEDAD,如圖5所示。

圖4

4.在SIMPLEDAD的編輯頁面中,修改Oracle 用戶名為cf,Oracle 口令為cf,Oracle 連接字符串為db:1521:o90,如果網關在所連接的數據庫以外的其他Oracle主目錄中運行,則需要TNS連接字符串。此外,也可使用以下格式的組合字符串來替代TNS連接字符串,即::是運行數據庫的主機名,是TNS監聽程序監聽的端口號,是數據庫例程的Oracle SID名稱。為了獲取最佳性能,請保持網關的數據庫連接池處于打開狀態。網關使用"文檔訪問信息"向與此數據庫訪問描述符關聯的數據庫上載或下載文檔。默認情況下所有文檔都將以BLOB類型上載。通過在Long Raw字段中指定以逗號分隔的文件擴展名,可以覆蓋此默認設置。此字段的"*"值將使所有文檔以Long Raw 數據類型上載。"文檔訪問過程"指定用于訪問文檔的虛擬路徑。"文檔訪問過程"字段指定網關處理文檔請求所調用的過程。此處都使用缺省值。如果通過此網關連接的應用程序支持將絕對路徑映射到關鍵字,可以指定關鍵子,本例中此處為空。設置完該頁面后返回上級頁面。

圖5

5.下面設置全局網關。在如圖3所示的網關配置菜單中選擇"網關全局設置",如圖6所示,將第5步中編輯修改的數據庫訪問描述符SIMPLEDAD作為默認全局網關的DAD。

圖6

編寫存儲過程和網頁代碼

本實例的數據庫對象都在cf/cf操作模式下。數據庫環境為Oracle9.0.1,帶有Oracle HTTP Server安裝(已自動安裝mod_plsql模塊),未安裝Oracle9iAS及其任何組件。

1.建立表student并插入7條記錄。

CREATE TABLE student (ID  NUMBER(5,0) NOT NULL ,NAME  VARCHAR2(15) NOT NULL ,DOB  DATE ,GENDER  VARCHAR2(2) DEFAULT '男' ,CLASSYR  NUMBER(4,0) DEFAULT 2002 NOT NULL ,MAJOR  VARCHAR2(25) ,EMAIL  VARCHAR2(50) ,PHOTO  VARCHAR2(100) );alter session set nls_date_format = 'dd-mon-yyyy';alter session set nls_date_language = 'AMERICAN';insert into student values ( 1001,'趙鵬','14-JUL-1975','男',2001,'History','1001@NetUniversity.org','u1001.gif')/insert into student values ( 1002,'劉宇','08-OCT-1975','女',2001,'Science','1002@NetUniversity.org','u1002.gif')/…………

2.以帳戶cf/cf建立存儲過程show_student。

create or replace procedure show_student(p_id         in out student.id%TYPE,p_name          out student.name%TYPE,p_dob           out student.dob%TYPE,p_gender        out student.gender%TYPE,p_classyr       out student.classyr%TYPE,p_major         out student.major%TYPE,p_email         out student.email%TYPE,p_photo         out student.photo%TYPE)ISCURSOR get_student(p_id in student.id%TYPE DEFAULT 1001) IS    SELECT * FROM student    WHERE id = NVL(p_id,1001);student_row student%ROWTYPE;BEGIN    IF p_id<1001 THEN       p_id:=1001;        END IF;    IF p_id>1007 THEN       p_id:=1007;    END IF;    OPEN  get_student(p_id);    FETCH get_student INTO student_row;    CLOSE get_student;    p_name          := student_row.name;    p_dob           := student_row.dob;    p_gender        := student_row.gender;    p_classyr       := student_row.classyr;    p_major         := student_row.major;    p_email         := student_row.email;    p_photo         := student_row.photo;END;/

3.編寫PSP網頁,文件名為show.psp。

程序說明:第1行標識出該頁為PL/SQL語言文件。第2行指出即將為該頁面生成的PL/SQL過程名,最后PL/SQL頁面將要調用數據庫中的該過程來顯示數據,如果省略該行則以文件名作為缺省的過程名。第3行為即將生成的過程的輸入或輸出參數,以<%@ %>標記說明,default="1001"說明該參數為可選參數,注意,即使是數值數據類型,也要用雙引號括起。第4至11行為該PSP網頁的全局參數,同時也是過程show的局部參數,以<%! %>標記表示。接下來以全局參數調用已經存儲在數據庫中的過程show_student,程序代碼前后分別被置以<%和%>標記。當然也可將第二步中的過程show_student的編碼直接寫入以<%和%>標記括起的程序中,但是為了實現代碼與內容的分離,盡量不要把它們混在一起。這樣做的好處是分離業務邏輯與表示層,使得程序結構清晰,因為可能還有其它PSP頁面調用該存儲過程。在頁面顯示部分對全局參數的調用格式為標記<%= %>,這也是輸出標記,該標記可以實現字符串的連接和變量的計算,如通過psp_id的加減1達到翻頁目的。在鏈接標記">中,注意show為已經存儲的過程,用"show?id="的格式調用過程并輸入參數。

<%@ show language="PL/SQL"%><%@ plsql procedure="show" %><%@ plsql parameter="id" type="NUMBER" default="1001"%><%! psp_id        student.id%TYPE:=id;%><%! psp_name      student.name%TYPE;%><%! psp_dob       student.dob%TYPE;%><%! psp_gender    student.gender%TYPE;%><%! psp_classyr   student.classyr%TYPE;%><%! psp_major     student.major%TYPE;%><%! psp_email     student.email%TYPE;%><%! psp_photo     student.photo%TYPE;%><%show_student(   p_id         => psp_id,   p_name       => psp_name,   p_dob        => psp_dob,   p_gender     => psp_gender,   p_classyr    => psp_classyr,   p_major      => psp_major,   p_email      => psp_email,   p_photo      => psp_photo);%>學生信息
學生信息
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com