你好,我用的框架是Springboot+Mybatis+Thymeleaf+Redis。我想点击页面A,将页面A的一个字段xuhao通过ajax传到后端,然后点击页面A,跳转到页面B。将页面A的xuhao字段传递到页面B的后端。然后页面B来调用MyBatis,以xuhao为条件,查询数据库来显示相应的数据。
但是问题是我这里页面B出现了两次请求,数据1是xuhao字段,数据2是通过MyBatis的查询的数据。
第一次请求,xuhao出现了null,MyBatis出现了空指针错误。导致程序发生异常。
第二次请求,xuhao正常,MyBatis数据正常的,结果如下
数据1#null
数据1#1
数据2#黄河·宁夏·贺兰山
第一次请求的空指针错误是这样的
2022-07-30 13:08:16.477 ERROR 6208 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
为什么呢?
这是页面A的后端代码
@CrossOrigin
@RequestMapping("/querycp2")
@ResponseBody
public Model getCangpin2(Model mp,@RequestBody(required = false) String xuhao){
ArrayList<Cangpin> cps= reds.getResult();
for(int i=0;i<cps.size();i++) {
cps.get(i).setYuanjia(new DecimalFormat("#0.00").format(BigDecimal.valueOf(Double.valueOf(cps.get(i).getYuanjia()))));
cps.get(i).setXianjia(new DecimalFormat("#0.00").format(BigDecimal.valueOf(Double.valueOf(cps.get(i).getXianjia()))));
}
mp.addAttribute("cangpinlist", cps);
return mp;
}
这是页面A的HTML前端代码
<a href="./li1.html" style="text-decoration: none" id="coo">
<div id="co" style="overflow:hidden;background-color: black">
<div id="cp" th:each="cangpin,cangpinStat:${cangpinlist}">
<div id="stdlib" hidden="hidden" th:text="${cangpin.xuhao}" ></div>
<div id="cq" width="80%" height="auto">
<img th:src="${cangpin.path2}">
<p class="cqb" style="display:none" th:text="${cangpin.began}"></p>
<p class="cqd" style="display:none" th:text="${cangpin.num}"></p>
<p class="cqc"></p>
</div>
<div id="cqa">
<nobr class="span1" th:text="${cangpin.cangpinname}"></nobr><br>
<nobr class="span2" th:text="${cangpin.type2}"></nobr>
<nobr class="span3">限量</nobr>
<nobr class="span4" th:text="${cangpin.totalnum}"></nobr>
<nobr class="span5" th:text="' '+${cangpin.sys}"></nobr><br>
<img th:src="${cangpin.icon}" style="height: 28px;width: 28px;margin-left:25px">
<nobr class="span6" th:text="' '+${cangpin.company}"></nobr>
<nobr class="span7" th:text="' ¥'+${cangpin.xianjia}"></nobr>
</div>
</div>
</div>
</a>
这是页面A的ajax代码,ajax是正常的。stdlib是正常的,ajax是正常的
var stdlib=$("#stdlib").text();
$("#coo").click(function () {
$.ajax({
type:'post',
url:'./li1.html',
async:true,
dataType:'json',
error:"重新请求",
contentType:"application/json;charset=utf-8",
data: stdlib,
success:function (res){},
Error:function (res) {}
});
})
这是B页面的HTML的代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
<p id="st" th:text="${det.cangpinname}"></p>
<script>
</script>
</body>
</html>
这是B页面的后端代码
@RequestMapping("/li1.html")
@ResponseBody
@CrossOrigin
public Model getCangpinDetail(Model mp, @RequestBody(required = false)String xuhao){
mapper mapper2 = getCangpinArr.getCangpinMap();
Details det = mapper2.CangpinDetail(xuhao);
System.out.println("数据1#" + xuhao);
System.out.println("数据2#" + det.getCangpinname());
mp.addAttribute("det", det);
return mp;
}
这是MyBatis的相对应的接口的代码、
@Select("select * from cangpin inner join singlecangpin where cangpin.xuhao=singlecangpin.xuhao and cangpin.xuhao=#{xuhao}")
Details CangpinDetail(@Param("xuhao") String xuhao);
MyBatis是正常的。
我的目标是只发出一次请求,而且一次请求就是正常的,能正常显示数据。
而不是发出两次请求,第一次是空指针,第二次是正常的。所以网页不能正常显示,网页直接显示空指针异常,导致网页异常,不能正常显示B页面。B页面无法正常显示,显示错误。错误页面如下:
大家看看怎么才能解决这个问题,使得网页只发出一次请求,而且一次请求就是正常的,而不是两次请求,一次异常空指针,第二次正常。这是为什么呢?