其實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 存在了。