NC-UAP客戶化開發-NC基礎技術


本章將介紹NC-UAP平台的技術結構,開發模型,並通過一個例子親身感受遠程接口開發

NC開發基本概念

單據:比如報銷時的報銷單,一般由表頭和表體組成(有些時候還含有表尾)。表頭中包含了單據的主信息,比如日期、部門、預算項目;表體包含了單據的明細信息,比如具體的事項和金額。

單據類型:一個業務系統為了使結構更清晰,通常也是分層的。比如,供應鏈系統包含了采購、庫存等子系統,每個子系統都具有一個系統類型,而每個子系統都會有很多張單據,為了區分這些單據,為每張單據命名一個單據類型,作為唯一標識。

模板:單據開發涉及到三大模板(單據模板、查詢模板、打印模板)。單據模板定義了單據的顯示外觀和基本框架,查詢模板定義了單據的查詢對話框,打印模板定義了單據信息打印到打印機的樣式和格式。

VO是ValueObject的簡寫,在NC中是一個抽象類,它實現了Cloneable和Serializable接口,是NC業務數據的載體在系統各層之間傳遞業務數據。

CircularlyAccessibleValueObject是ValueObject的子類,提供了對自身的屬性進行存取操作的方法。

SuperVO是CircularlyAccessibleValueObject的子類,是NC系統中最常使用的VO類型,它與一張數據庫表對應,可以方便的利用NC的JDBCFramework進行持久化操作。

AggregatedValueObject(聚合VO)就是用於存儲一對多關系的主子表數據。對於一主多子的情況,實現IExAggVO接口。

UI工廠:雖然能通過三大模板定義出單據的顯示,但每張單據都有一些公共的或特殊的行為。UI工廠是一種單據開發框架,它將常用單據抽象成了很多類型,因此,UI工廠相當於是單據開發的代碼模板,預置了單據的各種公共行為,比如增、刪、改、查,並且可以連接到NC流程平台,支持審批、單據驅動等應用。

遠程接口:V5遠程組件開發都是基於接口(替代原先的BO訪問),訪問也都是基於接口。

參照:是一種輔助的數據輸入方式,通常彈出界面的形式提供可以參考的數據,比如在錄入省份信息時,提供一個全國省份列表以供選擇。單據開發中,有很多輸入字段存在類似的需求。NC系統中預置了很多種常見參照(基本覆蓋了所有的基本檔案,比如人員參照,存貨參照),如果要自定義一種參照,則需要簡單的開發工作。

ToftPanel:提供對NC產品功能節點開發的支持,統一功能節點的注冊類型(ToftPanel)。提供了節點開發過程中按鈕的注冊機制以及按鈕與界面的互動機制(通過ToftPanel的onButtonClick(bo)方法進行事件響應)。節點打開時,真正運行的是FramePanel實例,它提供了ButtonBar進行按鈕展示,TitlePanel進行節點標題的顯示,同時將用戶開發的ToftPanel子類放置到中心位置進行展現。下圖是ToftPanel區域介紹

 

NC-UAP 總體介紹

NC-UAP作為基於多組織架構的企業應用運行平台、基於模式化的開發平台、開放的系統集成平台及統一的系統管理平台,是建立在Java語言所提供的強大功能的基礎上開發的。Java是一種簡單的、面向對象的、分布式的、結構中立的、安全的、可移植的、性能優異的、多線程的、動態的開發語言,適合構建基於網絡計算的企業應用。由於Java的平台無關性,使得NC-UAP可以運行在不同硬件平台、不同操作系統平台上。基於NC-UAP所開發的應用軟件采用Browser/Server(瀏覽器/服務器)的方式來運行。B/S的運行方式最大限度地方便了用戶部署和維護大型軟件系統,保證了瘦客戶機運行,從而大大降低了用戶目標系統的總體擁有成本(TCO)。

系統框架層主要指基礎軟件,如操作系統、數據庫及J2EE應用服務器。NC-UAP支持多種操作系統(Solaris、AIX、Linux、Windows等),可運行於符合J2EE規范的多種應用服務器(IBM WebSphere、BEA WebLogic、UFIDA Application Server等),支持多種數據庫DBMS(DB2、Oracle、SQL Server、OSCAR等)。NC-UAP還提供Portal服務器進行內容集成以使用戶對企業資源有一個統一的訪問點。

技術框架層是在系統框架層(操作系統、數據庫及應用服務器)和應用系統之間建立的一層技術封裝層和系統資源監控和管理層。技術框架層屏蔽不同具體技術實現的細節,減少直接使用系統資源帶來的復雜性、異構性、不安全性及不穩定性;技術框架層監控和管理系統資源,保證系統資源的可用性及其合理使用;技術框架層提供最佳編程模式,加快在不同技術平台上開發和部署應用的速度,保證應用的健壯性。技術框架層所屏蔽技術實現細節包括界面風格、遠程接入、EJB實現/訪問、多數據庫適配、事務處理、並發處理、緩存處理、安全管理等等。

n 企業服務架構(Enterprise Service Architecture,ESA)

企業服務架構是一個服務集成總線,支持異構環境的服務、消息及基於事件的交互。通過ESA,可以使用與實現無關的接口來定義服務,可發現和調用所需的服務,可解決服務之間的相互依賴。

n 連接框架(Connect Framework)

連接框架連接客戶端與服務器,使不同客戶端(瀏覽器小應用程序、Java應用程序、瀏覽器JSP)可通過不同訪問協議(HTTP/HTTPS,RMI)使用服務器提供的服務。

n 同步(Synchronization)

同步服務實現客戶端與服務器代碼和數據的同步,及集群環境下服務器之間的資源同步。

n SQL翻譯器(SQL Translator)

SQL翻譯器將SQL翻譯成適合目標數據庫的SQL語句,以適配不同數據庫廠商提供的產品;優化SQL,充分發揮不同數據庫的最大性能。

n 元數據管理(Metadata Management)

元數據是描述系統數據(包括界面定義、規則定義、流程定義等)的數據。通過元數據管理,對系統數據統一進行維護以支持用戶自定義,如改變字段的可編輯屬性、字段的取值范圍等。

n 工作流引擎(Workflow)

工作流引擎根據工作過程的描述,通過執行一系列已定義的工作項,完成此工作過程。NC-UAP的工作流引擎支持多種工作流模式,如分支、合並、並行、選擇、循環、回退等;支持工作項的搶占與會簽;支持可配置的動作執行腳本,等等。

n 規則引擎(Rule Engine)

規則引擎用來定義和執行各種規則,包括界面規則、關聯關系、計算規則、條件跳轉規則等。使用規則可以讓應用更加富有柔性。規則需要通用的行業化語言精確表達且淺顯易懂。規則引擎需要滿足一定的計算速度,支持規則的批量處理及理解外部數據。

n 持久化框架(Persistence Framework)

封裝不同持久化技術(如JDBC、普通文件、XML、Excel)。持久化框架可解決對象與關系之間的“阻抗失配”問題。

n 基礎算法(Basic Algorithms)

提供統一的基本算法,如排序,XML文檔操作,方便開發與編程,統一代碼規范。

n 登錄和安全(Login/CA Security)

統一管理系統登錄時的身份認證。支持多種身份認證策略,如靜態密碼認證、基於USB Key的CA身份認證等。支持對業務敏感數據使用證書進行簽名和驗證以防止數據篡改和提供抗抵賴性。

n 調度引擎(Scheduler)

Ø 調度引擎對服務和線程進行統一管理,以屏蔽不同應用服務器的異構性。調度引擎調度各種服務、常駐系統服務、客戶端的請求服務、以及一些服務的組合。

n 異常(Exception)

統一解釋與封裝異常消息,如不同廠商的數據庫異常的不一致。

n 緩存(Cache)

提供在服務器端與客戶端的臨時內存中進行緩存的機制,包括對象的創建、共享訪問、假脫機(Spooling)、失效等,加快對用戶操作的響應。

n 日志(Log)

日志機制提供對系統運行時的監控及支持對系統異常的追蹤與定位。日志機制可控制日志輸出的格式、日志信息的級別、日志信息輸出的目的地(文件、控制台、SocketServer等)。通過配置文件進行靈活的設置,用戶可以細致地控制日志的生成過程,而不需修改程序代碼。

應用框架層是基於企業建模理論的、以業務導向和驅動的、可快速構建應用軟件的軟件平台。應用框架層的出現是一種技術創新,它使軟件平台多了一個具有革命性意義的戰略層次,為降低大型復雜軟件系統的實現難度提供了新的途徑。將應用軟件的業務邏輯和開發技術相對分開,使得應用軟件的開發者可以僅關注應用的業務邏輯,而不必關注其繁瑣的技術實現。這使管理層與業務人員參與應用軟件的開發成為可能。NC-UAP應用框架層基於業務和管理層面,以業務建模(組織、流程、功能、資源、信息)為基本手段,從而構造、開發和維護業務應用系統。使用NC-UAP提供的應用框架層,可大大縮短研發周期,提高研發效率,加快應用開發的速度;減少企業信息系統開發的風險;降低開發成本;實現最終用戶的個性化的需求;支持用戶在發展過程中各種各樣的需求變化;提供應用的高價值。

n 國際化(I18N)

實現界面的多語化及數據和展示的本地化。界面的多語化是指根據用戶登錄時指定的語種顯示相應的語言界面。企業用戶可以修改相應的語言信息及顯示的圖片。數據和展示的本地化指日期、時間、數字、貨幣、匯率等可根據企業用戶本地的習慣進行展示。

n 消息管理(Message Management)

消息管理集中顯示通過ESA所傳送的消息,如應用系統所產生的預警消息,通知消息,業務流程相關的消息,及企業公告和用戶對發消息等。

n 移動管理(Mobile Management)

支持通過移動設備進行消息的交互及操縱業務數據等。對無線設備的廣泛支持,NC-UAP帶來的是企業管理的無處不在和服務的無限拓展,同時也為企業決策人員提供了高端、迅捷的管理機制。

n 組織管理(Organization Management)

提供從不同維度管理企業,如公司、部門、主體賬簿等。

n 數據傳輸(Data Transfer)

數據傳輸負責傳輸以規則定義的數據集以支持數據層的應用集成。

n 數據交換(Data Exchange)

與第三方系統進行數據交換,提供靈活的數據映射及數據綁定,支持根據業務規則的轉換,同時結合工作流平台整合業務流程。

n 動態會計平台(Financial Account Platform)

通過定義會計科目類別和憑證模板,使用憑證生成器,根據業務數據生成實時憑證。在保持業務數據與財務數據相對獨立的基礎上保證數據的一致性和及時性。

n 預警平台(PreAlert)

在預警平台上可定義多種方式的預警條件以進行形式多樣的預警,如時間條件、庫存大小、生日等。預警還可配置在用戶登錄時觸發。預警消息可以用HTML網頁的形式發布,可以通過郵件發布,還可使用短消息發送。

n 業務流程和審批流程的編排(Business Process and Approval Flow Orchestration)

用來定義業務流程和審批流中數據的流向,數據間的關系及以人員的關系。

n 訪問控制(Access Control)

使用基於用戶角色和對象權限的權限分配方式。每一角色都包含公有權限和屬於某一具體公司的私有權限。角色還提供信任功能。

n 應用模式(Application Patterns)

NC-UAP根據經驗積累與用戶實施,總結出一套與應用界面相關的模式(表單、報表和打印),更好地提供滿足用戶需求的界面展現,更快地滿足用戶個性化的需求。

NC的開發模型

系統前端為客戶端UI代碼,UI端代碼繼承ToftPanel,UI代碼通過調用遠程組件與服務器端進行交互,中間傳遞的數據模型為VO,遠程組件調用底層的業務實現代碼,完成整個交互邏輯。通過JDBCFramework,系統提供了一套良好的數據持續機制,解決數據庫交互的復雜問題。

下圖是NCV5的代碼結構圖

NC5后將代碼分區域存放:

Public目錄存放 接口和公共代碼(比如VO和公共算法)

Private目錄存放 實現和其它實現細節

Client目錄存放 客戶端代碼

META-INF目錄存放模塊配置文件目錄,包括module.xml文件和xxx.upm接口配置文件。

 

針對上面的開發模式,我們規范一下代碼的包結構:

nc.itf.<模塊>: 表示該模塊定義的接口

nc.impl.<模塊>:表示該模塊定義的接口實現

nc.vo<模塊>: 表示VO的實現

nc.bs.<模塊>: 普通的后台應用

nc.ui.<模塊>.*: 客戶端代碼

實例講解

V5.X版本的遠程組件開發是基於接口,因此遠程組件的開發按照下面三個步驟開發:

  • 定義遠程接口,注意這里的遠程接口不用實現java.rmi.Remote接口,普通接口就可以了;
  • 對該接口進行實現;
  • 把該組件部署為遠程組件;

下面以HelloWord為例(該實例在培訓教程提供的“\配套示例\示例代碼”目錄下nc5Xsample.rar文件中)講解遠程接口的開發。

 定義接口

package nc.itf.sample;

public interface IHelloWorld {
    String sayHello(String toName);    
}

 實現該接口

package nc.impl.sample;

import nc.itf.sample.IHelloWorld;

public class HelloWorldImpl implements IHelloWorld {
    public String sayHello(String toName) {
        String retValue = "Welcome " + toName + " explore V5";
        System.out.println(retValue);
        return retValue;
    }
}

 部署組件

編輯或新建該產品模塊下的模塊部署描述文件(META-INF下的ncdemo.upm文件),加入一個公共組件:

遠程組件只要指出他的remote屬性為true即可。

<?xml version="1.0" encoding="gb2312"?>
<module name="nc.itf.ncdemo.ejb.NCDEMOSpublicEJB">
  <public>
      <component priority="0" remote="true" singleton="true" supportAlias="false" tx="CMT">
           <interface>nc.itf.sample.IHelloWorld</interface>           <implementation>nc.impl.sample.HelloWorldImpl</implementation>
    </component> 
  </public>
</module>

組件配置說明

  • 配置文件規范

  • 組件分為公共組件和私有組件,分別在public段和private段,如下所示。
<?xml version="1.0" encoding="gb2312"?>
<module  name="testEJB">
  <public>
    <component priority="0" singleton="true" remote="true" tx="NONE" >
      <interface>nc.itf.sample.IHelloPub</interface>
      <implementation>nc.impl.sample.HelloWorldPub</implementation>
    </component>  
  </public>
  <private>
    <component name="IHelloWorld" priority="0" singleton="false" >
      <implementation>nc.impl.sample.HelloWorldImpl</implementation>
    </component>
  </private>
</module>
公共組件的主要配置屬性
name:組件的名稱,如果沒配,默認為第一個接口的名稱,如果沒有接口,為實現類的名稱
singleton:  是否為單例,默認為true
remote: 是否能夠被遠程調用到,默認為false,遠程組件必須要有接口
 tx: 事務屬性, NONE表示沒有事務,CMT表示容器管理的事務,BMT表示Bean管理的事務
 cluster: 標志組件的集群屬性,默認為NORMAL,表示不是集群組件,SP表示為單點組件(必須有接口)
supportAlias: 默認為false,表示是否能夠按照接口進行查找組件
私有組件的配置屬性
除了沒有remote,tx屬性,其余屬性都支持
supportAlias建議為false
3.2.5.客戶端調用
(該實例在培訓教程提供的配套示例代碼的工程NC_DEMO里的client端TestHelloWorldRemotInterface.class中已經實現)
接下來客戶端就可以通過下面的方式進行遠程訪問了:
package nc.ui.sample;
import nc.bs.framework.common.NCLocator;
import nc.bs.framework.test.AbstractTestCase;
import nc.itf.sample.IHelloWorld;
public class TestHelloWorldRemotInterface extends AbstractTestCase {
    public void test123() {
        try {
            //遠程接口調用
            IHelloWorld hello = (IHelloWorld) NCLocator.getInstance().lookup(
                    "nc.itf.sample.IHelloWorld");
            System.out.println(hello.sayHello("uap"));
        } catch (java.lang.Throwable ivjExc) {
            ivjExc.printStackTrace();
        }
    }
    public TestHelloWorldRemotInterface() {
        super();
    }
}

系統輸出:

Welcome uap explore V5

注意:

1、此處客戶端調試代碼通過junit來實現。通過junit運行調試接口比較方便,不需要進行客戶端登陸。具體做法如上面代碼,新做一個類繼承AbstractTestCase,實現一個以test開頭的方法,在方法里面寫調用遠程組件的方法。然后以JUnit來運行就可以了;

    2、在JUnit運行的調試時,在Preferences的MDE Development頁簽中的模塊選擇中建議只選UAP相關模塊,其他模塊不要選擇,否則在調試時可能會出錯;

你的一個實現可以同時實現多個接口,並且可以在部署的時候選擇性的公布出你需要遠程分布的接口,例如你的一個實現類,實現了多個接口IService1, IService2, IService3,你可以選擇只遠程公布接口IService2, IService3,部署信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<module name=" nc.itf.ncdemo.ejb.NCDEMOSpublicEJB">
    <public>
        <component priority="0" remote="true" singleton="true" supportAlias="true" tx="CMT">
            <interface>nc.itf.sample.service.IService2</interface>
            <interface>nc.itf.sample.service.IService3</interface>
<implementation>nc.impl.sample.service.MultiServiceImpl</implementation>         
        </component>
    </public>
</module>

注意:

我們使用了supportAlias屬性,指出我們可以通過兩個接口中的任何接口進行遠程組件的查找。supportAlias為true只有在公共組件中才起作用。

客戶端代碼說明

客戶端調試代碼可以通過junit和注冊Toftpanel來實現。

通過junit運行調試接口比較方便,不需要進行客戶端登陸。新做一個類繼承AbstractTestCase,實現一個以test開頭的方法,在方法里面寫調用遠程組件的方法。然后以JUnit來運行。

Toftpanel方式是寫一個ToftPanel的子類,將此類注冊成nc節點,然后通過eclipse啟動jstarter來進入nc,點擊相應節點執行相應方法。通過擴展ToftPanel,實現getTitle()方法,在postInit()方法中初始化界面,調用setButtons(ButtonObject[])方法設置菜單,實現onButtonClicked(ButtonObject)方法響應菜單事件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM