当前位置:   article > 正文

【SpringMVC】响应数据 第二期

【SpringMVC】响应数据 第二期


一、handler方法分析

理解handler方法的作用和组成:

  • 一个controller的方法是控制层的一个处理器,我们称为handler
  • handler需要使用@RequestMapping/@GetMapping等,声明路径,在HandlerMapping中注册,供DS查找!
  • handler作用总结 :
    • 1.接收请求参数(param,json,pathVariable,共享域等)
    • 2.调用业务逻辑
    • 3.响应前端数据(页面,json,转发和重定向等)
  • handler如何处理 :
    • 1.接收参数: handler(形参列表: 主要的作用就是用来接收参数)
    • 2.调用业务: { 方法体 可以向后调用业务方法 service.xx() }
    • 3.响应数据: return 返回结果,可以快速响应前端数据
@RequestMapping
public Object handler(简化请求参数接收){
    调用业务方法
    返回的结果 (页面跳转,返回数据(json))
    return 简化响应前端数据;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

总结:

  1. 请求数据接收,通过handler的形参列表

  2. 前端数据响应,通过handler的return关键字快速处理!

  3. springmvc简化了参数接收和响应!

二、页面跳转控制

2.1 快速返回模板视图

JSP(JavaServer Pages)是一种动态网页开发技术,可以在 HTML 文件中嵌入 Java 代码。
JSP 首次运行时会被转换为 Servlet,然后编译为字节码,从而可以启用 Just-in-Time(JIT)编译器,实现更高效的运行。

  • jsp依赖
<!-- jsp需要依赖! jstl-->
<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>3.0.0</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • jsp页面创建

1
建议位置:/WEB-INF/下,避免外部直接访问!

位置:/WEB-INF/views/home.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
    request.setAttribute("data","hello jsp!")
    vue {{key}}
--%>
    <h1>
        ${data}
    </h1>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 配置jsp视图解析器
@EnableWebMvc   // HandlerAdapter配置JSON转换器
@Configuration
@ComponentScan("com.wake.jsp")
public class MvcConfig implements WebMvcConfigurer {

    //配置jsp对应的视图解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        //快速配置jsp模板语言对应的
        // '/WEB-INF/views/'这个会与controller层 类的 return 地址进行拼接 注意 ‘/’ 下划线有没有加
        registry.jsp("/WEB-INF/views/",".jsp");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • handler返回视图
@Controller
@RequestMapping("jsp")
public class JspController {
    // 直接返回给浏览器 不加注解@ResponseBody 不找视图 不走视图解析器
    @GetMapping("index")
    public String show(HttpServletRequest request){
        request.setAttribute("data","Hello JSP ! long time no see !");
        System.out.println("index JSP");
        // 返回的是jsp文件名地址(jsp文件名 会跟字符串拼接 -> 查找前端页面(MvcConfig)
        return "home";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

1

2.2 转发和重定向

  • 原生开发 路径细节

    • 转发是项目下的资源跳转,路径-项目下的地址: /jsp/index 可以忽略ApplicationContext
    • 重定向 可以是项目下的资源 也可以是项目外的地址 重定向属于二次请求 路径 - 项目下的地址: 全地址 /springmvc/jsp/index 不忽略ApplicationContext
  • 使用springmvc路径语法

    • forward : 路径 | redirect 路径 转发和重定向 资源地址都不需要写 项目的根路径。
    • 都 忽略ApplicationContext 。直接 /jsp/index
    • 转发和重定向地址都一样。 /springmvc/jsp/index -> 加了就重复了 变成 /springmvc/springmvc/jsp/index 这是错的

注意:
/ 下划线 加没加的问题

1

@Controller
@RequestMapping("jsp")
public class JspController {
    // 直接返回给浏览器 不加注解@ResponseBody
    // 该方法地址:/jsp/index
    @GetMapping("index")
    public String show(HttpServletRequest request){
        request.setAttribute("data","Hello JSP ! long time no see !");
        System.out.println("index JSP");
        // 返回的是jsp文件名地址(jsp文件名 会跟字符串拼接 -> 查找前端页面(MvcConfig)
        return "home";
    }

    /**
     * 转发:只能是项目下的资源
     *  1. 不能添加@ResponseBody注解
     *  2. 方法返回值是字符串
     *  3. 返回的字符串前面 forward:/转发地址
     * @return 转发到其他handler方法
     */
    @GetMapping("forward")
    public String forward(){
        System.out.println("JspController.forward! 转发!");
        return "forward:/jsp/index";
    }

    /**
     * 重定向 : redirect:/重定向地址
     * @return
     */
    @GetMapping("redirect")
    public String redirect(){
        System.out.println("JspController.forward! 重定向!");
        return "redirect:/jsp/index";
    }

    /**
     * 重定向到项目外地址
     * @return 重定向到show方法的地址
     */
    @GetMapping("redirect/csdn")
    public String redirect2(){
        System.out.println("重定向!CSDN!");
        return "redirect:https://blog.csdn.net/GavinGroves";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

在这里插入图片描述
1

三、返回JSON数据(重点)

1

3.1 前置准备

json依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.0</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

MVC配置类中添加json数据转化器

@EnableWebMvc

3.2 @ResponseBody

  • 对象 -》 json -> {}
  • 集合 -》 json -> []

@ResponseBody 返回JSON的注解,可以添加到类和方法上

@Controller
@RequestMapping("json")
@ResponseBody
public class JsonController {
    @RequestMapping("user")
    public User userShow() {
        User user = new User();
        user.setName("道格");
        user.setAge(26);
// user -> handlerAdapter -> json -> @ResponseBody -> json直接返回【前后端分离模式】
        return user; 
    }

    @RequestMapping("userList")
    public List<User> userListShow() {
        User user = new User();
        user.setName("道格");
        user.setAge(26);

        User user1 = new User();
        user1.setName("维克");
        user1.setAge(25);

        List<User> userList = new ArrayList<>();
        userList.add(user);
        userList.add(user1);
        return userList;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

1
2
@ResponseBody 数据直接放入响应体返回,也不会走视图解析器。
快速查找视图、转发和重定向都不生效。

3.3 @RestController

@RestController == @Controller + @ResponseBody

1

四、返回静态资源处理

4.1 静态资源概念

资源本身已经是可以直接拿到浏览器上使用的程度了,不需要在服务器端做任何运算、处理

典型的静态资源包括:

  • 纯HTML文件
  • 图片
  • CSS文件
  • JavaScript文件
  • ……

4.2 静态资源访问和问题解决

1
MvcConfig 配置类 开启静态资源查找

    /**
     * 开启静态资源查找
     * @param configurer
     * dispatcherServlet -> handlerMapper 找有没有对应的handler -> 如果没有 就找有没有静态资源
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

存放静态资源:
1
确保编译:
1

结果:直接访问静态资源 -》 显示图片
1

原理:
1
底层是通过转发:
找不到对应的handler方法 就会转发 查找当前项目下的真实资源
1


总结

混合开发 与 前后端分离

1

@ResponseBody 介绍

  • 在方法上使用 @ResponseBody注解,用于将方法返回的对象序列化为 JSON 或 XML 格式的数据,并发送给客户端。
  • 在前后端分离的项目中使用!
  • @ResponseBody 注解可以用来标识方法或者方法返回值,表示方法的返回值是要直接返回给客户端的数据,
    而不是由视图解析器来解析并渲染生成响应体(viewResolver没用)。

手动编译项目

在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号