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
翻译成中文:
从上述定义我们可以得出两个关键信息:
Spring MVC 是⼀个 Web 框架
。(基于 Servlet 实现的)
如果有看过我前面博客的读者,回想一下:我在将 spring 的时候,并没有涉及 前端。
只有在讲解 Spring Boot 的时候,涉及到 web内容。
我们不是引入了一个 spring web 嘛,那个就是 前端框架。
有了这个 框架的支持,那么,项目就是一个 Spring MVC 的项目。
也就是说:其实前面创建的 Spring Boot 项目 是 一个 Spring MVC 项目。
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)