zoukankan      html  css  js  c++  java
  • Java中运行javascript代码



    原文作者:russle

    原文地址:Java中运行javascript代码(二)



    1、Java 代码

    第一个示例,通过java将json对象传递给js函数

    第二个示例, 将数组传递给js函数,js需要将其中个别位置的字节数组组合后再转回为10进制。
    例如,将数组第5和6位,转变为数字, 0xa1, 0x9F, 也就是线组成a19f,然后转换41375。

    package com.yq.jsdemo;
    
    
    import com.alibaba.fastjson.JSONObject;
    import lombok.extern.slf4j.Slf4j;
    
    import javax.script.Invocable;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import java.io.File;
    import java.io.Reader;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    
    /**
     * Simple to Introduction
     * className: JavaJSDemo
     *
     * @author EricYang
     * @version 2018/12/22 9:51
     */
    
    @Slf4j
    public class JavaJSListDemo {
    
        private static final String JS_ENGINE_NAME= "nashorn";
        private final ScriptEngineManager sem = new ScriptEngineManager();
        private final ScriptEngine engine = sem.getEngineByName(JS_ENGINE_NAME);
    
        public static void main(String[] args) {
            JavaJSListDemo demo = new JavaJSListDemo();
    
            demo.invokeFunctionByFileWithParams();
            demo.invokeFunctionByFileWithListParams();
        }
    
        private void invokeFunctionByFileWithParams() {
            log.info("---          invokeFunctionWithParams         ---" );
            try {
                log.info("Current dir={}", System.getProperty("user.dir"));
                File file = new File("./javademo/src/main/resources/demoWithParams.js");
                Reader reader = Files.newBufferedReader(file.toPath(), Charset.defaultCharset());
    
                Object obj1 = engine.eval(reader);
    
                Invocable jsInvoke = (Invocable) engine;
                JSONObject user = new JSONObject();
                user.put("name", "张三");
                user.put("age", 18);
                //js函数的就是去user对象age然后加上3
                Object obj2 = jsInvoke.invokeFunction("myFunc", user,3);
    
                log.info("function={}, result={}", obj1, obj2);
            }
            catch(Exception ex) {
                log.warn("exception", ex);
            }
        }
    
        private void invokeFunctionByFileWithListParams() {
            log.info("---         With List Params         ---" );
            try {
                log.info("Current dir={}", System.getProperty("user.dir"));
                File file = new File("./javademo/src/main/resources/demoWithListParams.js");
                Reader reader = Files.newBufferedReader(file.toPath(), Charset.defaultCharset());
    
                Object obj1 = engine.eval(reader);
    
                Invocable jsInvoke = (Invocable) engine;
                List<Short> dataList = new ArrayList<>();
                //15,01,00,00,00,0x0B,01,03,08,01,83,0x63,0x88,02,03,0xEA,0x1B
                dataList.add((short)0x15);
                dataList.add((short)0x01);
                dataList.add((short)0x00);
                dataList.add((short)0x00);
                dataList.add((short)0x00);
                dataList.add((short)0x0B);
                dataList.add((short)0x01);
                dataList.add((short)0x03);
                dataList.add((short)0x08);
    
                dataList.add((short)0x01);
                dataList.add((short)0x83);
                dataList.add((short)0x63);
                dataList.add((short)0x88);
    
    
                dataList.add((short)0x02);
                dataList.add((short)0x03);
                dataList.add((short)0xEA);
                dataList.add((short)0x1B);
    
                Object obj2 = jsInvoke.invokeFunction("myFunc", Arrays.toString(dataList.toArray()), "device1234");
    
                log.info("function={}", obj1);
                log.info("result={}", obj2);
            }
            catch(Exception ex) {
                log.warn("exception", ex);
            }
        }
    }
    

    2、JS代码

    2.1demoWithParams.js

    传入的user是个json对象, 将user的age属性加上inc然后返回。

    function myFunc( user, inc) {
       return user.age + inc ;
    }
    

    2.2demoWithListParams.js

    传入的对象是个数组, 类似"[0x83,0x63,0x88,0x02,0x03,0xEA,0x1B]"。

    function myFunc(msgStr, deviceIdStr) {
        var scriptInput = JSON.parse(msgStr);
       	var temperature = scriptInput.slice(9, 13);
       	var fullTempValArray = temperature.slice(2, 4);
       	var strArrayTemp = [];
       	for(var i=0; i<2; i++) {
       		strArrayTemp.push(fullTempValArray[i].toString(16));
       	}
    
       	//console.log("fullTempValArray:", fullTempValArray, ", strArrayTemp:", strArrayTemp.join(''));
       	var tempVal = parseInt(strArrayTemp.join(''), 16);
       	var decimalsNumArray = temperature.slice(1, 2);
       	//tempVal是显示的值,实际值需要根据decimalsNumArray 进行处理, 这里的处理规则是如果decimalsNumArray 减去128的数字,作为小数位数。 也就是tempVal需要除以多少,例如当decimalsNum等4, tempVal需要除以10000,保留4位小数
       	var decimalsNum = parseInt(decimalsNumArray.join('')) -128;
    
       	var actualTempValue = Number((tempVal / (Math.pow(10, decimalsNum))).toFixed(decimalsNum));
    
       	//console.log(actualTempValue)
    
       	var humidity = scriptInput.slice(13, 17);
       	//console.log("-humidity--");
       	//console.log(humidity);
       	var fullHumiValArray = humidity.slice(2, 4);
    
       	var humiVal = parseInt(fullHumiValArray.join(''), 16);
       	var strArrayHumi = [];
       	for(var i=0; i<2; i++) {
       		strArrayHumi.push(fullHumiValArray[i].toString(16));
       	}
        humiVal = parseInt(strArrayHumi.join(''), 16);
    
    
       	//console.log("fullHumiValArray", fullHumiValArray, fullHumiValArray.join(''), " new:", humiVal)
       	//console.log("humiVal", humiVal)
       	decimalsNumArray = humidity.slice(1, 2);
       	decimalsNum = parseInt(decimalsNumArray.join('')) % 10;
       	var actualHumiValue = Number((humiVal / (Math.pow(10, decimalsNum))).toFixed(decimalsNum));
       	//console.log(actualHumiValue);
    
    
       	var data = {}
       	data.temperature = actualTempValue;
       	data.humidity = actualHumiValue;
       	data.deviceId = deviceIdStr;
        return JSON.stringify(data);
    }
    
  • 相关阅读:
    [BZOJ]4810: [Ynoi2017]由乃的玉米田
    VK Cup 2017
    Educational Codeforces Round 19
    [BZOJ]4162: shlw loves matrix II
    2017-4-14校内训练
    第一次 CSP-S 的游记
    APIO2009 采油区域
    NOIP2017 逛公园
    NOIP2013 货车运输
    【9018:1458】征兵
  • 原文地址:https://www.cnblogs.com/aixing/p/13327309.html
Copyright © 2011-2022 走看看