客户端调用服务器端代码的方式(非entity、facade方式)

来源:互联网 发布:淘宝开店一个月没生意 编辑:程序博客网 时间:2024/05/01 17:58
实EAS中开发中,在client端调用server端代码是再平常不过的事,比如我们要更新数据,或者进行数据库查询等~~方法大家也都知道,利用entity或是facade发布生成的 XXXXFactory 或是 XXXXFacadeFactory 去调用。。

  但是,不知道大家有没有发现,无论哪种方式,都是在一个前提下才能调用: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 存在了。
原创粉丝点击