从Javascript调用Java方法?

时间:2016-11-28 15:30:04

标签: javascript java

我得到了这样一个案例:

我得到了一个包含以下代码的java类:

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";
}

也是boot.js文件:

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


function init(d) {
    dss = d;
}

也是test.js文件:

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");
}

也是一个界面

@GET
@Path("/age")
@Produces(MediaType.APPLICATION_JSON)
public int age();



@GET
@Path("/blood_preasure")
@Produces(MediaType.APPLICATION_JSON)
public int bloodPreasure();

也是实现该接口的类

@Stateless
@LocalBean
@Path("/bl")
public class Blulinea implements BlRest{
@Override
public int age() {
    return 65;
}
@Override
public int bloodPreasure() {
    return 150;
}

}

所有这些都通过html页面上的href链接起作用

好的......现在,我首先在test.js文件中只有f函数....并且从会话bean中的execute函数调用它...并且一旦我按下链接它就可以了,它显示65岁,适合年龄......

现在,我添加了一个新功能f2,用于血液预测......并将所有关于它的部分添加到代码中.... 完成后,我使用以下代码调用f2函数:

Object res = invocable.invokeFunction("f2", 5);

女巫我放入了执行方法...但是当我按下页面上的href链接时,它再次显示65(年龄) 然后我试图找到一个解决方案,我发现,在执行方法中我调用的函数f和f2都无关紧要......但是我在文件顶部声明了常量....

private static final int AGE = 1;
private static final int BLOOD_PREASURE = 3;

这两个参数,决定调用哪个函数......

如果年龄小于blood_preasure则会调用age函数,否则将调用blood_preasure函数.... ofc bc of switch case ...

但我需要能够像这样调用正确的函数

Object res = invocable.invokeFunction("f", 5);

Object res = invocable.invokeFunction("f2", 5);

尽管在开关中常量....的值较低 Ofc,如果我将值更改为2或更高,则交换机ll给出-1

lambda函数中的arg参数总是1 ... mby你可以告诉我一个用invokeFunction改变它的方法

我希望你能解决我的问题并帮助我...

1 个答案:

答案 0 :(得分:0)

我发现答案......在启动文件中是这样的:

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

并且存在问题,应该是AGE = 1且BLOOD_PREASURE = 2

那么它有效......