产品说明
如何使用?
- 首先,确保本 API 已加载。
- 然后,打开 page.html 。
- 在输入框中输入数字并点击提交即可使用。
特殊的考虑
-
对于输入不合法的问题,我写了一个方法来判断输入是否为一个数字,判断标准是:
- 只能有数字和一个小数点
- 小数点不能位于首位
-
对于超出范围的问题,使用了 BigDecimal 类来解决。
学习历程
文档学习
看了看有关 BigDecimal 和 BigInteger 的文档,考虑到要支持小数运算,所以使用了前者。
其它知识点
学会了如何给后端程序加前端,并能通过前端而不是 URL 来传值,使交互更友好。
好像,我在判断输入是否合法的时候也防止了通过 GET 请求的参数进行注入攻击。
代码
Controller
package com.example.zuoye.controller;
import com.example.zuoye.service.MainService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.concurrent.atomic.AtomicLong;
@RestController
@RequestMapping("/main")
public class MainController {
@Autowired
MainService mainService;
private final AtomicLong counter = new AtomicLong();
@GetMapping("/greeting")
public MainService.Greeting greeting(@RequestParam(value="name",defaultValue = "world") String name){
return new MainService.Greeting(counter.incrementAndGet(),String.format("Hello %s!",name));
}
@RequestMapping(value = "/add",method = RequestMethod.POST)//加法
public String add(@RequestParam String a, @RequestParam String b){
return mainService.add(a,b);
}
@RequestMapping(value = "/subtract",method = RequestMethod.POST)//减法
public String subtract(@RequestParam String a, @RequestParam String b){
return mainService.subtract(a,b);
}
@RequestMapping(value = "/multiply",method = RequestMethod.POST)//乘法
public String multiply(@RequestParam String a, @RequestParam String b){
return mainService.multiply(a,b);
}
@RequestMapping(value = "/divide",method = RequestMethod.POST)//除法
public String divide(@RequestParam String a, @RequestParam String b){
return mainService.divide(a,b);
}
}
Service
package com.example.zuoye.service;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
@Service
public class MainService {
public record Greeting(long id,String content){
}
public boolean PanduanShuruHafa(String a){//判断输入是否合法
int length=a.length();
boolean ifDian = false;
for(int i=0;i<length;i++){
if(a.charAt(i) < '0' || a.charAt(i) > '9'){
if(ifDian) return false;
else if(a.charAt(i) == '.') ifDian = true;
else return false;
}
}
return a.charAt(0) != '.';
}
//四则运算都是先把输入转化成BigDecimal对象,然后利用其自带的方法进行运算。
public String add(String a,String b){
if(!PanduanShuruHafa(a) || !PanduanShuruHafa(b))return "输入不合法!";
BigDecimal x1 =new BigDecimal(a);
BigDecimal x2 =new BigDecimal(b);
return x1.add(x2).toString();
}
public String subtract(String a,String b){
if(!PanduanShuruHafa(a) || !PanduanShuruHafa(b))return "输入不合法!";
BigDecimal x1 =new BigDecimal(a);
BigDecimal x2 =new BigDecimal(b);
return x1.subtract(x2).toString();
}
public String multiply(String a,String b){
if(!PanduanShuruHafa(a) || !PanduanShuruHafa(b))return "输入不合法!";
BigDecimal x1 =new BigDecimal(a);
BigDecimal x2 =new BigDecimal(b);
return x1.multiply(x2).toString();
}
public String divide(String a,String b){
if(!PanduanShuruHafa(a) || !PanduanShuruHafa(b))return "输入不合法!";
BigDecimal x1 =new BigDecimal(a);
BigDecimal x2 =new BigDecimal(b);
return x1.divide(x2, 8, RoundingMode.HALF_UP).toString();
}
}