qq_40619811 2022-07-30 13:27 采纳率: 89.8%
浏览 108
已结题

为什么网页发生两次请求,第一次是空指针,报空指针异常

你好,我用的框架是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页面无法正常显示,显示错误。错误页面如下:

img


大家看看怎么才能解决这个问题,使得网页只发出一次请求,而且一次请求就是正常的,而不是两次请求,一次异常空指针,第二次正常。这是为什么呢?

  • 写回答

2条回答 默认 最新

  • 快乐的小小鸟 2022-07-30 13:51
    关注

    很简单,第一次为什么controller接收不到?
    因为第一次发的是get请求,
    第二次发的post请求,所以第一次数据接收不了。

    解决在 controller中指定用post请求

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月7日
  • 已采纳回答 7月30日
  • 创建了问题 7月30日

悬赏问题

  • ¥15 关于react-hook组件用函数控制是否渲染的及时性问题。
  • ¥50 Linux下的软件,要做模块化拆分。进程间通信是否有开源框架可以借用?
  • ¥100 修改原有的MYSQL存储代码,在最右边添加多列数据
  • ¥20 Open Interpreter 使用时报错: still has pending operation at deallocation, the process may crash
  • ¥15 qt中链接动态链接库,调用其中的函数,该函数的参数需要传入回调函数,自己创建的回调函数无法作为参数传递进去
  • ¥15 matlab svm二分类代码问题
  • ¥40 求一款能支持ios15以上的屏蔽越狱插件。比较好用的
  • ¥15 C++ QT对比内存字符(形式不定)
  • ¥30 C++第三方库libiconv 远程安装协助
  • ¥15 https://github.com/youlaitech/vue3-element-admin/blob/master/src/store/modules/user.ts 这2句代码如何理解