操作说明
使用前端
在后端成功运行之后打开前端选择运算法则和数字
ps:计算器的减法和除法都是默认第一个数字减/除第二个数字
点击提交过后会跳转到相应的页面并得到结果
不使用前端
URL
在浏览器的输入栏中输入localhost:8080
进入程序,如果出现欢迎使用计算器则
程序启动成功
选择计算方法
在localhost:8080
后输入/add
表示选择加法/sbut
表示选择减法/mult
表示选择乘法div
表示选择除法
输入进行计算的数据
在选择方法后在框内进行输入?a=firstNumber&b=secondNumber
其中firstNumber
指你要输入的第一个数字secondNumber
指你要输入的第二个数字
ps:计算器的减法和除法都是默认第一个数字减/除第二个数字
结果获取
在输入完成过后按下回车就可以获得相应的计算结果啦,可喜可贺可喜可贺。
特殊情况
如果你看到ah oh 按格式输入数字ok?"
那么请你查看自己的输入是否符合规范啦。
学习历程
数据溢出问题
我刚开始有想过如果结果的值大于2147483647的话就就直接return数据溢出,首先,总监有说过不能用这种处理方法,其次你数据都溢出了还怎么大于2147483647啊,这种方法只能在人脑中实现,有点油麦了。
于是在好心群友的提示之下,知道了BigDecimal
和BIgInteger
这样的东西,虽然存在有占用内存过大等各种问题,但是作为一个电脑小白,现在只要能达到60分就算胜利。
既然我们要返回的数据是BigDecimal
类的,那我自然要把方法的返回值定义为BigDecimal
,let us do this
public BigDecimal add(Double a,Double b){
BigDecimal n = BigDecimal.valueOf(a+b);
return n;
//由于BigDecimal类型无法进行直接用符号进行四则运算,于是只好让a和b进行四则运算再进行数据转换
}
细心的盆友应该发现了,BigDecimal n = BigDecimal.valueOf(a+b);
what is this?这是用于将数据转换为BigDecimal的方法,这一部分也没有问题,可喜可贺可喜可贺。
关键中的关键,导包导包导包
import java.math.*;
输入数据类型错误进行报错
public BigDecimal add(@RequestParam Double a,@RequestParam Double b){
return mainservice.add(a,b);
}
此时我发现上面代码块中的方法已经固定了返回值必须是BigDecimal类型,无法返回字符类型,what can i do?于是我决定添加一个if语句,but我现在需要一种方法来对数据的类型进行判断,于是我上网进行search,没想到还真发现了一种方法(a instanceof BigDecimal)
来判断数据类型,wow,it is so cute,I like it.不仅好记而且实用。
但是随后我发现a是一个局部变量,我无法在函数外利用对a和b的数据类型的判断来决定代码块是否执行,毕竟用形参表里的东西来决定函数是否执行,确实是太crazy了,那咋整那咋整,哦对了在一个返回值为字符串的方法里面这个让一个局部变量n
等于add
的返回值,然后判断n
是否为BigDecimal类型就好了,说干就干,结果发现,还是不行。我终于又想到一个新办法,那就是
public String add(@RequestParam Double a,@RequestParam Double b){
if(a instanceof Double&&b instanceof Double) {
n = mainservice.add(a, b);
return "答案为"+"n";
}
else{
return "ah oh 输入数字ok?";
}
}
然后我发现了idea给我发的一个神奇的提示
条件 'a instanceof Double'是多余的,可以用 '!= null'
条件 'b instanceof Double'是多余的,可以用 '!= null'
oh oh oh my god简直就是天才啊,如果说a或者b的数据类型不符合Double,那么这个数根本无法存进来,那可不就是null了吗
wtf wtf wtf 还是无法正常运行,因为如果只要输入的值和数据类型不匹配,就会有400类型的报错,那咋整,那我可不可以想办法无论我输入任何值都能储存进去呢?
haha,i know,只要我定义数据类型是字符串不就好了,谁还不是一个字符串呢,ok,既然字符串输入了,我们就看看有没有办法判断是不是数字,随便一搜,网上很多方法呢,我发现了这么一个丑东西a.matches("-?\\d+(\\.\\d+)?")
小叮当掏道具状,是的很丑,又臭又长贼难记。但是真的很有用。
“我很丑,但是我很温柔”
那我就得想办法把它转换为Double就好了,通过简单的搜索,我发现了这个Double c = Double.valueOf(a)
小叮当掏道具状
okok,看看具体实现的代码吧
BigDecimal n = BigDecimal.valueOf(0.0);
@GetMapping("/add")
public String add(@RequestParam(required=false) String a,@RequestParam(required=false) String b){
if(a.matches("-?\\d+(\\.\\d+)?")&&b.matches("-?\\d+(\\.\\d+)?")){
Double c = Double.valueOf(a);
Double d = Double.valueOf(b);
n = mainservice.add(c, d);
return "结果为"+n;
}
else{
return "ah oh 按格式输入数字ok?";
}
}
注意看,@RequestParam
里面出现了奇奇怪怪的东西,这是什么呢?通过添加(required=false)
可以在输入栏没有通过相应的名字输入字符串时也能正常运行,而(required=true)
的效果显然相反,而没有设置时,其默认值就是true
。通过这样,我们就轻松涵盖了几种不符合输入规范的情况
- a或b的输入值不是数字的情况
/add
后没有规范输入的情况
这两种情况之下,都不会直接报错,而是会return "ah oh 按格式输入数字ok?"
终于解决了,汗流浃背了吧,牢底
简易前端
在看到学长在群里发的简易前端的代码过后我感觉我彻底沦为了小丑🤡,原来只要这么几串简单的代码就能同时解决输入类型和URL输入不规范的问题
以下是实现的代码
<h2>加法</h2>
<form action="http://localhost:8080/add" method="get">
<input type="number" name="a"><br>
<input type="number" name="b"><br>
<input type="submit" value="提交">
</form>
<hr>
代码
// MainController
package com.example.myseventhspring.controller;
import java.math.*;
import com.example.myseventhspring.service.MainService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/")
public class MainController {
@Autowired
MainService mainservice;
BigDecimal n = BigDecimal.valueOf(0.0);
@GetMapping("/")
public String hello(){
return "欢迎使用计算器";
}
@GetMapping("/add")
public String add(@RequestParam(required=false) String a,@RequestParam(required=false) String b){
if(a.matches("-?\\d+(\\.\\d+)?")&&b.matches("-?\\d+(\\.\\d+)?")){
Double c = Double.valueOf(a);
Double d = Double.valueOf(b);
n = mainservice.add(c, d);
return "结果为"+n;
}
else{
return "ah oh 按格式输入数字ok?";
}
}
@GetMapping("/mult")
public String mult(@RequestParam(required=false) String a,@RequestParam(required=false) String b){
if(a.matches("-?\\d+(\\.\\d+)?")&&b.matches("-?\\d+(\\.\\d+)?")){
Double c = Double.valueOf(a);
Double d = Double.valueOf(b);
n = mainservice.mult(c, d);
return "结果为"+n;
}
else{
return "ah oh 按格式输入数字ok?";
}
}
@GetMapping("/div")
public String div(@RequestParam(required=false) String a,@RequestParam(required=false) String b){
if(a.matches("-?\\d+(\\.\\d+)?")&&b.matches("-?\\d+(\\.\\d+)?")){
Double c = Double.valueOf(a);
Double d = Double.valueOf(b);
n = mainservice.div(c, d);
return "结果为"+n;
}
else{
return "ah oh 按格式输入数字ok?";
}
}
@GetMapping("/subt")
public String subt(@RequestParam(required=false) String a,@RequestParam(required=false) String b){
if(a.matches("-?\\d+(\\.\\d+)?")&&b.matches("-?\\d+(\\.\\d+)?")){
Double c = Double.valueOf(a);
Double d = Double.valueOf(b);
n = mainservice.subt(c, d);
return "结果为"+n;
}
else{
return "ah oh 按格式输入数字ok?";
}
}
}
// MainService
package com.example.myseventhspring.service;
import org.springframework.stereotype.Service;
import java.math.*;
@Service
public class MainService {
public BigDecimal add(Double a,Double b){
BigDecimal n = BigDecimal.valueOf(a+b);
return n;
//由于BigDecimal类型无法进行直接用符号进行四则运算,于是只好让a和b进行四则运算再进行数据转换
}
public BigDecimal mult(Double a,Double b){
BigDecimal n = BigDecimal.valueOf(a*b);
return n;
}
public BigDecimal div(Double a,Double b){
BigDecimal n = BigDecimal.valueOf(a/b);
return n;
}
public BigDecimal subt(Double a,Double b){
BigDecimal n = BigDecimal.valueOf(a-b);
return n;
}
}
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>四则运算</title>
</head>
<body>
<h2>加法</h2>
<form action="http://localhost:8080/add" method="get">
<input type="number" name="a"><br>
<input type="number" name="b"><br>
<input type="submit" value="提交">
</form>
<hr>
<h2>减法</h2>
<form action="http://localhost:8080/subt" method="get">
<input type="number" name="a"><br>
<input type="number" name="b"><br>
<input type="submit" value="提交">
</form>
<hr>
<h2>乘法</h2>
<form action="http://localhost:8080/mult" method="get">
<input type="number" name="a"><br>
<input type="number" name="b"><br>
<input type="submit" value="提交">
</form>
<hr>
<h2>除法</h2>
<form action="http://localhost:8080/div" method="get">
<input type="number" name="a"><br>
<input type="number" name="b"><br>
<input type="submit" value="提交">
</form>
<hr>
</body>
</html>