banq大大,能不能看看我这个问题,拜托了

08-06-26 roy2004

我有一个纯java的报表控件,是一个jar包,大概3M左右,这个包里面当然是所有对于报表的操作.

现在我为了实现利用applet进行报表模板修改编辑的功能,按通常做法,配置一个jsp,指定那个控件jar包,指定入口类,指定参数等等.

ok,这都没有问题,但是,因为客户端调用applet必须先下载到客户端然后使用,这就面临了一个加载速度的问题,我那包是3M左右,那么下载时间也得好一会,这对于用户来说肯定无法接受.

我想,能不能让客户端只下载一个入口类,而把控件jar包放在服务端.让客户端的那个入口类去远程调用?

于是通过各方查询,尝试用会话bean来实行远程调用:

Properties props = new Properties();

props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");

props.setProperty("java.naming.provider.url", "localhost:1099");

props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");

InitialContext ctx;

try {

ctx = new InitialContext(props);

rmiInterface rmiReport= (rmiInterface) ctx.lookup("rmiClass/remote");

rmiReport.init2(param2, this);

this.show();

System.out.println("adfasdfas");

} catch (NamingException e) {

}

因为我是个菜鸟,很多知识都不知道,当我调用了这段代码后,发现不成,因为这个this传入init2方法后,不管调用几次this.add(...)都没用.后来我又打算把这个init2方法修改成带返回值的,但是,因为是远程调用,所以返回的对象以及引用的对象都必须实现序列化.这导致我这个想法也以失败告终.

然后我又用了第二种方法,类加载器:

URLClassLoader loader=null;

try{

URL[] path={new URL("http://localhost:90/MyReportDemo/file/abcde.jar")};

URLClassLoader myClassLoader = new URLClassLoader(path, Thread.currentThread().getContextClassLoader());

loader= URLClassLoader.newInstance(path);

Class myClass=myClassLoader.loadClass("a.b.c.rmiClass");

rmiInterface rm = (rmiInterface)myClass.newInstance();

String param2[]=new String[]{

loginUser,dbDrive,dbUrl,dbUserName,dbPassword

};

rm.init2(param2, this);

}catch(Exception e){

}

这样做用eclipse运行确实没有问题,即使我的项目里没有rmiClass这个类,只要那个abcde.jar中有,依然是没有问题的,可以一旦到了页面运行的环节就错了,昨天晚上报出的最后一个错误是rmiClass不能转换为rmiInterface.但是,我的rmiClass类是实现rmiInterface这个接口的.

这里牛人众多,其中以banq为首,我只想问问,象我上面所说的这种需求是否有成功的可能性.因为一旦远程就牵涉到序列化,但是我不可能让那个jar包里都实现序列化都没有静态或瞬态变量.但我又想只把最少量的类下载到客户端以提高applet加载速度,所以我想请教banq大牛,有没有什么好的思路.

谢谢

banq
2008-06-27 10:21

看看远程RPC之类文章,如使用Spring的远程组件。

roy2004
2008-06-27 12:44

谢谢banq老大,那我去研究一下^_^

roy2004
2008-06-28 00:30

用了invoke方法调用,不过又出现了一个问题,那就是applet的权限问题,以前的做法因为直接调用那个jar包,所以对jar包进行授权后,使用没问题,但现在是通过class调用jar再调用资源文件,导致授权过的jar包依然无法访问服务端资源。不知道怎么办了。肯定不能在客户端也来个所谓的授权之类的。

不过还是要谢谢banq大大。

至于spring的远程组件使用,小弟还没到那层次,嘻嘻