細談Quercus----Java之PHP框架

   接觸queecus不是好久,其實也是PHP框架,這是個人note。

Quercus 說穿啦,其實就是一個開源 PHP 5 引擎,它已經擁有了純 Java 的完整實現。Quercus 文檔指出,Quercus 在 Resin 應用服務器之上運行,利用了負載平衡、代理緩存等 Resin 特性。本文介紹了在 Apache Tomcat 之上運行 Quercus 所提供的特性。另外,本文還將展現 Quercus 針對 Web 服務和應用程序的 「PHP + Java」 混合方法的易用性和靈活性。 php

爲何choose Quercus? html

Quercus PHP 庫在 Java 中獲得了完整的實現,這對 Java 和 PHP 應用程序都有好處。因爲 Java 和 PHP 之間的緊密集成,Quercus 應用程序可以使用 Java 技術以及 Spring、Hibernate 和 SOA 等框架。爲促進這種互操做性,Quercus 提供了一個 API,以便從 PHP 調用 Java 庫。 java

其餘好處還包括: mysql

易於開發:PHP 庫在 Java 中實現,這使它們更快速、更穩定、更易於使用。開發人員沒必要擔憂基於C語言的PHP 實現中出現的分段(segmentation)錯誤和 C 指針溢出。 web

可伸縮性:做爲一個基於 Java 的實現,Quercus 在 Resin 和 Apache Tomcat 等應用服務器之上運行。這樣,它就能夠利用應用服務器提供的全部特性,如鏈接池、分佈式會話等。 sql

國際化:因爲 Quercus 是一個 PHP 的 Java 實現,它自己就支持 16 位 Unicode 字符串和函數。 數據庫

安裝 Quercus 緩存

安裝 Quercus 很簡單,即將 jar 文件安裝到一個 Java 應用程序,但因爲 Quercus 是 Resin 應用服務器的一個特性,所以它也構建在 Resin 中。沒有必要下載 PHP 引擎,由於 Quercus 就能夠充當 PHP 引擎。按照如下步驟安裝 Quercus: 服務器

從公司 Web 站點下載 Resin 應用服務器。 app

打開這個壓縮文件並解壓縮 jar 文件:quercus.jar、resin-util.jar 和 javamail-141.jar。

將這些文件和 MySQL 鏈接器 jar 文件(若是須要)複製到您的 Web 應用程序的 WebContent\WEB-INF\lib 文件夾。

另外一種簡單的安裝方法是以本文末尾提供的壓縮樣例應用程序爲基礎,從那裏複製庫。

進入 Quercus

爲介紹 Quercus 的特性,我將向您展現一個簡單的 HelloWorld 示例。這個應用程序能夠經過如下步驟建立。(本文使用的全部應用程序都是使用 Eclipse IDE 建立的,有些步驟還提供了屏幕快照,以便它們更加直觀。您也能夠選擇其餘 IDE)。

如下步驟的基本目的是建立一個動態 Web 應用程序項目,將它指向應用服務器運行時(本例中是 Apache Tomcat),並配置 php.ini 和 web.xml 等參數。

在 IDE(本例中爲 Eclipse)中建立一個新的 Web 項目,如圖 1 所示(Alt + Shift + N)。

圖 1. 建立新項目


輸入項目名稱並指向運行時。圖 2 顯示了一個樣例設置屏幕。

單擊 File --> New (Alt + N),在默認工做空間中建立一個名爲 TestHelloWorld 的新的動態 Web 應用程序。

我將 Apache Tomcat Version 5.5 配置爲應用程序的運行時環境。

圖 2. 設置新項目

複製一個包含 Quercus 和聯合 jar 文件的目錄結構(如圖 3 所示)。另外,建立 WebContent、META-INF(包含清單文件或上下文文件)和 JavaScript resources 等文件夾。

圖 3. 創建目錄結構

TestHelloWorld 項目的根目錄包含如下文件夾:

WebContent:這個目錄中的 WEB-INF 目錄的 lib 文件夾包含 quercus.jar 等庫,META-INF 目錄包含 Manifest.mf 文件。WEB-INF 文件夾還包含這個 Web 應用程序的靜態和動態內容,如 php、jsp 或 html 文件。

Java Resources:這個目錄包含一些庫,如 Apache Tomcat 庫、JRE 和 Web 應用程序庫。

JavaScript resources:這個目錄包含您想要在項目中包含的任何資源。

服務器能夠經過 IDE 建立和配置,並在普通或調試模式下執行(見圖 4)。

Eclipse 中的 J2EE 透視圖有一個 server 選項卡,右鍵單擊該選項卡將顯示一個建立新服務器的選項(見圖 4)。這個服務器能夠用於從 Eclipse IDE 管理應用服務器。

圖 4. 配置一個新服務器

除非有特殊須要,定義這個新服務器只需選擇默認值便可(見圖 5)。服務器運行時與建立項目時選擇的運行時一致,即 Apache Tomcat Version 5.5。

圖 5. New Server 配置選擇的選項


配置好服務器後,該資源能夠從左側的 「available」 列添加到右側的 「configured」 列。

新服務器完成配置後,新建立的資源須要在服務器上配置(見圖 6)。這個服務器配置將部署在開發過程當中建立的資源。

圖 6. 在服務器上配置資源

配置 Quercus

php.ini 文件用於配置 PHP 的行爲,好比設置目錄、設置文件路徑、更改會話等。這個文件能夠在 web.xml 文件中指定,清單 1 顯示了一個示例。

清單 1. 在 web.xml 文件中指定 php.ini

<init-param>
    <param-name>ini-file</param-name>
    <param-value>WEB-INF/php.ini</param-value>
   </init-param>

PHP 源文件的編碼經過腳本編碼表示,按照清單 2 所示的方法定義。

清單 2. web.xml 文件中的 PHP 編碼規範

<init-param>
    <param-name>script-encoding</param-name>
    <param-value>UTF-8</param-value>
   </init-param>


QuercusServlet 是一個指向 Quercus 引擎的接口,它解析 php 文件,一般按照清單 3 所示內容配置。

清單 3. web.xml 文件中的 QuercusServlet 的配置

<web-app xmlns=」http://java.sun.com/xml/ns/j2ee」
xmlns:xsi=」http://www.w3.org/2001/XMLSchema-instance」
 xsi:schemaLocation=」http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd」
 version=」2.4」>
 <description>Quercus Hello World on Tomcat</description>
 <servlet>
   <servlet-name>Quercus Servlet</servlet-name>
 <servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>

Quercus hello world php 文件(index.php)描述

index.php 文件定義一個名爲 getTheDate 的方法,該方法實例化一個 Java 對象。Quercus 可以經過使用導入語句利用任何 Java 類,這使它具備很高的互操做性和靈活性。清單 4 顯示了一個示例。

清單 4. PHP 導入函數示例

<?php
 function getTheDate() {
 import java.util.Date;
 $currentDate = new Date();
 return $currentDate;
 }
 ?>

清單 5 中的代碼展現了在 HTML 片斷中調用 getTheDate() 和 phpinfo() 方法。

清單 5. 對 getTheDate() 和 phpinfo() 的調用

<body>
 <h1>This is the Hello World page</h1>
 <h3>but, it does something more then Hello World!</h3>
 <h4> The current date and time is :<?php echo getTheDate() ?></h4>
 <h4> and finally here is the phpInfo: <?php echo phpinfo()?>
 </body>

代碼更改後須要啓動服務器,這樣才能測試 HelloWorld 應用程序。爲此,右鍵單擊此前建立的服務器配置並單擊運行或調試選項。

圖 7. 以調試或運行模式啓動服務器


圖 8 顯示了啓動服務器並轉到相應 URL 後應用程序的最終輸出。

請注意,本文末尾的樣例文件 HelloWorld.zip 包含這個應用程序的壓縮版本。該文件還包含 Eclipse 須要的元數據文件,以便直接地無縫導入該 IDE。

圖 8. Hello World 頁面的輸出

Quercus 的實際應用

如今讓咱們檢查一個真實示例。圖 9 顯示了一個 Manage Customer 頁面,經過該頁面,用戶能夠執行一些操做,如添加一個新客戶、查找一個客戶、查看數據庫中的全部客戶。

圖 9. 客戶管理應用程序流

如上圖所示,HTTP 請求被 Tomcat 接收。web.xml 中的配置定義瞭解析 php 文件的 QuercusServlet 對象。這個對象是一個 Java servlet,它提供與 Quercus 庫的接口。在這個樣例應用程序中,在 php 文件中實例化的一個 PDO 對象經過 MySQL 鏈接器實例化與 MySQL 數據庫的鏈接。PDO(PHP Data Object,PHP 數據對象)以一種統一的方式提供數據庫訪問,包括預處理語句等高級特性。

Manage Customer 應用程序的目錄結構(如圖 10 所示)與前面介紹的 HelloWorld 示例的目錄結構相同。

圖 10. Manage Customer 應用程序的目錄結構


注意,這個應用程序的核心文件包含在如下子目錄下的 WebContent 文件夾中:

META-INF:包含鏈接到 MySQL 數據庫的憑證信息。

WEB-INF:包含庫文件夾,庫文件夾又包含運行應用程序的 Quercus jar 等文件。這個文件夾還包含描述數據源的 web.xml 文件。

全部關聯的 php 和 html 文件都包含在 WebContent 文件夾中。這些文件充當應用程序的視圖部分,向 Web 應用程序提供動態和靜態內容。

請注意,本文末尾的樣例文件 ManageCustomer.zip 包含這個應用程序的壓縮版本。該文件還包含 Eclipse 須要的元數據文件,以便直接地無縫導入該 IDE。

配置 Tomcat 和 MySQL

Tomcat 的配置與 HelloWorld 應用程序的配置很是類似。此外,咱們須要定義一個資源引用(如清單 6 所示)。這個元素指定一個資源管理器鏈接工廠引用的名稱。在本例中,它是在 jdbc/mysql 中指定的數據庫鏈接,其類型爲 javax.sql.DataSource。

清單 6. web.xml 中的資源引用定義

web.xml
 . . .
 <resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/mysql</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
 </resource-ref>
 . . .

咱們須要在 WebContent/META-INF 文件夾下的 context.xml 中定義鏈接資源,如清單 7 所示。該資源包含驅動程序名、jndi 名稱、用戶名、密碼、數據類型和 url 等屬性。

清單 7. 在 context.xml 中定義的屬性

context.xml
 . . .
 <Context>
 <Resource driverClassName="com.mysql.jdbc.Driver"
 maxActive="4" maxIdle="2" maxWait="5000" auth="Container"
 name="jdbc/mysql" password="" type="javax.sql.DataSource"
 url="jdbc:mysql://localhost:3306/customer" username="root"/>
 </Context>
 . . .

客戶數據庫只有一個表,該表能夠經過運行如下腳本建立:

 use customer;
 CREATE TABLE users ( 
 id INT NOT NULL PRIMARY_KEY AUTO_INCREMENT, 
 name VARCHAR(200) 
 );

請注意,HelloWorld 應用程序使用的配置步驟(好比建立一個新的服務器配置、添加資源、在調試或運行模式下啓動服務器等)也能夠以相似的方式應用於這個應用程序。

應用程序概要

應用程序 Manage Customer 的索引頁面顯示了一列用戶能夠執行的操做(見圖 11)。

圖 11. Manage Customer 的索引頁面的屏幕快照


索引頁面支持如下操做:

Add Customer

Search Customer

View all Customers

Delete all Customers

顯示全部操做的 index.html 頁面由擁有獨立動做的多個表單組成。仔細查看一下 「Add Customer」。對應的 html 包含一個對 addCustomer.php 的引用(做爲表單動做)和 POST 方法。

 <H2>Add Customer</H2>
 <form action="addCustomer.php" method="post">
 <label>Customer name</label>
 <input type="text" id="customerName" name="customerName"/>
 <input type="submit" value="Add"/>
 </form>

動做中的 php 代碼從 POST 提取 customerName 參數併爲插入建立一個 sql 語句。而後經過傳入數據源的 jndi 名稱實例化一個 PHP 數據對象。

 <?php
 $custName = $_POST['customerName'];
 $pdo = new PDO("java:comp/env/jdbc/mysql");
 $sql = "insert into users values ('" . $custName . "');";
  $rows = $pdo->exec($sql);
  if ($rows>0) {

 echo("<h4> Adding ". $custName . " was successful</h4>");
 }
 else echo('<h4> An error occurred</h4>');
 ?>

Look Up、View All 和 Delete 的操做也以相似的方式實現(參見 下載 部分附帶的源代碼)。

圖 12. View all Customers 頁面的屏幕快照

啓示錄

本文介紹了運行在 Apache Tomcat 之上並鏈接到一個 MySQL 數據庫的 Quercus 的特性。做爲一個在 Java 中全面實現的 PHP 框架,Quercus 可以利用 Spring 和 Hibernate 等基於 Java 的框架。因爲具備 PHP 特徵,對於開發人員來講,Quercus 有很高的可用性。同時,因爲其核心框架已經在 Java 中實現,Quercus 很健壯並具備可伸縮性。

adiOS       今日的菜鳥 明日的老鳥

      no se,I  know who hold tomorrow
相關文章
相關標籤/搜索