原文作者: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. C++作用域限定符:private/public与protected

    C++的作用域限定符其实涉及到了C++特性中的封装和继承. public/private:涉及类的封装特性.对于一个类需要对外展示的部分,我们可以将其声明为public,对于不希望对外展示的,我们将其 ...

  2. 2. C++中的引用

    1.  引用的基本使用 作用:给变量起别名 语法:数据类型  &别名=原名 注意: 别名数据类型与原名数据类型一致. 引用必须初始化. 引用一旦初始化后,就不可以更改(只能作为一个变量的别名) ...

  3. sa-token v1.9.0 版本已发布,带来激动人心新特性:同端互斥登录

    sa-token是什么? sa-token是一个JavaWeb轻量级权限认证框架, 官网首页:http://sa-token.dev33.cn/ 如果你经常使用腾讯QQ,就会发现它的登录有如下特点:它 ...

  4. 记一次SqlServer大表查询语句优化和执行计划分析

    数据库: sqlserver2008r2 表: device_data 数据量:2000w行左右 表结构 CREATE TABLE [dbo].[device_data]( [Id] [int] ID ...

  5. CentOS8设置网络镜像安装源

    CentOS8通过引导盘+网络镜像镜像源安装系统,设置网络镜像安装源为: mirrors.aliyun.com/centos/8/BaseOS/x86_64/os

  6. idea多模块启动

    2018版本的idea 原文链接http://zhhll.icu/2020/04/07/idea/idea%E4%B9%8B%E5%A4%9A%E6%A8%A1%E5%9D%97%E5%90%AF%E ...

  7. Spring Cloud Gateway 跨域 CORS 配置方式实现

    网上找了一堆文章全是说这样写无效 globalcors: cors-configurations: '[/**]': allowCredentials: true allowedOriginPatte ...

  8. 剑指offer 树的基本操作:四种遍历方式

    前序遍历 递归版 编程思想 即借助系统栈,效率较低.二叉树的前序遍历规则:1. 访问根结点: 2. 遍历左子树: 3. 遍历右子树 编程实现 //树的定义 struct TreeNode { int ...

  9. Python 日志打印之logging.getLogger源码分析

    日志打印之logging.getLogger源码分析 By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #函数说明 logging.getLogger(nam ...

  10. 一. SpringCloud简介与微服务架构

    1. 微服务架构 1.1 微服务架构理解 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦.你可以将其看作是在 ...