javascript
Spring Boot入门(9)网页版计算器
介紹
??在寫了前八篇Spring Boot項(xiàng)目的介紹文章后,我們已經(jīng)初步熟悉了利用Spring Boot來(lái)做Web應(yīng)用和數(shù)據(jù)庫(kù)的使用方法了,但是這些僅僅是官方介紹的一個(gè)例子而已。
??本次分享將介紹筆者自己的一個(gè)項(xiàng)目:網(wǎng)頁(yè)版計(jì)算器,以這兩篇博客為基礎(chǔ): Java之調(diào)用Python代碼 和 Spring Boot入門(6)前端接受后臺(tái)傳參。因?yàn)樵贘ava中并沒(méi)有類似于Python的eval()函數(shù)的功能,所以,為了避免自己寫一個(gè)計(jì)算數(shù)學(xué)表達(dá)式的java代碼,我們的解決方法是:用Java調(diào)用Python代碼來(lái)實(shí)現(xiàn)。
??話不多說(shuō),直接上項(xiàng)目!
項(xiàng)目
??網(wǎng)頁(yè)版計(jì)算器的整個(gè)項(xiàng)目結(jié)構(gòu)如下圖:
??Expression.java為實(shí)體類,用于頁(yè)面中表單提交的數(shù)學(xué)表達(dá)式的處理,其代碼如下: 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腳本的參數(shù),將參數(shù)放入字符串?dāng)?shù)組里String expr = expression.getExpr();String file_path = "D://eval.py";String command = String.format("python %s %s", file_path, expr);// 執(zhí)行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());// 字符流轉(zhuǎn)換字節(jié)流BufferedReader br = new BufferedReader(new InputStreamReader(in));// 這里也可以輸出文本日志String lineStr = null;while ((lineStr = br.readLine()) != null) {result = lineStr;}// 關(guān)閉輸入流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";}}在該代碼中,調(diào)用了D盤下的eval.py來(lái)處理網(wǎng)頁(yè)表達(dá)提交的數(shù)學(xué)表達(dá)式。Java提供的runtime環(huán)境可以運(yùn)行eval.py文件,并獲取CMD中的輸出結(jié)果,即為計(jì)算結(jié)果,并將其通過(guò)Map方式返回前端。eval.py的代碼如下:
import sys import mathoper = sys.argv[1]try:print(eval(oper)) except Exception as e:print('Error: ', end='')print(e)代碼處理十分簡(jiǎn)潔,并引入math模塊,可以處理復(fù)雜的數(shù)學(xué)運(yùn)算。
??接著是視圖文件operation.html,其代碼如下:
??整個(gè)項(xiàng)目的結(jié)構(gòu)就是這樣。
運(yùn)行及測(cè)試
??啟動(dòng)Spring Boot項(xiàng)目,并在瀏覽器中輸入http://localhost:8080/mathoper ,頁(yè)面顯示如下:
??在輸入框中輸入(1+2)*3/4,點(diǎn)擊“Show Answer”按鈕,結(jié)果如下:
??當(dāng)然也可以處理更加復(fù)雜的數(shù)學(xué)表達(dá)式,但是要符合Python的語(yǔ)法,如下圖:
??當(dāng)我們表達(dá)式出錯(cuò)時(shí),也會(huì)提出Python的錯(cuò)誤處理情況,如下圖:
結(jié)束語(yǔ)
??本次項(xiàng)目的Github地址為: https://github.com/percent4/MathOperation , 歡迎大家參考~~接下來(lái)還會(huì)繼續(xù)更新更多關(guān)于Spring Boot方面的內(nèi)容,歡迎大家交流~
總結(jié)
以上是生活随笔為你收集整理的Spring Boot入门(9)网页版计算器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 印度孟买机器人餐厅_印度孟买自动化展:该
- 下一篇: nacos 公共_SpringCloud