美文网首页
Spring Boot Web 请求参数之复杂参数

Spring Boot Web 请求参数之复杂参数

作者: Tinyspot | 来源:发表于2022-12-03 21:29 被阅读0次

1. 复杂参数

  • Map
  • Model
  • ServletResponse

2. 转发与重定向

  • 转发
    • 由服务端完成;
    • 地址栏不发生变化,显示的转发前的地址(针对浏览器);
    • 只发生一次请求;
    • 请求中携带的参数不会丢失;
  • 重定向
    • 服务端告诉浏览器或客户端重定向的地址,由客户端再次发起请求;
    • 地址栏显示重新向后的地址(针对浏览器);
    • 发生了两次请求;
    • 第一次请求的参数不会带到重定向后的请求中;

2.2 方式一:forward 关键字

map,model 和 request 里的数据会被放入 request 域,相当于request.setAttribute()

@Controller
@RequestMapping("/api")
public class ForwardController {

    @GetMapping("/forward")
    public String forward(Map<String, Object> map, Model model,
                       HttpServletRequest request, HttpServletResponse response) throws Exception {
        map.put("mapInfo", "hello");
        model.addAttribute("modelInfo", "demo");
        request.setAttribute("message", "this is test");

        Cookie cookie = new Cookie("kie", "cookie001");
        response.addCookie(cookie);

        return "forward:/api/show";
    }

    @GetMapping("/show")
    public Map<String, Object> show(@RequestAttribute(value = "name", required = false) String name,
                                    HttpServletRequest request) {
        Map<String, Object> map = new HashMap<>();
        map.put("parameterMap",  request.getParameterMap());
        map.put("mapInfo", request.getAttribute("mapInfo"));
        map.put("modelInfo", request.getAttribute("modelInfo"));
        map.put("message", request.getAttribute("message"));
        return map;
    }
}

请求地址 http://localhost:8080/api/forward

2.3 方式二:Servlet API

请求转发是通过请求分配器( RequestDispatcher ) 直接将请求转发到了另一个 url 上。此时请求依旧在后端,还没有返回响应给前端

@RestController
public class ServletController {
    @GetMapping("/params")
     public void params(Map<String, Object> map, Model model,
                         HttpServletRequest request, HttpServletResponse response) throws Exception {
        // ...
        request.getRequestDispatcher("/show").forward(request,response);
    }
}

经测试,转发后只能取到 HttpServletRequest 设置的值

3. 重定向

3.1 方式一:redirect 关键字

@Controller
@RequestMapping("/api")
public class ForwardController {

    @GetMapping("/redirect")
    public String redirect(HttpServletRequest request) throws Exception {
        return "redirect:/api/play";
    }

    @GetMapping("/play")
    public Map<String, Object> play(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<>();
        return map;
    }
}

请求地址 http://localhost:8080/api/redirect

3.2 方式二:Servlet API

@RestController
public class ServletController {
    @GetMapping("/redirect")
    public void redirect(HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.getRequestDispatcher("/api/play").forward(request, response);
    }
}

请求地址 http://localhost:8080/redirect

3. Map, Model 类型的参数

ModelAndViewContainer

相关文章

网友评论

      本文标题:Spring Boot Web 请求参数之复杂参数

      本文链接:https://www.haomeiwen.com/subject/vzdmfdtx.html