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注解配置方式相似