服务端调用js:javax.script
谈起js在服务端的应用,大部分人的第一反应都是node.js。node.js作为一套服务器端的 JavaScript 运行环境,有自己的独到之处,但不是所有的地方都需要使用它。
例如在已有的服务端代码上增加一个业务,而这个业务使用的却是js编写。如果用node.js处理的话,会很麻烦。而且另一方面对于很多服务端程序员来说,觉得js的对象模型很奇怪,不太喜欢用js处理问题。
对于上面这种情况,有一种简单的处理方法:javax.script API
javax.script加入了对部分脚本语言的支持,它的原意是为了针对关于业务在客户端和服务端中,逻辑相同而语言不同导致实现不同的问题。但是这种处理方法由于前后端的分工和一些缺陷,很少在实际应用中用到。
javax.script实现起来很简单。
一:得到一个ScriptEngine对象
ScriptEngineManager maneger = new ScriptEngineManager();
ScriptEngine engine = maneger.getEngineByName("JavaScript");
二:读js文件
Reader scriptReader = new InputStreamReader(
JsInServer.class.getResourceAsStream("js文件"));
三:解析文件
engine.eval(scriptReader);
四:调用js方法,得到的结果以Object对象返回
Object result = invocable.invokeFunction("js方法", js方法参数1, js方法参数2...);
测试例子:
java
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader; import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException; public class JsInServer { public static void main(String[] arg) throws IOException { ScriptEngineManager maneger = new ScriptEngineManager();
ScriptEngine engine = maneger.getEngineByName("JavaScript"); Reader scriptReader = new InputStreamReader(
JsInServer.class.getResourceAsStream("TestAdd.js"));
if (engine != null) {
try {
// JS引擎解析文件
engine.eval(scriptReader);
if (engine instanceof Invocable) {
Invocable invocable = (Invocable) engine;
// JS引擎调用方法
Object result = invocable.invokeFunction("add", 1, 2);
System.out.println("The result is: " + result);
}
} catch (ScriptException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} finally {
scriptReader.close();
}
} else {
System.out.println("ScriptEngine create error!");
}
}
}
js:
function add(a,b){
println("The first parameter is: " + a);
println("The second parameter is: " + b);
return a+b;
}
println("js perform success");
执行结果:
js perform success
The first parameter is: 1
The second parameter is: 2
The result is: 3.0
服务端调用js:javax.script的更多相关文章
- Headless Chrome:服务端渲染JS站点的一个方案【上篇】【翻译】
原文链接:https://developers.google.com/web/tools/puppeteer/articles/ssr 注:由于英文水平有限,没有逐字翻译,可以选择直接阅读原文 tip ...
- 服务端调用接口API利器之HttpClient
前言 之前有介绍过HttpClient作为爬虫的简单使用,那么今天在简单的介绍一下它的另一个用途:在服务端调用接口API进行交互.之所以整理这个呢,是因为前几天在测试云之家待办消息接口的时候,有使用云 ...
- Headless Chrome:服务端渲染JS站点的一个方案【中篇】【翻译】
接上篇 防止重新渲染 其实说不对客户端代码做任何修改是忽悠人的.在我们的Express 应用中,通过Puppteer加载页面,提供给客户端响应,但是这个过程是有一些问题的. js脚本在服务端的Head ...
- WCF服务端调用client.
wcf服务端 1,新建一个"windows窗口程序"名称为WCFServer2. 2.然后加入一个"WCF服务"名称为Service1. 详细步骤为:解决方式试 ...
- 上传图片到七牛云(服务端 node.js sdk)
大体思路 前端要上传图片到七牛云,需要有一个token进行授权操作,而获取这个上传的upload token(以下简称upToken),在服务端需要一定的身份校验,比如说:只有登录的vip用户才能拿到 ...
- php使用webservice调用C#服务端/调用PHP服务端
由于公司业务需要,用自产平台对接某大厂MES系统,大厂提出使用webservice来互通,一脸懵逼啊,一直没有使用过php的webservice的我,瞬间打开手册开始阅读,最终爬过无数坑之后,总结出如 ...
- Java web服务端参数校验Javax.validation (springboot)
一.基本使用 Javax.validation是spring集成自带的一个参数校验接口.可通过添加注解来设置校验条件. 下面以springboot项目为例进行说明.创建web项目后,不需要再添加其他的 ...
- 服务端调用dubbo的方式
方式1.通过dubbo 方式2.通过spring applicationContext-dubbo.xml 注意引入提供方的接口jar包
- Asp.net SignalR 实现服务端消息推送到Web端
之前的文章介绍过Asp.net SignalR, ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信. 今天我 ...
随机推荐
- 读取xml时,遇到xmlns的问题
1.读取xml的时候,由于xml里有xmlns的属性,导致了读xml无法正常读取.通过网上搜索,发现需要先注册命名空间. xmlns是XML Namespaces的缩写,中文名称是XML(标准通用标 ...
- Java排序8大算法实现
概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...
- 12XML(可扩展标记语言)
XML:eXtensible Markup Language 什么是标记语言?什么是标记? 标记(Markup):文档中任何不想被打印输出的部分(不是真正的文档内容,联想读书时做的“读书笔记”,在旁边 ...
- mysql数据库中编码问题(续)
其实之前的数据库中文乱码问题并没有彻底的解决,虽然在网页上显示正常,但是在数据库中却是乱码,虽然用户看起来没问题,但是自己就遭罪了,而且也是个极大的问题 究其原因,是没注意到一点,就是数据库中表的结构 ...
- 344. Reverse String(C++)
344. Reverse String Write a function that takes a string as input and returns the string reversed. E ...
- js编译和执行顺序
JS是一段一段执行的(以<script>标签来分割),执行每一段之前,都有一个“预编译”,预编译干的活是:声明所有var变量(初始为undefined),解析定义式函数语句. 还有个关于 ...
- SQL 结构化查询语言
SQL 结构化查询语言 一.数据库的必要性: >>作用:存储数据.检索数据.生成新的数据 1)可以有效结构化存储大量的数据信息,方便用户进行有效的检索和访问. 2)可以有效地保持数据信息的 ...
- YII session存储 调用login方法
当要进行用户的session存储的时候,可以调用里面的login方法进行存储
- HDU2602 (0-1背包问题)
N - 01背包 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descri ...
- EasyPR--开发详解
我正在做一个开源的中文车牌识别系统,Git地址为:https://github.com/liuruoze/EasyPR. 我给它取的名字为EasyPR,也就是Easy to do Plate Reco ...