2016-11-28 2 views
-1

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 ...

+0

was bedeutet "Ofc" bedeuten ? – Chisko

Antwort

0

fand ich die Antwort ...in der Startdatei sind diese Zeilen:

var AGE = 1; 
var INVALID_PARAM = -1; 
var BLOOD_PREASURE = 1; 

und es gibt das Problem, sollte es AGE sein = 1 und BLOOD_PREASURE = 2

dann funktioniert es ...

Verwandte Themen