介紹
??在寫(xiě)了前八篇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入門(mén)(6)前端接受后臺(tái)傳參。因?yàn)樵贘ava中并沒(méi)有類似于Python的eval()函數(shù)的功能唠亚,所以链方,為了避免自己寫(xiě)一個(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;
@Controller
public 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);
else
map.put("answer", "<mark>"+result+"</mark>");
return "operation";
}
}
在該代碼中鹏溯,調(diào)用了D盤(pán)下的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 math
oper = 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,其代碼如下:
<!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 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>
??整個(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)容杖爽,歡迎大家交流~