介紹
??在寫了前八篇Spring Boot項目的介紹文章后,我們已經初步熟悉了利用Spring Boot來做Web應用和數據庫的使用方法了,但是這些僅僅是官方介紹的一個例子而已。
??本次分享將介紹筆者自己的一個項目:網頁版計算器,以這兩篇博客為基礎: Java之調用Python代碼 和 Spring Boot入門(6)前端接受后臺傳參。因為在Java中并沒有類似于Python的eval()函數的功能,所以,為了避免自己寫一個計算數學表達式的java代碼,我們的解決方法是:用Java調用Python代碼來實現。
??話不多說,直接上項目!
項目
??網頁版計算器的整個項目結構如下圖:
??Expression.java為實體類,用于頁面中表單提交的數學表達式的處理,其代碼如下:
package com.hello.operation.Controller;public class Expression {private String expr;public String getExpr() {return expr;}public void setExpr(String expr) {this.expr = expr;}}
??控制器文件ExpressionController.java的代碼如下:
package com.hello.operation.Controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;import java.util.Map;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;@Controllerpublic class ExpressionController {@GetMapping("/mathoper")public String greetingForm(Model model) {model.addAttribute("expression", new Expression());return "operation";}@PostMapping("/mathoper")public String greetingSubmit(@ModelAttribute Expression expression, Map<String, Object> map) throws Exception {System.out.println(expression.getExpr());// 定義傳入shell腳本的參數,將參數放入字符串數組里String expr = expression.getExpr();String file_path = "D://eval.py";String command = String.format("python %s %s", file_path, expr);// 執行CMD命令System.out.println("\nExecuting python script file now ......");Process pcs = Runtime.getRuntime().exec(command);pcs.waitFor();// 定義shell返回值String result = null;// 獲取shell返回流BufferedInputStream in = new BufferedInputStream(pcs.getInputStream());// 字符流轉換字節流BufferedReader br = new BufferedReader(new InputStreamReader(in));// 這里也可以輸出文本日志String lineStr = null;while ((lineStr = br.readLine()) != null) {result = lineStr;}// 關閉輸入流br.close();in.close();System.out.println(result);if(result.indexOf("Error") == -1)map.put("answer", "The answer is "+result);elsemap.put("answer", "<mark>"+result+"</mark>");return "operation";}}
在該代碼中,調用了D盤下的eval.py來處理網頁表達提交的數學表達式。Java提供的runtime環境可以運行eval.py文件,并獲取CMD中的輸出結果,即為計算結果,并將其通過Map方式返回前端。eval.py的代碼如下:
import sys
import mathoper = sys.argv[1]try:print(eval(oper))
except Exception as e:print('Error: ', end='')print(e)
代碼處理十分簡潔,并引入math模塊,可以處理復雜的數學運算。
??接著是視圖文件operation.html,其代碼如下:
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>Math Operation</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"><style>mark {background-color:#FF0000; font-weight:bold;}</style>
</head>
<body>
<center><br><br><h2 style="color:red">Math Operation</h2><br><br><form class="form-horizontal" role="form" action="#" th:action="@{/mathoper}" th:object="${expression}" method="post"><div class="form-group" style="width:500px"><label for="expression" class="col-sm-4 control-label">Math Expression:</label><div class="col-sm-8"><input type="text" th:field="*{expr}" class="form-control" id="expression" placeholder="Enter a expression"></div></div><div class="form-group"><div><button type="submit" class="btn btn-primary" id="btn">Show Answer</button><input type="reset" class="btn btn-warning" value="Reset" /></div></div></form><p th:utext="${answer}"></p></center></body>
</html>
??整個項目的結構就是這樣。
運行及測試
??啟動Spring Boot項目,并在瀏覽器中輸入http://localhost:8080/mathoper ,頁面顯示如下:
??在輸入框中輸入(1+2)*3/4,點擊“Show Answer”按鈕,結果如下:
??當然也可以處理更加復雜的數學表達式,但是要符合Python的語法,如下圖:
??當我們表達式出錯時,也會提出Python的錯誤處理情況,如下圖:
結束語
??本次項目的Github地址為: https://github.com/percent4/MathOperation , 歡迎大家參考~~接下來還會繼續更新更多關于Spring Boot方面的內容,歡迎大家交流~