Spring Boot入門(mén)(9)網(wǎng)頁(yè)版計(jì)算器

介紹

??在寫(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)如下圖:

整個(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è)面顯示如下:

網(wǎng)頁(yè)版計(jì)算器

??在輸入框中輸入(1+2)*3/4,點(diǎn)擊“Show Answer”按鈕肤舞,結(jié)果如下:

計(jì)算表達(dá)式1

??當(dāng)然也可以處理更加復(fù)雜的數(shù)學(xué)表達(dá)式紫新,但是要符合Python的語(yǔ)法,如下圖:

計(jì)算表達(dá)式2

??當(dāng)我們表達(dá)式出錯(cuò)時(shí)李剖,也會(huì)提出Python的錯(cuò)誤處理情況弊琴,如下圖:

表達(dá)式輸入錯(cuò)誤

結(jié)束語(yǔ)

??本次項(xiàng)目的Github地址為: https://github.com/percent4/MathOperation , 歡迎大家參考~~接下來(lái)還會(huì)繼續(xù)更新更多關(guān)于Spring Boot方面的內(nèi)容杖爽,歡迎大家交流~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敲董,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慰安,更是在濱河造成了極大的恐慌腋寨,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件化焕,死亡現(xiàn)場(chǎng)離奇詭異萄窜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)撒桨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)查刻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人凤类,你說(shuō)我怎么就攤上這事穗泵。” “怎么了谜疤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵佃延,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我夷磕,道長(zhǎng)履肃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任坐桩,我火速辦了婚禮尺棋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绵跷。我一直安慰自己膘螟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布抖坪。 她就那樣靜靜地躺著萍鲸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪擦俐。 梳的紋絲不亂的頭發(fā)上脊阴,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蚯瞧,去河邊找鬼嘿期。 笑死,一個(gè)胖子當(dāng)著我的面吹牛埋合,可吹牛的內(nèi)容都是我干的备徐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼甚颂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜜猾!你這毒婦竟也來(lái)了秀菱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蹭睡,失蹤者是張志新(化名)和其女友劉穎衍菱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肩豁,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脊串,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了清钥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琼锋。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖祟昭,靈堂內(nèi)的尸體忽然破棺而出缕坎,到底是詐尸還是另有隱情,我是刑警寧澤从橘,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布念赶,位于F島的核電站,受9級(jí)特大地震影響恰力,放射性物質(zhì)發(fā)生泄漏叉谜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一踩萎、第九天 我趴在偏房一處隱蔽的房頂上張望停局。 院中可真熱鬧,春花似錦香府、人聲如沸董栽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锭碳。三九已至,卻和暖如春勿璃,著一層夾襖步出監(jiān)牢的瞬間擒抛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工补疑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歧沪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓莲组,卻偏偏與公主長(zhǎng)得像诊胞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锹杈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理撵孤,服務(wù)發(fā)現(xiàn)迈着,斷路器,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評(píng)論 6 342
  • 《Spring Boot 實(shí)戰(zhàn)開(kāi)發(fā)》 附錄 II : Spring Boot 2.0 新特性 本節(jié)我們介紹 Sp...
    光劍書(shū)架上的書(shū)閱讀 5,859評(píng)論 0 19
  • 概念 存儲(chǔ)數(shù)據(jù)邪码,當(dāng)用戶訪問(wèn)了某個(gè)網(wǎng)站(網(wǎng)頁(yè))的時(shí)候寥假,我們就可以通過(guò)cookie來(lái)向訪問(wèn)者電腦上存儲(chǔ)數(shù)據(jù)。 特點(diǎn) ...
    谷子多閱讀 298評(píng)論 0 0
  • 親愛(ài)的朋友霞扬, 祝好!現(xiàn)在是五月六日的早上枫振,我吃完自己泡的一杯麥片喻圃,坐在書(shū)桌前給你寫(xiě)信。早晨的空氣已經(jīng)不再如春天般...
    居無(wú)所處閱讀 348評(píng)論 0 2