SpringMVC-数据响应
SpringMVC-数据响应
页面跳转
在非前后端分离项目中,我们采用模板页面的方式(JSP)来处理前端页面
在SpringMVC中,我们通过调用视图解析器来完成对JSP页面的跳转
@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
@Controller
@RequestMapping("jsp")
public class JspController {
@RequestMapping("index")
public String index(){
return "views/index";
}
}
转发
将方法的返回值定义成字符串,在返回的字符串前添加forward:
@RequestMapping("forward")
public String forward(){
return "forward:views/index";
}
重定向
注:在学习servlet的转发和重定向时,上下文路径(访问路径)(Application context)如果存在的话,我们重定向的时候需要额外加上这个路径,但在SpringMVC中,这个路径时缺省的
将方法的返回值定义成字符串,在返回的字符串前添加redirect:
@RequestMapping("redirect")
public String redirect(){
return "redirect:views/index";
}
返回数据
返回Json时,我们仍然需要为handlerAdapter装配一个jackson(json转换器)
使用@EnableWebMvc注解即可自动装配
@ResponseBody
使用@ResponseBody注解标识的方法,会由handler将返回的内容转换成Json串,将其放在响应体中,直接返回,不访问视图解析器
@ResponseBody注解可以标识类上,代表类中所有方法都返回JSON格式而不是跳转页面
@Controller
@RequestMapping("user")
public class UserController {
@RequestMapping("data")
@ResponseBody
public User data(){
User user = new User();
user.setName("xiaobai");
user.setAge(18);
return user;
}
}
{
"name": "xiaobai",
"age": 18
}
相同的,集合和数组也可以由SpringMVC自动转换为JSON格式写入响应体中
@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;
}
[
{
"name": "xiaobai",
"age": 18
}
]
@RestContorller*
@RestContorller注解 = @Controller注解 + @ResponseBody注解
@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 -> 静态资源
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// 配置缺省 Servlet 处理
configurer.enable();
}
想要通过路径访问静态资源,仍然在handler方法中不能使用@ResponseBody注解,否则就直接返回了
当configurer.enable();配置时,底层是配置了xml文件<mvc:default-servlet-handler>,调用DefaultServletHandlerBeanDefinitionParser类
这个类创建了一个关键的对象:DefaultServletHttpRequestHandler
其操作就是将HandlerMapping找不到的路径交给DefaultServletHttpRequestHandler来查找转发
这样就实现了静态资源的访问
其底层内容和@EnableWebMvc注解配置方式相似