SpringMVC响应数据的方式

时间:2024-5-29    作者:老大夫    分类: SSM


1. 返回jsp、themleaf模板页面(不重要,现在基本都前后端分离了)

MvcConfig

@EnableWebMvc  //handlerMapping handlerAdapter json转换器
@Configuration
@ComponentScan(basePackages = "com.atguigu")
public class MvcConfig implements WebMvcConfigurer {
        //视图解析器,指定前后缀

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        // registry可以快速添加前后缀
        registry.jsp("/WEB-INF/views/", ".jsp");
    }
}

SpringMvcInit

public class SpringMvcInit
extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{MvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

JspController

/**
 * 返回jsp模板页面
 */
@Controller
@RequestMapping("/jsp")
public class JspController {
    /**
     * 快速查找视图
     * 1. 返回值类型是字符串
     * 2. 不能添加ResponseBody 直接返回给浏览器不找视图
     * 3. 通过返回值填写对应的视图名称即可
     */
    @RequestMapping("index")
    public String index(HttpServletRequest req){
        req.setAttribute("data","this is data");
        System.out.println("index");
        return "index";
    }
}

2. 转发和重定向

在return前添加关键字
forward转发 :只能访问项目内的路径
redirect重定向:可以访问项目外的路径

/**
     * 转发(只能是项目下的资源)
     *  1. 方法返回值为字符串
     *  2. 不能添加responseBody注解
     *  3. 返回字符串前添加 forward: /转发地址 字符串
     */
    @RequestMapping("/forward")
    public String forward(HttpServletRequest req){
        return "forward:/jsp/index";
    }

    /**
     * 重定向(可以是项目外的资源)
     *   1. 方法返回值为字符串类型
     *   2. 不能添加ResponseBody注解
     *   3. 返回字符串前添加redirect:/转发地址  字符串
     */

    @RequestMapping("/redirect")
    public String redirect(HttpServletRequest req){
        return "redirect:/jsp/index";
    }

3. 返回JSON数据

@Controller
@RequestMapping("/json")
@ResponseBody //返回json的注解,可以添加到类上,也可以添加在方法、接口上
@RestController   // 它是  Controller  +  ResponseBody的结合体
public class JsonController {

    /**
     *  @ResponseBody 会将数据直接放入响应体中,也不会再走视图解析器
     *      快速查找视图和  转发重定向都不生效了!
     */

    @RequestMapping("data")
    @ResponseBody
    public User data(){
        User user = new User();
        user.setName("twoDog");
        user.setAge(3);
        return user;   //user  ---> handlerAdapter --->Json  --->@responseBody--->Json返回【前后端分离模式】
    }

    @RequestMapping("data1")
    @ResponseBody
    public List<User> data1(){

        List<User> users=new ArrayList<>();
        users.add(new User("erya",6));
        users.add(new User("ergouzi",18));
        return users;   //user  ---> handlerAdapter --->Json  --->@responseBody--->Json返回【前后端分离模式】
    }
}

3. 返回静态资源

在配置类中开启 configureDefaultServletHandling,
DefaultServletHandler是作为handlerMapping的补充使用,
因为静态资源不会加RequestMapping映射,会报404,DefaultServletHandler就会去直接找文件的真实路径,如果还没有才会报404.

只要在MvcConfig中配置 实现一个方法就好了

@EnableWebMvc  //handlerMapping handlerAdapter json转换器
@Configuration
@ComponentScan(basePackages = "com.atguigu")
public class MvcConfig implements WebMvcConfigurer {
        //视图解析器,指定前后缀

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        // registry可以快速添加前后缀
        registry.jsp("/WEB-INF/views/", ".jsp");
    }

    //开启静态资源查找
    //dispatcherServlet -> handlerMapping 找有没有对应的handler再去找静态资源 ->有没有静态资源
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}


扫描二维码,在手机上阅读

推荐阅读: