SpringMVC-数据响应

SpringMVC-数据响应

页面跳转

在非前后端分离项目中,我们采用模板页面的方式(JSP)来处理前端页面

在SpringMVC中,我们通过调用视图解析器来完成对JSP页面的跳转

1
2
3
4
5
6
7
8
9
10
@EnableWebMvc
@Configuration
@ComponentScan("com.xiaobai.controller")
public class MvcConfig implements WebMvcConfigurer {
// 配置视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/", ".jsp");
}
}

registry中文释义:注册表

将配置类实现WebMvcConfigurer接口,可完成对SpringMVC组件的快速配置

我们重写了configureViewResolvers,通过registry调用.jsp方法,填写前缀和后缀,完成视图解析器的配置


在Controller中,直接返回跳转的视图名称,框架会将这个名称与我们配置好的前缀和后缀进行字符串拼接

例如,此案例中拼接好的跳转地址为:/WEB-INF/views/index.jsp

1
2
3
4
5
6
7
8
@Controller
@RequestMapping("jsp")
public class JspController {
@RequestMapping("index")
public String index(){
return "views/index";
}
}

转发

将方法的返回值定义成字符串,在返回的字符串前添加forward:

1
2
3
4
@RequestMapping("forward")
public String forward(){
return "forward:views/index";
}
重定向

注:在学习servlet的转发和重定向时,上下文路径(访问路径)(Application context)如果存在的话,我们重定向的时候需要额外加上这个路径,但在SpringMVC中,这个路径时缺省的

将方法的返回值定义成字符串,在返回的字符串前添加redirect:

1
2
3
4
@RequestMapping("redirect")
public String redirect(){
return "redirect:views/index";
}

返回数据

返回Json时,我们仍然需要为handlerAdapter装配一个jackson(json转换器)

使用@EnableWebMvc注解即可自动装配


@ResponseBody

使用@ResponseBody注解标识的方法,会由handler将返回的内容转换成Json串,将其放在响应体中,直接返回,不访问视图解析器

@ResponseBody注解可以标识类上,代表类中所有方法都返回JSON格式而不是跳转页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Controller
@RequestMapping("user")
public class UserController {
@RequestMapping("data")
@ResponseBody
public User data(){
User user = new User();

user.setName("xiaobai");
user.setAge(18);

return user;
}
}
1
2
3
4
{
"name": "xiaobai",
"age": 18
}

相同的,集合和数组也可以由SpringMVC自动转换为JSON格式写入响应体中

1
2
3
4
5
6
7
8
9
10
11
12
13
@RequestMapping("data1")
@ResponseBody
public List<User> data1(){
List<User> users = new ArrayList<User>();

User user = new User();
user.setName("xiaobai");
user.setAge(18);

users.add(user);

return users;
}
1
2
3
4
5
6
[
{
"name": "xiaobai",
"age": 18
}
]

@RestContorller*

@RestContorller注解 = @Controller注解 + @ResponseBody注解

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@RequestMapping("user")
public class UserController {
@RequestMapping("data")
public User data(){
……
}
@RequestMapping("data1")
public List<User> data1(){
……
}
}

静态资源

我们所有对后端的请求都会交给SpringMVC的底层处理,也就是HandlerMapping去寻找路径映射规则

所以在Servlet中的直接访问静态资源的方法就失效了

将配置类实现WebMvcConfigurer接口,重写configureDefaultServletHandling方法后,开启configurer.enable()

开启之后,访问方式为 DispatcherServlet -> HandlerMapping -> 静态资源

1
2
3
4
5
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// 配置缺省 Servlet 处理
configurer.enable();
}

想要通过路径访问静态资源,仍然在handler方法中不能使用@ResponseBody注解,否则就直接返回了

当configurer.enable();配置时,底层是配置了xml文件<mvc:default-servlet-handler>,调用DefaultServletHandlerBeanDefinitionParser类

这个类创建了一个关键的对象:DefaultServletHttpRequestHandler

其操作就是将HandlerMapping找不到的路径交给DefaultServletHttpRequestHandler来查找转发

这样就实现了静态资源的访问

其底层内容和@EnableWebMvc注解配置方式相似



SpringMVC-数据响应
http://blog.170827.xyz/2024/06/27/SpringMVC-数据响应/
作者
XIAOBAI
发布于
2024年6月27日
许可协议