後台開發

Nepenthes的後台開發包括三部分:Schema對象、BL對象和Service對象。後台開發是Nepenthes開發的核心部分,Web應用、蘋果應用和安卓應用都是以後台為核心進行開發的。參與Nepenthes後台開發的人員需要精通Java語言,SQL語言,熟悉PostgreSQL數據庫,熟悉Tomcat,瞭解Servlet和JSP。Nepenthes後台開發者可以開發出Web應用和提供給蘋果和安卓應用的後台服務。

在開發前請確保您的電腦已經安裝好了JDK, Tomcat, PostgreSQL, NetBeans和Sublime Text,詳情參閱開發環境


Schema對象

Schema對象是對應數據庫表結構的Java對象,命名規則為:表名+Schema,例如,數據庫表名為Userx,則Schema對象必須命名為:UserxSchema,存儲的Java文件名為:UserxSchema.java,使用的開發工具為NetBeans

Schema對象與數據庫表字段類型對照表

字段 Schema對象 初始值
INT int 0
SMALLINT int 0
DECIMAL double 0.00
CHAR String ""
VARCHAR String ""
TEXT String ""
DATE String "1970-01-01"
TIMESTAMP String "1970-01-01 00:00:00"

我們就從數據庫表Userx開啓Nepenthes的開發之旅,表Userx的結構如下所示:

字段 類型 說明
ID INT 自增長唯一識別ID
FirstName VARCHAR(20) 名,索引
LastName VARCHAR(20) 姓,索引
Gender SMALLINT 性別:0代表女,1代表男,2代表其它
Birthdate DATE 出生日期
Salary DECIMAL(10,2) 薪水
RegisteredTime TIMESTAMP 創建時間
Memo TEXT 備注

使用Java開發工具NetBeans按照以下的步驟操作:

  1. 新建Java Class Library工程Test

  2. 創建lib目錄以存儲需要的jar包

  3. 將nepenthes.jar,jackson-core-2.0.6.jar,jackson-databind-2.0.6.jar,commons-codec-1.10.jar,commons-io-1.2.jar(在下載頁面中下載這些jar包)和servlet-api.jar(請從安裝後的Tomcat的lib目錄下找到servlet-api.jar)複製到lib目錄
  4. 將這些jar包添至加工程的Libraries中


  5. 創建包org.everdow.nepenthes.test.schema

  6. 在上一步新建的包中創建Java Class文件UserxSchema

  7. 對應數據庫表Userx的結構,UserxSchema.java的源代碼如下:
    package org.everdow.nepenthes.test.schema;
    
    public class UserxSchema 
    {
        public int ID=0;
        public String FirstName="";
        public String LastName="";
        public int Gender=0;
        public String Birthdate="";
        public double Salary=0.00;
        public String RegisteredTime="";
        public String Memo="";
    }


BL對象

BL對象包含了對數據庫的基本操作,所有操作以Schema對象為參數進行。BL對象的命名規則為:BL+數據庫表名,繼承包org.everdow.nepenthes.bl中的類BLGeneral,該類中包含了常用的操作。這些方法構成了數據庫相關操作的所有場景,可以構造大型的複雜的商業應用。BL對象的實現並不需要重載以上方法,這些方法已經在父類BLGeneral中,在使用過程中只需調用即可。

  • insert(Object schema):數據庫插入操作,入參為Schema對象,返回結果為boolean,true表示插入成功,false表示失敗。
  • update(Object schema):數據庫更新操作,入參為Schema對象,返回結果為boolean,true表示更新成功,false表示失敗。
  • delete(int id):刪除單條數據庫記錄,入參為記錄id,返回結果為boolean,刪除成功返回true,否則返回false。
  • delete(String whereClause):刪除一組數據庫記錄,入參為SQL語句WHERE後的條件語句,返回結果為boolean,刪除成功返回true,否則返回false。
  • getCount(String whereClause):獲得符合條件的數據庫記錄數量,入參為SQL語句WHERE後的條件語句,返回結果為int。
  • select(String whereClause):查詢符合條件的數據庫記錄,入參為SQL語句WHERE後的條件語句,返回結果為List,結果List中包含的元素為Schema對象。
  • select(String whereClause,int index,int step):查詢指定起始位置的符合條件的數據庫記錄,入參whereClause為SQL語句WHERE後的條件語句,index為數據庫游標,step為查詢步長。該方法用於分頁查詢時間使用。
  • getSchema(int id):根據條件獲得指定的Schema對象,入參為數據庫記錄id,返回結果為Schema對象。
  1. 創建包org.everdow.nepenthes.test.bl
  2. 在此包下創建類BLUserx.java
  3. BLUserx源代碼如下:
    package org.everdow.nepenthes.test.bl;
    
    import java.sql.Connection;
    import org.everdow.nepenthes.bl.BLGeneral;
    
    public class BLUserx extends BLGeneral
    {
        private final String createSQL="FirstName VARCHAR(20) NOT NULL,"+  //名
                                       "LastName VARCHAR(20) NOT NULL,"+  //姓
                                       "Gender SMALLINT NOT NULL,"+  //性別
                                       "Birthdate DATE NOT NULL,"+  //出生日期
                                       "Salary DECIMAL(10,2) NOT NULL,"+  //薪水
                                       "RegisteredTime TIMESTAMP NOT NULL,"+  //註冊時間
                                       "Memo TEXT";  //備注
        
        private final String indexSQL="RegisteredTime";
    
        public BLUserx(Connection con)
        {
            super(con);
            super.init(createSQL, indexSQL);
        }
    }
    可以看出,BLUserx擴展了父類BLGeneral,給變量createSQL賦值,內容為創建數據庫表Userx的SQL語句,其中自增長的字段ID是系統自動加入的,不需要在這時顯式列出。變量indexSQL是指寫的建立索引的字段,如果有多個字段被索引,則用半角逗號分隔。BLUserx的最後一部分是在構造器中顯式調用父類的init方法,該方法會檢查數據庫表是否已經存在,如果不存在則自動創建。這時BLUserx已經自動繼承了BLGeneral中的八個常用方法,直接調用即可。


基礎許可

創建的工程中需要在包的根位置加入Nepenthes基礎許可,方可正常使用。請在許可頁面下載基礎許可Config.properties,請不要手動對基礎許可做出任何修改。如下圖所示:


構建

在Projects視圖下,選中工程節點Test,右鍵從菜單中選擇Clean and Build,之後切換至Files視圖,從目錄dist中選中Test.jar,右鍵從菜單中選擇Tools->Show in Finder找至該文件的位置,Test.jar即稱為項目核心庫。 如下圖所示:


Schema和BL對象的測試

我們已經成功的創建了Schema對象和BL對象,接下來我們就進行調用驗證,並通過PostgreSQL數據庫客戶端psql進行驗證。在進行驗證測試前,需要進行以下的相關配置:

  1. 使用PostgreSQL的客戶端psql創建數據庫test,如下圖所示:
  2. 在Tomcat的webapps下建立目錄Test
  3. 在目錄Test下創建目錄WEB-INF
  4. 在目錄WEB-INF下創建目錄lib
  5. 將nepenthes.jar,commons-codec-1.10.jar,jackson-annotations-2.0.6.jar,jackson-core-2.0.6.jar,jackson-databind-2.0.6.jar,Test.jar複製到剛剛建立的目錄lib下
  6. 在目錄WEB-INF下建立文件web.xml,內容如下:
  7. 在Test目錄下創建目錄META-INF
  8. 在目錄META-INF下建立文件context.xml,內容如下:
  9. 在目錄Test下創建文件openCon.jspf,該文件用於jsp包含文件,打開數據庫,內容如下:
  10. 在目錄Test下創建文件closeCon.jspf,該文件用於jsp包含文件,關閉數據庫,內容如下:
  11. 由於Tomcat有自動加載機制,Test應用應該已經生效並啓動。為了確保生效,請手動重啓Tomcat。如何重啓Tomcat,請參閱Tomcat的相關文檔
接下來我們在Test目錄下,使用編輯器Sublime Text,創建一系列jsp文件以測試驗證Schema對象和BL對象:
  • license.jsp:驗證Nepenthes許可。

    驗證Nepenthes許可返回值

    描述 備注
    800 License Passed 許可驗證通過,可以正常使用。
    801 License User or License Password Wrong 許可用戶名或密碼錯誤。
    802 License Wrong 許可錯誤
    803 License Disabled 許可被禁用。
    804 License Expired 許可過期。
    805 License Type Unmatch 許可類型不匹配。
    806 License Verify Exception 許可驗證異常。
    807 License Server Fail 許可服務器故障。
    808 License Package Error 許可包錯誤。
    809 License Auto Destroy 許可自動銷毀。
    810 Config.properties doesn't contain LicenseUser Config.properties未包含許可用戶。
    811 Config.properties doesn't contain LicensePassword Config.properties未包含許可密碼。
    812 Config.properties doesn't contain LicenseType Config.properties未包含許可類型。
    813 Config.properties doesn't contain LicensePackage Config.properties未包含許可包。
    814 Config.properties doesn't contain License Config.properties未包含許可。
  • insert.jsp:演示BL對象的insert方法。

    為了支持多語言,須將jsp設置為utf-8編碼。MiscTool為Nepenthes提供的工具集,內置了許多方便的方法以便調用。頁面開始需要包含打開數據庫連接的openCon.jspf,在頁面最底部包含closeCon.jspf關閉數據庫。BLUserx的insert方法入參為UserxSchema,如果插入數據庫成功返回true,否則返回false。返回true後,打開PostgreSQL的客戶端psql以驗證確實插入數據庫成功,看到如下的界面就表明剛才的insert操作是成功的。如何使用數據庫PostgreSQL不在本培訓課程之列,想瞭解關於PostgreSQL的更多信息,請訪問其PostgreSQL官網
  • update.jsp:演示BL對象的getSchema方法和update方法。

    首先,根據ID使用BLUserx對象的getSchema方法獲得UserxSchema對象,在獲得對象後為Object,需強製造型為UserxSchema。然後,修改為出生日期,調用BLUserx的方法update,該方法入參為UserxSchema,返回boolean類型的值,true表示更新成功,false表示更新失敗。更新成功後,同樣使用PostgreSQL的psql檢查數據庫是否更新。
  • getCount.jsp:演示BL對象的getCount方法,入參為SQL語句WHERE後的條件,返回值為整數,代表符合條件的記錄的數量,通常使用1=1條件語句來查詢所有記錄。此時執行時應該返回的數值為1

  • select.jsp:演示BL對象的select方法,select方法有兩個實現,第一個select方法只有一個入參whereClause即SQL語句WHERE後的語句,第二個select方法有三個入參,第一個入參數也是whereClause,含義與第一個select方法一樣,第二個入參是pos,代表數據庫游標的位置,第三個入參是step,代表每次查詢返回的最大記錄數量。第二個select方法適用於分頁顯示。這兩個select方法都返回List類型的集合,是UserxSchema的元素集合。

  • delete.jsp:演示BL對象的delete方法,delete方法也有兩個實現,第一個delete方法的入參是記錄ID,執行一次只刪除一條記錄;第二個delete方法的入參是whereClause,會刪除所有符合條件的記錄。返回值都是boolean,true表示刪除成功,false表示刪除失敗。

    執行後,請從psql檢查是否刪除成功。


Service對象實現及配置

對於使用jsp來開發WEB應用的開發者來說,以上的培訓已經全部完成並足夠應付任何規模和級別的企業級應用。但Nepenthes的作用絕不是僅僅提供WEB應用的開發框架,Nepenthes可以向蘋果和安卓應用提供服務。接下來我們便為iOS,macOS,tvOS和Android應用演示如何開發出後台服務來。請按照以下步驟的順序嚴格操作:

  1. 回到NetBeans的項目Test中,創建包org.everdow.nepenthes.test.service,如下圖所示:

  2. 創建類UserxService,如下圖所示:

  3. UserxService的實現,需要擴展類ServiceServlet,覆蓋init方法,在該方法中初始化schema變量和blGeneral變量,並捕捉相應的異常。如下圖所示:

    UserxService源代碼如下:沒錯,Service對象的實現就這麼簡單,所有相關的方法都已經在其父類ServiceServlet中實現。
    package org.everdow.nepenthes.test.service;
    import java.sql.SQLException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.naming.NamingException;
    import org.everdow.nepenthes.service.ServiceServlet;
    import org.everdow.nepenthes.test.bl.BLUserx;
    import org.everdow.nepenthes.test.schema.UserxSchema;
    
    public class UserxService extends ServiceServlet
    {
        @Override
        public void init()
        {
            try 
            {
                this.schema=new UserxSchema();
                this.blGeneral=new BLUserx(this.getConnection());
            } 
            catch (NamingException | SQLException ex) 
            {
                Logger.getLogger(UserxService.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
  4. Clean and Build後將新生成的Test.jar覆蓋之前的同名文件。
  5. 打開web.xml文件,將UserxService註冊成為Servlet,同時也需要設置訪問服務所需的密碼以保證服務的安全訪問。如下圖所示:

  6. 在瀏覽器地址欄輸入http://localhost/Test/UserxService,如果出現:Service Available,則此時UserxService已經在後台準備好了向蘋果和安卓應用提供服務了。開發蘋果和安卓應用以調用該服務,請參閱蘋果開發和安卓開發的章節。