bekam ich einen Fall wie folgt aus:Java Methoden aus Javascript aufrufen?
ich mit dem folgenden Code ein Java-Klasse bekam:
private static final int INVALID_PARAM = -1;
private static final int AGE = 1;
private static final int BLOOD_PREASURE = 3;
@GET
@Path("/execute")
public String execute(@Context HttpServletRequest req) {
try {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval(getSrc(req.getServletContext().getRealPath("js/boot.js")));
engine.eval(getSrc(req.getServletContext().getRealPath("js/test.js")));
Invocable invocable = (Invocable) engine;
Function<Integer, Object> fn = (arg) -> {
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget rtarget = client.target("http://localhost:8080/DSS-war/rest/bl");
BlRest rest = rtarget.proxy(BlRest.class);
switch(arg) {
case AGE:
int age = rest.age();
client.close();
return age;
case BLOOD_PREASURE:
int bloodPreasure = rest.bloodPreasure();
client.close();
return bloodPreasure;
}
return INVALID_PARAM;
};
invocable.invokeFunction("init", fn);
Object res = invocable.invokeFunction("f", 5);
return res.toString();
}catch(
ScriptException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}catch(
NoSuchMethodException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return"Error";
}
Auch eine boot.js Datei:
var dss;
var AGE = 1;
var INVALID_PARAM = -1;
var BLOOD_PREASURE = 1;
function init(d) {
dss = d;
}
Auch eine test.js Datei :
function f(x) {
var age = dss(AGE);
return age;
}
function f2(x) {
var bloodPreasure = dss(BLOOD_PREASURE);
return bloodPreasure;
}
function c(callback) {
return callback("from callback");
}
auch eine Schnittstelle
@GET
@Path("/age")
@Produces(MediaType.APPLICATION_JSON)
public int age();
@GET
@Path("/blood_preasure")
@Produces(MediaType.APPLICATION_JSON)
public int bloodPreasure();
auch eine Klasse, die implementiert, die eine Schnittstelle
@Stateless
@LocalBean
@Path("/bl")
public class Blulinea implements BlRest{
@Override
public int age() {
return 65;
}
@Override
public int bloodPreasure() {
return 150;
}
}
alle, die auf einer HTML-Seite
Ok ... jetzt durch ein href Link funktioniert, ich gerade noch hatte die f-funktion in der test.js-datei .... und von der execute-funktion in der sitzungs-bean aufgerufen ... und es funktionierte alles, sobald ich den link drückte, zeigte es 65, für das alter ...
Jetzt, ich eine neue Funktion f2 hinzugefügt, für Blut preasure .... und fügte hinzu, alle Teile davon an den Code .... Ist das erledigt, rief ich die f2-Funktion mit dem folgenden Code:
Object res = invocable.invokeFunction("f2", 5);
hexe ich in der execute-methode ... aber wenn ich den a href link auf der seite drückte, zeigte es wieder 65 (alter) dann habe ich versucht, eine lösung zu finden, und ich habe das entweder die funktion herausgefunden f noch f2 Hexe i in der execute-Methode namens Ball hielt Materie .... aber was Sache war die konstante i erklärte am Anfang der Datei ....
private static final int AGE = 1;
private static final int BLOOD_PREASURE = 3;
Diese 2 Parameter entscheiden, welche Funktion aufgerufen wurde ...
Wenn das Alter kleiner ist als blood_preasure, dann wird die alge Funktion aufgerufen, sonst wird die blood_preasure Funktion aufgerufen .... ofc its bc of the switch case ...
, aber ich brauche die richtige Funktion wie diese
Object res = invocable.invokeFunction("f", 5);
oder
Object res = invocable.invokeFunction("f2", 5);
nicht, obwohl der untere Wert auf die ständige anrufen können .... im Schalter Ofc, wenn ich die Werte auf 2 oder höher ändere, gebe ich den Schalter ll -1
Und der Arg-Parameter in der Lambda-Funktion ist immer 1 ... mby du kannst mir zeigen ein Weg, um es mit dem invokeFunction zu ändern
ich hoffe, u mein Problem habe und mir helfen ...
was bedeutet "Ofc" bedeuten ? – Chisko