Spring bootMVC 与 SpringMVC,获取请求参数(CookieSessionHeader)请求转发请求重定向

Posted Perceus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring bootMVC 与 SpringMVC,获取请求参数(CookieSessionHeader)请求转发请求重定向相关的知识,希望对你有一定的参考价值。

@TOC


1. 什么是 Spring MVC?

官方描述:https://docs.spring.io/springframework/docs/current/reference/html/web.html#spring-web

翻译成中文:

从上述定义我们可以得出两个关键信息:

  1. Spring MVC 是⼀个 Web 框架。(基于 Servlet 实现的)

如果有看过我前面博客的读者,回想一下:我在将 spring 的时候,并没有涉及 前端。
只有在讲解 Spring Boot 的时候,涉及到 web内容。
我们不是引入了一个 spring web 嘛,那个就是 前端框架。
有了这个 框架的支持,那么,项目就是一个 Spring MVC 的项目。
也就是说:其实前面创建的 Spring Boot 项目 是 一个 Spring MVC 项目。

  1. Spring MVC 是基于 Servlet API 构建的

1.1 什么是 MVC?


下面我们来进一步分析 四者之间的关系:


1.2 MVC 和 SpringMVC 什么关系?

MVC 是一种设计思想,而 SpringMVC 是一个 具体的实现框架.


1.3 为什么要学 Spring MVC?

现在绝大部分的 Java 项目都是基于 Spring(或 Spring Boot)的,而 Spring 的核心就是 Spring MVC

也就是说 Spring MVC 是 Spring 框架的核心模块,而 Spring Boot 是 Spring 的“脚手架”, 因此我们可以推断出,现在市面上绝大部分的 Java 项目 都是 Spring MVC 项目,这是我们要学 Spring MVC 的原因。

现在的项目,有两种:

PC 项目,又可以分为2种:


拓展说一下:


2. Spring MVC 项目创建


2.1 使用用户和程序的映射

2.1.1 方法一: 使用@RequestMapping(“/xxx”)

创一个 UserController 类,实现用户到 Spring 程序的互联互通:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody // 表示的是返回一个非静态页面的数据
@RequestMapping("/user") //类上面的 RequestMapping 可以省略
public class UserController 

    @RequestMapping("/sayhi")
    public String sayHi()
        return "Hello World!";
    

@ResponseBody注解


@RequestMapping 特征:

@RequestMapping 参数扩展(只支持某种类型的请求方式,比如 POST 类型的请求方式):

@RequestMapping(method = RequestMethod.POST,value = "/sayhi")

只支持 GET:

@RequestMapping(method = RequestMethod.GET,value = "/sayhi")

2.1.2 方法二: 使用@PostMapping(“/xxx”)

@PostMapping("/sayhi2")


2.1.3 方法三: 使用 @GetMapping(“/xxx”)

@GetMapping("/sayhi3")

小总结:


2.2 获取用户请求参数

2.2.1 获取单个参数

在 Spring MVC 中可以直接⽤⽅法中的参数来实现传参.


2.2.2 获取多个参数 / 表单参数传递(非对象)

方法还是一样的,只要 前端传递的参数名称 和 后端映射方法参数名称相同,就能够获取一个,甚至多个参数。


2.2.3 获取对象


2.2.4 参数重命名( @RequesParam 注解 )

这里有一个细节:

上面的那个 username ,并不是 UserInfo 中的属性,只是一个普通的 字符串变量名.
我都没将 UserInfo 类注入到Spring 中,更别提获取到类中的属性。


使用 @RequestParam 注解注意事项:


2.2.5 获取 JSON 格式的数据(@RequestBody)

要使用 @RequestBody 这个注解:

通过获取普通对象的方法,来获取一个 json 格式的对象参数。显然是不行的!

也就是说:想要通过接收 json 对象,需要通过其它的方法来实现。
当然还是注解,这个注解就是 @ RequestBody 注解


2.2.6 从 URL 地址中获取参数 (@PathVariable)

这个就厉害了,它不满足于从 请求的正文 和 URL 中的查询字符串 中 获取参数了。
而是从 URL 中获取参数


2.2.7 上传文件( @RequestPart )

现在不是之前那种简单数据了,它可能是一个数据流。
它传过来的是一个 “流”。

比如:


拓展:优化存储目录

首先,我们先来补充 关于日志文件的知识补充。


总结:


图片名称不能重复 && 获取原图格式 问题


我们先来解决 图片名称 问题

第一种:时间戳

第二种:UUID(全局唯一标识符)


现在 存储路径的问题 搞定了,图片名称重复的问题 搞定了。
就剩下 获取 原上传图片 的 格式 了。

问题都有了解决方案,接下来就是实施环节。


2.2.8 获取 Cookie

① 基于servlet 获取 Cookie 的方法

@RequestMapping("/cookie")
    public void getCookie(HttpServletRequest request) 
        // 得到全部的 Cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie item : cookies) 
            log.info("Cookie Name:" + item.getName() +
                    " | Cookie Value:" + item.getValue());
        
    

这样的缺点:就是一次都把所有的 cookie 都给读出来了


② 使用 @CookieValue 注解实现 Cookie 的读取

 @RequestMapping("/cookie2")
    public String getCookie2(@CookieValue("456") String cookie) 
        return "Cookie Value:" + cookie;
    


2.2.9 获取 Header (请求头) 里面的信息

① Servlet 方式

 @RequestMapping("/getua")
    public String getHead(HttpServletRequest request) 
        return "header:" + request.getHeader("User-Agent");
    


② 使用注解 @RequestHeader 的方式

@RequestMapping("/getua2")
    public String getHead2(@RequestHeader("User-Agent") String userAgent) 
        return "header:" + userAgent;
    


2.2.10 存储 Session

@RequestMapping("/setsess")
    public boolean setSession(HttpServletRequest request) 
        boolean result = false;
        // 1.得到 HttpSession
        HttpSession session = request.getSession(true); // true=如果没有会话,那么创建一个会话
        // 2.使用 setAtt 设置值
        session.setAttribute("userinfo", "张三");
        result = true;
        return result;
    

设置(存储)Session 之前:

存储 Session 之后:

保存了SessionId 就传给服务器获取


2.2.11 获取 Session

① Servlet 方式

@RequestMapping("/getsess")
    public String getSession(HttpServletRequest request) 
        String result = null;
        // 1.得到 HttpSession 对象
        HttpSession session = request.getSession(false); // false=如果有会话,使用会话,如果没有,那么不会新创建会话
        // 2.getAtt 得到 Session 信息
        if (session != null && session.getAttribute("userinfo") != null) 
            result = (String) session.getAttribute("userinfo");
        
        return "会话: "+result;
    

先存才取:


② 使用注解 @SessionAttribute 的方式

@RequestMapping("/getsess2")
    public String getSession2(@SessionAttribute(value = "userinfo",
            required = false) String userinfo) 
        return "会话:" + userinfo;
    


请求转发或请求重定向

forward VS redirect

return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种:


forward 请求转发 实现


当我们访问到 myForward 方法,执行到return 语句的时候。

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


redirect:请求重定向 实现


还是举那个例子:

需要注意的是:


区别总结

forward 和 redirect 具体区别如下:

1、 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。

2、 请求重定向地址发⽣变化,请求转发地址不发⽣变化。

3、重定向浏览器会发送两条请求,转发,只有一条请求。

4、重定向,数据不共享;转发,数据共享。

5、 请求重定向与直接访问新地址效果一致,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。


请求转发 forward 导致的问题:


以上是关于Spring bootMVC 与 SpringMVC,获取请求参数(CookieSessionHeader)请求转发请求重定向的主要内容,如果未能解决你的问题,请参考以下文章

第七次课:ssh的集成(SpringMV+Spring+Hibernate)

spring,springmv,springboot解决跨域问题

Spring-Boot MVC 模板未加载(未找到 404)

Spring

springmv日志debug异常,javax.naming.NameNotFoundException

Hibernate - Spring Security - Spring MVC 版本