一、@ResponseBody、@RestController
作用:方法返回的对象转换为JSON格式,并将JSON数据直接写入到输出流中,使用此注解后不会再经过视图解析器。使用该注解可以处理Ajax请求。 位置:方法上方或方法返回值前
1.1. JSP页面
代码语言:javascript复制编写jsp页面,发送ajax请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Ajax请求</title>
<script src="js/jquery-2.1.1.min.js"></script>
<script>
$(function (){
$("#btn").click(function (){
var name = $("#name").val();
var sex = $("#sex").val();
$.get("/c8/addStudent",{"name":name,"sex":sex},function (data){
console.log(data);
});
});
});
</script>
</head>
<body>
姓名:<input id="name"/><br/>
性别:<input id="sex"/><br/>
<input type="button" value="提交" id="btn">
</body>
</html>
1.2 放行静态资源
代码语言:javascript复制由于jsp页面中引入jQuery的js文件(该.js文件可以去我的资源里面去下载),而SpringMVC会拦截所有资源,造成jquery.js失效,需要在SpringMVC核心配置文件中放行静态资源。
<!-- 放行静态资源 -->
<mvc:default-servlet-handler />
1.3 编写实体类
代码语言:javascript复制编写结果实体类,该实体类会封装一个请求的结果
package com.example.domain;
// 请求的结果对象
public class Result {
// 请求是否成功
private boolean flag;
// 请求提示信息
private String message;
public Result(boolean flag, String message) {
this.flag = flag;
this.message = message;
}
public Result(){}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
1.4 控制器方法
代码语言:javascript复制package com.example.controller;
import com.example.domain.Result;
import com.example.domain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/c8")
public class MyController8 {
@GetMapping ("addStudent")
@ResponseBody
public Result addStudent(String name,String sex){
// 输出接受的参数,模拟添加学生
System.out.println(name ":" sex);
// 返回添加结果
Result result = new Result(true,"添加学生成功!");
return result;
}
}
1.5 添加依赖
代码语言:javascript复制在pom.xml文件添加对应依赖,SpringMVC会将Result对象转为JSON格式写入输出流,而 SpringMVC默认使用的JSON转换器是jackson,需要在pom中添加jackson依赖。
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.3</version>
</dependency>
1.6 测试结果
当我们访问jsp时,访问路径:http://localhost:8080/ajax-request.jsp
点击提交之后:打开开发者工具,可以看到控制台都成功打印了,说明已经成功转为json格式了。
1.7 @RestController
如果一个控制器类下的所有控制器方法都返回JSON格式数据且不进行跳转,可以使用@RestController代替@Controller,此时每个方法上的@ResponseBody都可以省略。
二、静态资源映射
当在DispatcherServlet的 <url-pattern> 中配置拦截 “/” 时,除了jsp文件不会拦截以外,其他所有的请求都会经过前端控制器进行匹配。此时静态资源例如css、js、jpg等就会被前端控制器拦截,导致不能访问,出现404问题。想要正常映射静态资源共有三种方案:
2.1 配置静态资源筛查器
在SpringMVC的配置文件中配置<mvc:default-servlet-handler />后,会在Spring容器中创建一个资源检查器,它对进入DispatcherServlet的URL进行筛查,如果不是静态资源,才由 DispatcherServlet处理。 修改SpringMVC核心配置文件:
代码语言:javascript复制<mvc:default-servlet-handler/>
2.2 配置静态资源资源映射器
SpringMVC模块提供了静态资源映射器组件,通过 <mvc:resources> 标签配置静态资源映射器,配置后的路径不会由DispatcherServlet处理。 修改SpringMVC核心配置文件:
代码语言:javascript复制<!-- 配置静态资源映射器 -->
<!-- mapping:配置请求的URL location:资源路径 -->
<mvc:resources mapping="/img/" location="/img/"/>
<mvc:resources mapping="/js/" location="/js/"/>
2.3 配置默认Servlet处理静态资源
在web.xml可以配置默认Servlet处理静态资源,该Servlet由tomcat提供,它会直接访问静态资源不进行其他操作。这样就避免了使用DispatcherServlet对静态资源的拦截: 修改web.xml:
代码语言:javascript复制 <!-- 配置默认Servlet处理静态资源 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
三、@RequestBody
作用:将请求中JSON格式的参数转为JAVA对象 位置:写在方法参数前
3.1 AJAX请求发送JSON格式的参数
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Ajax请求</title>
<script src="js/jquery-2.1.1.min.js"></script>
<script>
$(function (){
$("#btn").click(function (){
var name = $("#name").val();
var sex = $("#sex").val();
var param = JSON.stringify({"name":name,"sex":sex});
$.ajax({url:"/c8/addStudent2",contentType:"application/json",
type:"post",
data:param,
success:function(data) {
console.log(data);
}
})
})
})
</script>
</head>
<body>
姓名:<input id="name"/><br/>
性别:<input id="sex"/><br/>
<input type="button" value="提交" id="btn">
</body>
</html>
3.2 控制器方法
代码语言:javascript复制package com.example.controller;
import com.example.domain.Result;
import com.example.domain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/c8")
public class MyController8 {
@PostMapping("/addStudent2")
@ResponseBody
public Result addStudent2(@RequestBody Student student){
System.out.println(student);
// 返回添加结果
Result result = new Result(true,"添加学生成功!");
return result;
}
}
3.3 测试结果
OK,可以看出确实是成功实现了,也打印出来了,说明请求中JSON格式的参数成功转为JAVA对象了
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!