原文作者: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);
}

Java中运行javascript代码的更多相关文章

  1. JAVA中执行JavaScript代码并获取返回值

    JAVA中执行JavaScript代码并获取返回值 场景描述 实现思路 技术要点 代码实现 测试方法 运行结果 改进空间 场景描述 今天在CSDN上偶然看到一个帖子对于一段字符串 “var p=‘xx ...

  2. 尚学堂 215 在java中执行JavaScript代码

    package com.bjsxt.test; import java.io.FileReader; import java.net.URL; import java.util.List; impor ...

  3. 在 sublime 中运行 JavaScript 代码

    安装 Node 环境,参考 Node.js入门 打开 Sublime,选择 Tools > Build System > New Build System... 会打开一个新的文件,粘贴以 ...

  4. v8js-在PHP中运行javascript代码

    起因之前写自动登录操作一个网站的PHP脚本,但是发现该网站用js代码做了cookie的计算和验证,所以使用了v8js. 安装安装v8.(Mac:brew install v8)使用pecl insta ...

  5. java中执行js代码

    要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...

  6. 如何在Java中调用Python代码

    有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...

  7. 在 .NET Core 中运行 JavaScript

    一.前言 在 .NET Framework 时,我们可以通过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,我们如何在 . ...

  8. 第85节:Java中的JavaScript

    第85节:Java中的JavaScript 复习一下css: 选择器的格式: 元素选择器:元素的名称{} 类选择器:. 开头 ID选择器:# ID选择器 后代选择器: 选择器1 选择器2 子元素选择器 ...

  9. 浏览器地址栏运行JavaScript代码

    这个很多人应该还是知道的,在浏览器地址栏可以直接运行JavaScript代码,做法是以javascript:开头后跟要执行的语句.比如: javascript:alert('hello from ad ...

随机推荐

  1. JavaDailyReports10_14

    1 package Test; 2 3 import java.util.Scanner; 4 5 public class Main { 6 7 public static void main(St ...

  2. MySQL索引优化,explain详细讲解

    前言:这篇文章主要讲 explain 如何使用,还有 explain 各种参数概念,之后会讲优化 一.Explain 用法 模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理 ...

  3. OpenGL投影矩阵(Projection Matrix)构造方法

    (翻译,图片也来自原文) 一.概述 绝大部分计算机的显示器是二维的(a 2D surface).在OpenGL中一个3D场景需要被投影到屏幕上成为一个2D图像(image).这称为投影变换(参见这或这 ...

  4. 什么是Service Mesh

    摘自https://zhuanlan.zhihu.com/p/61901608 Service Mesh作为下一代微服务技术的代名词,初出茅庐却深得人心一鸣惊人,大有一统微服务时代的趋势. 那么到底什 ...

  5. hashmap简单实现

    p.p1 { margin: 0; font: 11px Monaco } p.p2 { margin: 0; font: 11px Monaco; min-height: 15px } p.p3 { ...

  6. Windows server 安装远程桌面及破解120天时间限制授权

    一.问题描述 Windows Server系列服务器默认远程桌面连接数是2个用户(本文适用于所有Windows Server系列服务器),如果多余两个用户进行远程桌面连接时,系统就会提示超过连接数,可 ...

  7. VirtualBox安装ubuntu 开发环境 配置

    一 下载VirtualBox安装程序以及ubuntu光盘镜像 1.下载VirtualBox安装程序(本文选用的是6.0.12版本) 建议从清华大学镜像站 https://mirrors.tuna.ts ...

  8. 用python+sklearn(机器学习)实现天气预报数据 模型和使用

    用python+sklearn机器学习实现天气预报 模型和使用 项目地址 系列教程 0.前言 1.建立模型 a.准备 引入所需要的头文件 选择模型 选择评估方法 获取数据集 b.建立模型 c.获取模型 ...

  9. 【Spring】Spring JdbcTemplate

    Spring JdbcTemplate 文章源码 JdbcTemplate 概述 它是 Spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装.Spring 框架提供了很多的操 ...

  10. utraedit不小心把打开文件列表弄得不显示的处理办法

    视图->视图/列表->打开文件标签