关于Java配合JavaScript实现计算器功能

介绍

利用JAVA面向对象思想快速开发脚本计算器

准备工作

教程基于 IDEA2020.3.2 JDK1.8 开发

  1. 需求分析

我们利用JS脚本来完成简易计算器,那么需要一个js文件以及相关项目demo,需要有 加减乘除 四个功能。

既然我们明白了功能需求,那我们就开始动手把!

  1. 类的定义:

创建一个数字信息 (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方法来分贝取Number1Number2 然后再通过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搭桥牵线。

关于ScriptEngineManagerScriptEngineManager

  • 可以看CSDN其他博主文章以及自行百度
  • 初次发布对内容有疑问的欢迎评论指出
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,下面是一个简单的Java Web计算器实现过程: 1. 首先创建一个JSP页面,用于显示计算器界面。在该页面中,需要有一些按钮,如数字、运算符、清除、等于等。 2. 创建一个JavaBean类,用于处理计算器的逻辑。在该类中,需要定义一些成员变量,如操作数1、操作数2、运算符等,以及一些方法,如加、减、乘、除等。 3. 在JSP页面中,使用`<jsp:useBean>`指令引用JavaBean类,并通过`<jsp:setProperty>`指令设置JavaBean类的属性。 4. 在JSP页面中,使用`<% %>`标签引用JavaBean类中的方法,用于处理用户的操作。例如,当用户点击加号按钮时,调用JavaBean类中的加法方法。 5. 最后,使用`<%= %>`标签输出计算结果。 下面是一个简单的Java Web计算器的代码实现: Calculator.jsp: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.example.bean.CalculatorBean" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Calculator</title> </head> <body> <h1>Calculator</h1> <form method="post"> <table> <tr> <td colspan="4"><input type="text" name="result" value="${calculatorBean.getResult()}" /></td> </tr> <tr> <td><input type="button" value="7" onclick="document.forms[0].result.value += '7'" /></td> <td><input type="button" value="8" onclick="document.forms[0].result.value += '8'" /></td> <td><input type="button" value="9" onclick="document.forms[0].result.value += '9'" /></td> <td><input type="button" value="+&quot; onclick="document.forms[0].operator.value = '+&#39;" /></td> </tr> <tr> <td><input type="button" value="4" onclick="document.forms[0].result.value += '4'" /></td> <td><input type="button" value="5" onclick="document.forms[0].result.value += '5'" /></td> <td><input type="button" value="6" onclick="document.forms[0].result.value += '6'" /></td> <td><input type="button" value="-" onclick="document.forms[0].operator.value = '-'" /></td> </tr> <tr> <td><input type="button" value="1" onclick="document.forms[0].result.value += '1'" /></td> <td><input type="button" value="2" onclick="document.forms[0].result.value += '2'" /></td> <td><input type="button" value="3" onclick="document.forms[0].result.value += '3'" /></td> <td><input type="button" value="*" onclick="document.forms[0].operator.value = '*'" /></td> </tr> <tr> <td><input type="button" value="0" onclick="document.forms[0].result.value += '0'" /></td> <td><input type="button" value="C" onclick="document.forms[0].result.value = ''" /></td> <td><input type="submit" value="=" /></td> <td><input type="button" value="/" onclick="document.forms[0].operator.value = '/'" /></td> </tr> <tr> <td colspan="4"><input type="hidden" name="operator" /></td> </tr> </table> </form> </body> </html> ``` CalculatorBean.java: ```java package com.example.bean; public class CalculatorBean { private double operand1; private double operand2; private String operator; private double result; public CalculatorBean() { } public double getOperand1() { return operand1; } public void setOperand1(double operand1) { this.operand1 = operand1; } public double getOperand2() { return operand2; } public void setOperand2(double operand2) { this.operand2 = operand2; } public String getOperator() { return operator; } public void setOperator(String operator) { this.operator = operator; } public double getResult() { return result; } public void setResult(double result) { this.result = result; } public void add() { result = operand1 + operand2; } public void subtract() { result = operand1 - operand2; } public void multiply() { result = operand1 * operand2; } public void divide() { result = operand1 / operand2; } } ``` 在以上代码中,我们通过`<jsp:useBean>`指令引用了CalculatorBean类,并使用`<jsp:setProperty>`指令设置了CalculatorBean类的属性。在表单提交时,我们通过JavaScript获取到用户的操作数和运算符,然后调用相应的JavaBean方法处理计算逻辑,最后通过`<%= %>`标签输出计算结果。 希望这篇文章能够帮助你实现一个简单的Java Web计算器
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值