40.SpringMVC处理Ajax请求

SpringMVC处理Ajax请求

axious数据

axios({
    url:"/SpringMVC/testAjax", //请求路径(无法使用thymeleaf,需要写全)
    method:"post", //请求方式
    //param请求参数-->以"?name&value&name=value"的方式发送请求参数(可以直接写url里面),无论提交方式为get还是post,通过request.getParameter()获取
    params:{name:value}, //请求参数
    //data请求参数-->以json格式发送的请求参数,请求参数会被保存到请求报文的请求体传输到服务器(get方式没有请求体),通过处理json的架包处理
    data:{name:value} //请求参数
}).then(response=>{ //then返回请求成功的结果
    console.log(response.data); //服务器响应回来的数据封装为response
});

简略写法:

测试Ajax

TestAjaxController.java

    //定位到TestAjax页面
    @RequestMapping("/Ajax")
    public String Ajax(){
        return "TestAjax";
    }

    @RequestMapping("/testAjax")
    //方法不能返回"String"类型,Ajax是在页面不刷新的情况下实现对页面的更新
    public void testAjax(Integer id, HttpServletResponse response) throws IOException {
        System.out.println("id为"+id); //这没有使用RESTful方式,可以自动获取到地址栏中的参数
        response.getWriter().write("Hello,Ajax");
    }

TestAjax.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>TestAjax</title>
</head>
<body>
    <div id="app">
        <input type="button" value="测试Ajax请求" @click="testAjax()">
    </div>

    <script type="text/javascript" th:src="@{/static/js/vue.js}"></script>
    <script type="text/javascript" th:src="@{/static/js/axios.min.js}"></script>
    <script type="text/javascript">
        var vue = new Vue({
            el:"#app",
            methods:{
                testAjax(){
                    axios.post("/SpringMVC/testAjax?id=2",{
                        id:2,name:"123"
                    }).then(response=>{ //then返回请求成功的结果(catch为处理错误情况)
                        console.log(response.data); //服务器响应回来的数据封装为response
                    });
                }
            }
        });
    </script>
</body>
</html>

点击即可发送Ajax请求,并会将返回的数据(“Hello,Ajax”)打印到浏览器控制台当中

@RequestBody

@RequestBody可以获取请求体信息,通过标识控制器方法的形参,当前请求的请求体就会为当前注解所标识的形参赋值

TestAjaxController.java

    @RequestMapping("/testAjax")
    //方法不能返回"String"类型,Ajax是在页面不刷新的情况下实现对页面的更新
    public void testAjax(Integer id, @RequestBody String requestBody, HttpServletResponse response) throws IOException {
        System.out.println("id为"+id); //这没有使用RESTful方式,可以自动获取到地址栏中的参数
        System.out.println("数据为"+requestBody);
        response.getWriter().write("Hello,Ajax"); //提示信息输出到浏览器控制台
    }

成功输出请求头中的数据

@RequestBody获取json格式的请求参数

@RequestBody获取json格式的请求参数的条件:

  • 导入jackson依赖

    •     <!--jackson的依赖-->
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
              <version>2.12.1</version>
          </dependency>
      
  • SpringMVC的配置文件中设置开启mvc的注解驱动

    •     <!--开启mvc的注解驱动-->
          <mvc:annotation-driven />
      
  • 在控制器方法的形参位置进行标识,并设置json格式的请求参数要转换成的java类型(实体类或map)的参数

TestAjaxController.java

    @RequestMapping("/testRequestBody")
    //和MyBatis一样,如果没有对应的实体类可以用Map集合来接收对应的数据
    public void testRequestBody(@RequestBody User user, HttpServletResponse response) throws IOException {
        System.out.println(user); //User{id=2, name='123'}
        response.getWriter().write("Hello,RequestBody");
    }

后端成功处理json数据并存储到bean对象中(如果存在不匹配的不会接收,如果需要全部接受,可以定义为Map类型,这样方便通过键值对的方法取出值)

@ResponseBody

@ResponseBody用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器

    @RequestMapping("/testAjax1")
    @ResponseBody
    public String testAjax1(){
        //响应浏览器数据为success,而不是跳转到页面
        return "success";
    }

页面显示"success"

@ResponseBody响应浏览器json数据

服务器处理ajax请求之后,大多数情况都需要向浏览器响应一个java对象,此时必须将java对象转换为json字符串才可以响应到浏览器

  • 实体类–>json对象
  • Map–>json对象
  • List–>json数组

JavaWeb中,通过操作json数据的jar包jsonjackson将java对象转换为json字符串,在SpringMVC中,可以直接使用@ResponseBody注解实现此功能

@ResponseBody响应浏览器json数据的条件:

  • 导入jackson依赖

    •     <!--jackson的依赖-->
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
              <version>2.12.1</version>
          </dependency>
      
  • SpringMVC的配置文件中设置开启mvc的注解驱动

    •     <!--开启mvc的注解驱动-->
          <mvc:annotation-driven />
      
  • 标识控制器方法,将java对象转换为json字符串作为方法的返回值响应到浏览器

TestAjax.html

<script type="text/javascript" th:src="@{/static/js/vue.js}"></script>
<script type="text/javascript" th:src="@{/static/js/axios.min.js}"></script>
<script type="text/javascript">
    var vue = new Vue({
        el:"#app",
        methods:{
            //发送json数据
            testRequestBody(){
                axios.post("/SpringMVC/testRequestBody",{
                    id:2,name:"123"
                }).then(response=>{ //then返回请求成功的结果(catch为处理错误情况)
                    console.log(response.data); //服务器响应回来的数据封装为response
                });
            },
            //接收json数据
            testResponseBody(){
                axios.post("/SpringMVC/testResponseBody",{
                    //无需发送数据
                }).then(response=>{
                    console.log(response.data); //接收json数据打印到控制台
                })
            }
        }
    });
</script>

TestAjaxController.java

    //响应集合类
    @RequestMapping("/testResponseBody")
    @ResponseBody
    public User testResponseBody(){
        return new User(1,"y");
    }

    //响应Map集合
    @RequestMapping("/testResponseBody1")
    @ResponseBody
    public Map<String,Object> testResponseBody1(){
        User user = new User(1,"y");
        Map<String,Object> map = new HashMap<>();
        map.put("100",user);
        return map;
    }

    //响应List集合
    @RequestMapping("/testResponseBody2")
    @ResponseBody
    public List<User> testResponseBody2(){
        return Arrays.asList(new User(1,"u"));
    }

前端浏览器控制台成功接收json数据

@RestController注解

@RestController注解是SpringMVC提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值