项目中涉及到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();
}
}
}}
网页里贴代码好丑啊。