客戶端調用服務器端代碼的方式(非entity、facade方式)

其實EAS中開發中,在client端調用server端代碼是再平常不過的事,比如我們要更新數據,或者進行數據庫查詢等~~方法大家也都知道,利用entity或是facade發佈生成的 XXXXFactory 或是 XXXXFacade 去調用。。

  但是,不知道大家有沒有發現,無論哪種方式,都是在一個前提下才能調用:User已經login了,就是用戶已經登陸了。那麼沒有登錄之前,我怎麼調用服務器等方法呢?這就是我今天要說的內容!

  應用項目:鑫苑項目。
  應用場景:客戶用一個安全系統,可以動態的控制某些用戶能登錄, 有些用戶不能登錄。並且不能利用修改EAS數據庫的方式!
  解決方案:在打開eas的client端時,把所有能登陸的用戶名(加密後)取到客戶端,當用戶填寫用戶名後,在focusout事件裏去校驗此用戶是否可以登錄。
  關鍵問題:在客戶端程序啓動時,怎樣取到可以登錄的用戶的List。因爲此時在用戶登錄之前,不能通過entity或是facade發佈生成的類去調用,否則會報未登錄的錯誤。

  下面就是怎樣通過其他手段來調用服務器端的代碼的方法:

  首先,要建一個接口 IUserListGetter,這個接口要繼承 com.kingdee.bos.orm.IORMModel  接口,比如:

    public interface IUserListGetter extends IORMModel {
        public List getUserList();
     }

  IUserListGetter 這個接口很簡單,就一個方法,就是取得UserList。

    然後定義這個 IUserListGetter 接口的實現類:UserListGetter,這個類同時要繼承 com.kingdee.bos.orm.template.ORMObject。代碼如下:

    public class UserListGetter extends ORMObject implements IUserListGetter {
        // 定義一個名稱。
        public String name;

        public UserGetter(String name) {
            super(null);
            this.name = name;
            super.registerInterface(IUserListGetter.class, this);
        }
       
        public UserGetter() {
            super.registerInterface(IUserListGetter.class, this);
        }

        public String getName() throws ORMCoreException {
            return name;
        }

        public List getUserList() {
            // 以下爲服務器端取得UserList的代碼
        ............
        }
    }

  注:上面的 UserListGetter類中的 name 看邏輯應該不是必須的。最重要的應該是  super.registerInterface(IUserListGetter.class, this); 註冊接口這一句。不過我沒試過刪掉 name 所有的相關代碼。

  這樣,我們要實現的接口和類就做完了,還有一個關鍵點:這兩個類和接口放在哪?(IUserListGetter 和 UserListGetter)。同entity或是facade發佈的XXXXFactory或是XXXXFacade一樣,我們兩個類也放在同app和client同級的包下,如:

    com.kingdee.fdc.tools
                                       |--app
                                       |--client
                                       |--IUserListGetter
                                       |--UserListGetter

  我想大家一定知道爲什麼要這麼放了,因爲這樣放,就是保證我們客戶端也好,服務器端也好,都有 IUserListGetter 和 UserListGetter 編譯成的class。(注:UserListGetter 也許這樣是不必要的,我沒試過,但是IUserListGetter 必須是這樣的。)

    好了,剩下的就是客戶端怎樣調用了,其實很簡單:

    // 關於UIConfig.getUrl()應該是取服務器的URL,這裏要注意哪個是類名,哪個是接口。他們名字比較像,只差前面的一個I。
    IUserListGetter userListGetter = (IUserListGetter) RPCEngineFactory.getEngine(UIConfig.getUrl()).createObject("com.kingdee.fdc.tools.UserListGetter", IUserListGetter.class);
      List userList = userListGetter.getUserList();

  好了,這樣就可以了。就像上面客戶端調用的代碼中:com.kingdee.fdc.tools.UserListGetter 這個字符串,他如果只是向服務器傳去一個字符串,那麼 UserListGetter 類就沒必要與 IUserListGetter 接口同級,並且保持在客戶端有 UserListGetter.class。但是如果不是簡單的一個字符串,那麼可能就必須保證客戶端也有 UserListGetter.class 存在了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章