Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)

目录

1. 返回静态页面

2. 返回非静态页面

2.1 @ResponseBody 返回页面内容

 2.2 @RestController = @ResponseBody + @Controller

2.3 示例:实现简单计算的功能

3. 返回JSON对象

 3.1 实现登录功能,返回 JSON 对象

4. 请求转发(forward)或请求重定向(redirect)

4.1 请求转发:forward

 4.2 请求重定向:redirect

 4.3 请求转发和请求重定向的区别

4.4 区别


我们知道默认请求下无论是Spring MVC或者是Spring Boot返回的是视图(xxx.html),而现在都是前后端分离的,后端只需要返给给前端数据即可,这个时候我们就需要使用@ResponseBody 注解了。

1. 返回静态页面

直接在这里返回的,那么返回的就是静态页面的名称,比如

@RequestMapping("/resp")
@Controller
//@ResponseBody
public class RespController {
    @RequestMapping("/Hi")
    public String sayHi(){
        return "/hello.html";
    }
}



    
    
    
    hello,spring mvc
    


Hello,Spring MVC.

可以看到前面返回的内容是 hello.html,这里通过一级目录 sayhi,也可以访问到这个页面,说明返回的虽然是 String 类型,但实际上是一个页面

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)_第1张图片

2. 返回非静态页面

2.1 @ResponseBody 返回页面内容

@ResponseBody 可以修饰类也可以修饰方法

  • 修饰类: 表示当前类中的所有方法都会返回一个非静态页面的数据
  • 修饰方法:表示当前方法返回的是一个非静态页面的数据
@Controller
@ResponseBody
public class TestController {

    @RequestMapping("/Hi")
    public String sayHi() {
        return "hello.html";
    }
}

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)_第2张图片

 2.2 @RestController = @ResponseBody + @Controller

@RequestMapping("/resp")
//@Controller
//@ResponseBody
@RestController
public class RespController {
    @RequestMapping("/Hi")
    public String sayHi(){
        return "/hello.html";
    }
}

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)_第3张图片

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)_第4张图片

2.3 示例:实现简单计算的功能




    
    
    
    document
    


计算器

数字1:
数字2:
@Controller
@ResponseBody
public class CalcController {
    @RequestMapping("/calc")
    public String calc(Integer num1,Integer num2){
        if (num1 == num2 || num2 == null){
            return "参数错误";
        }
        return "结果=" + (num1 + num2);
    }
}

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)_第5张图片

3. 返回JSON对象

    @RequestMapping("/respjson")
    public HashMap respJson() {
        HashMap map = new HashMap<>();
        map.put("Java", "Java Value");
        map.put("MySQL", "MySQL Value");
        map.put("Redis", "Redis Value");
        return map;
    }

 Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)_第6张图片

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)_第7张图片 

我们写的明明是HashMap,到前端就变成json了,

这要归功于框架

 3.1 实现登录功能,返回 JSON 对象




    
    
    
    
    Document
    


登录

⽤户:
密码:
@Slf4j
@Controller
@ResponseBody  
@RequestMapping("/user") 
public class UserController {

    @RequestMapping("/login2")
    public HashMap login2(String username, String password) {
        HashMap result = new HashMap<>();
        int state = 200;
        int data = -1; // 等于1,登录成功,否则登录失败
        String msg = "未知错误";
        if(StringUtils.hasLength(username) && StringUtils.hasLength(password)) {
          if(username.equals("admin") && password.equals("admin")) {
              data = 1;
              msg = "";
          } else {
              msg = "用户名或密码错误!";
          }
        } else { //说明参数为空
            msg = "非法参数";
        }
        result.put("state", state);
        result.put("data", data);
        result.put("msg",msg);
        return result;
    }
}

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)_第8张图片

 

4. 请求转发(forward)或请求重定向(redirect)

forward vs redirect
return不但可以返回一个视图,还可以实现跳转,跳转的方式有两种:

  • forward是请求转发;
  •  redirect:请求重定向。请求转发和重定向的使用对比:

4.1 请求转发:forward

请求转发是服务器端帮用户实现的

@Controller
public class TestController {

    //请求转发方式1
    @RequestMapping("/fw")
    public String myForward() {
        return "forward:/hello.html";
    }

    //请求转发方式2
    @RequestMapping("/fw2")
    public void myForward2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/hello.html").forward(request,response);
    }
}

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)_第9张图片

 4.2 请求重定向:redirect

 重定向的请求发生在客户端(浏览器端)

@Controller
public class TestController {

    //请求重定向方式1
    @RequestMapping("/rd")
    public String myRedirect() {
        return "redirect:/hello.html";
    }
    
    //请求重定向方式2
    @RequestMapping("/rd2")
    public void myRedirect2(HttpServletResponse response) throws IOException {
        response.sendRedirect("/hello.html");
    }
}

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)_第10张图片

 4.3 请求转发和请求重定向的区别

跳转的实现方式有两种:请求转发(Forward)和请求重定向(Redirect)

请求转发就像你(客户端)对你妈妈(服务端)说你饿了,你妈妈帮你点了外卖,在这个过程中你(客户端)只接触到你妈妈,剩下的事都是你妈妈(服务端)来完成的,这就是请求转发

请求重定向就像你(客户端)对你妈妈(服务端)说你饿了,你妈妈说她没时间你找你爸去,然后你找了你爸爸,这就变成了你找你爸爸帮忙了,这就是请求重定向

4.4 区别

1.定义

请求转发:发生在服务器端的程序当中,当服务器收到客户端请求后,会先将请求转发给目标地址,然后再将地址返回的结果转发给客户端

请求重定向:服务器接收到客户端的请求后,会给客户端一个临时响应头,这个临时响应头中记录了,客户端需要再次发送请求(重定向)的URL地址,客户端收到地址后,会将请求发送到新的地址中

2.数据共享

请求转发是服务器端实现的,整个执行过程,客户端只需要发送一次请求,所以整个交互过程中使用的都是同一个 Request 请求对象和 Response 响应对象,因此请求和返回的数据是共享的
请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的

3.请求方

请求转发是服务器端的行为

请求重定向是客户端的行为(浏览器)

4.代码实现不同

5.最终的URL地址

请求转发是服务器端代为请求,所以整个请求过程中 URL 地址是不变的


请求重定向,是服务器端告诉客户端,访问另一个地址所以浏览器会重新再发送一个请求因此 URL 地址放生了改变

你可能感兴趣的:(spring,mvc,json,java,spring,boot,后端)