Spring Boot入門(9)網頁版計算器

介紹

??在寫了前八篇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”按鈕,結果如下:


計算表達式1

??當然也可以處理更加復雜的數學表達式,但是要符合Python的語法,如下圖:


計算表達式2

??當我們表達式出錯時,也會提出Python的錯誤處理情況,如下圖:


表達式輸入錯誤

結束語

??本次項目的Github地址為: https://github.com/percent4/MathOperation , 歡迎大家參考~~接下來還會繼續更新更多關于Spring Boot方面的內容,歡迎大家交流~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451913.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

shell編程基礎(七): 處理文件命令sed與awk

一、sed&#xff08;以行為單位處理文件&#xff09; sed意為流編輯器&#xff08;Stream Editor&#xff09;&#xff0c;在Shell腳本和Makefile中作為過濾器使用非常普遍&#xff0c;也就是把前一個程序的輸出引入sed的輸入&#xff0c;經過一系列編輯命令轉換為另一種格式輸…

數據結構與算法--6.二分查找

文章目錄一. 二分查找二. 代碼實現一&#xff1a;使用遞歸三. 代碼實現二&#xff1a;非遞歸一. 二分查找 二. 代碼實現一&#xff1a;使用遞歸 def binary_search(alist, item):"""二分查找&#xff1a;使用遞歸"""n len(alist)if n > 0:m…

SpringMVC請求處理流程、springMVC工作流程

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 頁面請求到來 --> 前端控制器&#xff08;DispatcherServlet&#xff09;收到請求&#xff0c;請求 處理映射器&#xff08;Hanle…

Android的TextView在顯示文字的時候,如果有段中文有英文,有中文,有中文標點符號,你會發現,當要換行的時候遇到中文標點, 這一行就會空出很多空格出來...

一、問題描述&#xff1a; Android的TextView在顯示文字的時候&#xff0c;如果有段中文有英文&#xff0c;有中文&#xff0c;有中文標點符號&#xff0c;你會發現&#xff0c;當要換行的時候遇到中文標點&#xff0c; 這一行就會空出很多空格出來。原因是&#xff1a; 1&…

什么是IDE

集成開發環境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序開發環境的應用程序&#xff0c;一般包括代碼編輯器、編譯器、調試器和圖形用戶界面等工具。集成了代碼編寫功能、分析功能、編譯功能、調試功能等一體化的開發軟件服務…

vue 學習

http://jspang.com/ vue 學習 vue 學習 轉載于:https://www.cnblogs.com/qianjin888/p/9342031.html

策略模式-Strategy Pattern

解決問題 將算法按照策略或場景封裝起來&#xff0c;以方便按照不同的場景執行不同的策略。它很好的解決了通過if...else 來決策行為而帶來的代碼和邏輯復雜性。 應用場景 一個經常被拿來舉例的場景是收銀員收銀場景&#xff1a;它需要根據不同的場景&#xff08;是否為會員、有…

ssm框架下 tiles框架 的使用

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 tiles框架的工作 在springMVC工作流程中屬于視圖解析器 解析視圖這一步。算是視圖解析器的一個插件&#xff0c;作了視圖解析這步的一部…

數據結構與算法--7.樹的基礎知識

文章目錄一. 樹的概念二. 樹的術語三. 樹的種類四. 樹的存儲和表示五. 常見的樹的應用場景一. 樹的概念 二. 樹的術語 三. 樹的種類 四. 樹的存儲和表示 五. 常見的樹的應用場景

運用java 多線程模擬火車售票。。。。

public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub //多線程并行時&#xff0c;會出現的問題 //同步&#xff1a; //買火車票&#xff0c;四個窗口A,B,C,D //創建任務 TicketTask task new TicketTask(); //四個窗口A,B,C,…

JQuery validate 各項驗證規則講解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 使用樣例見&#xff1a;http://blog.csdn.net/jiangyu1013/article/details/56014730 //定義中文消息 var cnmsg { required: “必選字…

數據結構與算法--8.二叉樹的基礎知識

文章目錄一. 二叉樹基本概念二. 二叉樹的性質三. 二叉樹的代碼實現四. 二叉樹的先序、中序、后序遍歷一. 二叉樹基本概念 二. 二叉樹的性質 三. 二叉樹的代碼實現 class Node(object):"""二叉樹節點"""def __init__(self,item):self.elem item…

ZooKeeper(二)ZooKeeper能做什么?

上一節介紹了ZooKeeper的一些基礎知識&#xff0c;這一節主要講ZooKeeper有哪些用途。命名服務&#xff08;Name Service&#xff09; 主要是作為分布式命名服務&#xff0c;通過調用zk的create node api&#xff0c;能夠很容易創建一個全局唯一的path&#xff0c;這個path就可…

jquery vilidate 使用小例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 // 修改$("#updForm").validate({submitHandler:function(form){new $.flavr({ content : 是否確認修改管理員?,dialog : co…

RedHat Linux 7.3基礎環境搭建

文章目錄1&#xff0e;更改主機名2&#xff0e;關閉selinux3&#xff0e;關閉火墻4&#xff0e;重啟機器5&#xff0e;設置ip6&#xff0e;掛載yum源7&#xff0e;升級openssh8&#xff0e;安全基線9&#xff0e;時區10&#xff0e;時間同步11&#xff0e;安裝Vmtools12&#x…

開源http協議庫curl和wget的區別和使用

curl和wget基礎功能有諸多重疊&#xff0c;如下載等。 在高級用途上的curl由于可自定義各種請求參數所以長于模擬web請求&#xff0c;用于測試網頁交互&#xff08;瀏覽器&#xff09;&#xff1b;wget由于支持ftp和Recursive所以長于下載&#xff0c;用于下載文件&#xff08;…