JavaScript调用Applet方法,Applet异步调用远程RPC。

项目中涉及到JavaScript调用Applet方法,然后Applet远程调用Server端的service。虽然Applet已经签名,但由于JavaScript是不被JavaVM信任的,迫不得已使用异步调用remote API。远程API使用Hessian实现的。

1。被JavaScript调用的Applet方法

    public String deleteFaceId(String faceId) {
     String result = null;
     
     try {
      Task task = new Task("deleteFaceById");
      task.setTypes(new Class[] {String.class, Calendar.class, String.class});
      task.setArgs(new Object[] {faceId,
warituke.table.getPubDate(), warituke.table.getMediaId()});
      
      tasks.add(task);

      ServiceContext temp = (ServiceContext)getResult(task.getName());

       if (temp.getAttribute("warning") != null) {
        result = (String)temp.getAttribute("warning");
       }
       if (temp.getAttribute("error") != null) {
        result = (String)temp.getAttribute("error");
       }
      
       warituke.setTable((Table)temp.getAttribute("result"));
      
       displayTable(warituke.table);
     } catch (Exception e) {
        log.log(Level.SEVERE, e.getMessage(), e);
        result = e.getMessage();
     }

        return result;
    }

 2。 Task代表一个方法调用

public class Task {
 private String name;
 private Class[] types;
 private Object[] args;
 private Object result;
 
 public Task() {}
 
 public Task(String name) {
  this.name = name;
 }
 
 public Object[] getArgs() {
  return args;
 }
 public void setArgs(Object[] args) {
  this.args = args;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Class[] getTypes() {
  return types;
 }
 public void setTypes(Class[] types) {
  this.types = types;
 }

 public Object getResult() {
  return result;
 }

 public Task setResult(Object result) {
  this.result = result;
  
  return this;
 }
}
3. Applet

public class BaseApplet extends Applet implements Runnable {

    Vector tasks = new Vector();
    Vector taskResults = new Vector();


public void init() {

new Thread(this).start();

}

//接受返回参数的方法。

 public Object getResult(String name) {
  do {
   try {
    Thread.sleep(200);
   } catch (Exception e) {
    log.log(Level.SEVERE, e.getMessage(), e);
   }
  } while (taskResults.size() == 0);

  Task[] tasks = (Task[]) taskResults.toArray(new Task[0]);
  for (int i = 0; i < tasks.length; i++) {
   Task task = tasks[i];

   if (task.getName().equals(name)) {
    taskResults.remove(task);

    return task.getResult();
   }
  }

  return null;
 }

//Applet的执行远程调用的线程

 public void run() {
  while (true) {

   if (tasks.size() > 0) {
    Task task = (Task) tasks.get(0);

    try {
     Method m = service.getClass().getMethod(task.getName(), task.getTypes());
     Object result = m.invoke(service, task.getArgs());

     taskResults.add(task.setResult(result));
    } catch (Exception e) {
     log.log(Level.SEVERE, e.getMessage(), e);
    }

    tasks.remove(0);
   }

   try {
    Thread.sleep(100);
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }

 

}

网页里贴代码好丑啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值