Java利用JavaScript腳本計算器
- 介紹
- 準備作業
- 代碼如下
- main方法
- 功能效果
- 結束語
- 功能實作完畢
介紹
利用JAVA面向物件思想快速開發腳本計算器
準備作業
教程基于 IDEA2020.3.2 JDK1.8 開發
- 需求分析 :
我們利用JS腳本來完成簡易計算器,那么需要一個js檔案以及相關專案demo,需要有 加減乘除 四個功能,
既然我們明白了功能需求,那我們就開始動手把!
- 類的定義:
創建一個數字資訊 (NumberData) 類用來儲存資料項 和 數字計算介面(NumberCalculation) 以及相關實作類(NumberAdapter)
代碼如下
- NumberData(數字資料類)
package cn.marinda.data;
public class NumberData
{
private int num1;
private int num2;
public NumberData(int num1 ,int num2)
{
this.num1 = num1;
this.num2 = num2;
}
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
}
- NumberAdapter(實作類)
package cn.marinda.handle;
import cn.marinda.data.NumbersCalculation;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.FileReader;
public class NumberAdapter implements NumbersCalculation {
public static NumberAdapter adapter = new NumberAdapter();
private NumberAdapter()
{
}
/**
* 計算回傳整數結果
*
* @param num1 數字一
* @param num2 數字二
* @param mode 方式
* @return
*/
@Override
public int getIntResult(int num1, int num2, String mode) {
String thisMode = isMode(mode);
int result = jsInvoke(num1, num2, mode);
return result;
}
/**
* 計算回傳小數結果
*
* @param num1 數字一
* @param num2 數字二
* @param mode 方式
* @return
*/
@Override
public int getDoubleResult(int num1, int num2, String mode) {
return 0;
}
/** 驗證型別
*
* @param mode 型別
* @return 計算型別
* 回傳型別
*/
private String isMode(String mode)
{
switch (mode)
{
case "+":
return "+";
case "_":
return "_";
case "*":
return "*";
case "/":
return "/";
}
return null;
}
/** 通過JS腳本來快速計算結果
* 計算器
* @param num1 數字1
* @param num2 數字2
* @param mode 型別
* @return 計算結果
* use JavaScrip
*/
public int jsInvoke(int num1,int num2,String mode)
{
ScriptEngineManager mannager = new ScriptEngineManager();
ScriptEngine engine = mannager.getEngineByName("javascript");
String jsFiles = "src/invoke.js";
double results = 0.0;
try {
FileReader reader = new FileReader(jsFiles);
engine.eval(reader);
if(engine instanceof Invocable){
Invocable invokes = (Invocable) engine;
results = (double)invokes.invokeFunction("invoke",num1,num2,mode);
}else{
reader.close();
}
}catch (Exception e){
e.printStackTrace();
}
return (int)results;
}
}
- NumberCalculation(數字計算介面)
package cn.marinda.data;
public interface NumbersCalculation {
/** 計算回傳整數結果
*
* @param num1 數字一
* @param num2 數字二
* @param mode 方式
* @return
*/
public int getIntResult(int num1,int num2,String mode);
/** 計算回傳小數結果
*
* @param num1 數字一
* @param num2 數字二
* @param mode 方式
* @return
*/
public int getDoubleResult(int num1,int num2,String mode);
}
- index.js
function invoke(a, b,mode) {
var c = (a + mode + b);
var num1 = Number(c.substr(0,1));
var num2 = Number(c.substr(c.length-1));
var r = 0;
switch (mode) {
case "+":
r = (a + b);
break;
case "*":
r = (a * b);
break;
case "/":
r = (a / b);
break;
case "-":
r = (a - b);
break;
}
return r;
}
由于我們這里的 JavaScript 讀出來的 mode 不能被直接進行運算,我們就通過JavaScript 的SubString方法來分貝取Number1 和 Number2 然后再通過switch來取mode進行計算
main方法
package cn.marinda;
import cn.marinda.data.NumberData;
import cn.marinda.handle.NumberAdapter;
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
applications();
}
private static void applications() {
while (true) {
System.out.println("歡迎使用白云計算器");
System.out.println("請輸入一個整數");
Scanner scanner = new Scanner(System.in);
int num1 = scanner.nextInt();
System.out.println("請輸入再輸入一個整數");
int num2 = scanner.nextInt();
System.out.println("請輸入運算子");
String mode = scanner.next();
NumberData data = new NumberData(num1,num2);
System.out.println("計算結果是:" + NumberAdapter.adapter.getIntResult(data.getNum1(),data.getNum2(),mode));
System.out.println("要退出請按q鍵,按其他鍵繼續!");
String str = scanner.next();
if(!str.equalsIgnoreCase("q")){
continue;
}else{
System.out.println("good bye!");
break;
}
}
}
}
功能效果

結束語
功能實作完畢
主要還是用到Java內置的ScriptEngineManager和 ScriptEngine 來與JavaScript搭橋牽線,
關于ScriptEngineManager 和ScriptEngineManager
- 可以看CSDN其他博主文章以及自行百度
- 初次發布對內容有疑問的歡迎評論指出
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/296891.html
標籤:其他
上一篇:前端高效開發不得不知道的一些JavaScript庫!
下一篇:Axios
