您现在的位置是:首页 >学无止境 >SpringMVC网站首页学无止境
SpringMVC
目录
前言:
SpringMVC是一个web框架,它是基于Servlet API进行搭建的,从一开始就包含在spring中。当需要开发一些web相关的项目就可以使用这样的框架,会很大程度帮助开发者coding。
什么是SpringMVC
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分
为模型、视图和控制器三个基本部分。
1)Model(模型)是应用程序中用于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据中存取数据。
2)View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。前端可以看见的页面。
3)Controller(控制器)是应用程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
注意:
MVC只是一种思想,而SpringMVC是思想的具体实现。
SpringBoot内部存在Web框架,我们只需要在创建Spring Boot项目的时候添加Spring Web框架依赖即可。
相关操作
@RequestMapping
注册路由,和http请求中的url对应(同时也就把浏览器和代码连接起来了)。支持多种类型的请求(Get,Post,Put...)。method 可设置具体支持的请求类型。
路由映射:所谓的路由映射指的是,当用户访问⼀个 url 时,将用户的请求对应到程序中某个类
的某个方法的过程就叫路由映射。
@RequestMapping 即可修饰类,也可以修饰方法。这样可能需要使用多级路由。
@RestController注解为@Controller + @ResponseBody的组合。将这个类会作为Bean让Spring托管并且这个类中所有方法返回的数据都是非静态页面。
method = RequestMethod.GET这样的设置这个路由将只支持GET请求。同时@GetMapping和@PostMapping只支持Get和Post请求。
前端参数传递
后续方法都是在UserController这个类中
我们只需要在方法上写上对应的形参即可,SpringMVC会获取到前端传递的参数赋值到当前形参当中。
SpringMVC根据key-value形式进行参数匹配,所以后端需要和前端传递的key值相等。如果使用包装类型,前端没有传递参数的情况下那么结果就是null;如果使用基础数据类型接收,就会直接抛异常。所以推荐使用包装类型作为形参。
后端使用基础数据类型,前端没有传递参数,就直接500了。
注意:
如果前端传递多个参数,写法也是这样。不需要注意顺序。因为SpringMVC是按照key-value形式进行匹配的。
使用原始Servlet形参
由于SpringMVC就是基于Servlet进行封装的,那么就会支持原始Servlet的写法。
返回数据自动检查类型
SpringMVC返回数据会自动进行数据类型检查,同时就设置响应格式了。
对象作为形参
以对象作为接收前端数据,前端只需要传递对象中的属性,SpringMVC会自动进行对象的初始化(参数映射)。
@RequestParam
前端传递参数 key = username 会赋值到当前name参数中。
默认 required = true 意味着前端必须传递username的key,否则就会报400请求错误。可以手动置为 required = false 意味着前端就可以不传递这个参数,同时也不会报错。
用来处理前端和后端参数key值不一样的情况。
注意:
form表单发送的请求,参数也会构造到QueryString中。同样也使用这种方式进行参数接收。
@RequestBody
添加注解@RequestBody 接收json对象(声明了这个参数接收json数据)。SpringMVC会自动解析json数据,并且赋值到当前对象中。
@PathVariable
从基础URL中获取参数(不是query string中) 例如:http://localhost:8080/hello14/wuhao/123。
SpringMVC会解析这样的URL。@RequestMapping后面花括号中就是key,URL对应位置就是value。SpringMVC会自动设置到对应的形参中。
使用name属性也可以对参数进行更名。接收pwd的key赋值到password形参上,requere = false就是非必须传参,不传递这个参数也不会报错。
优点:搜索引擎抓取关键字权重更高;url更简洁。
上传文件
@RequestPart
@RequestMapping("/upload")
public Object upload(@RequestPart("myimg") MultipartFile file) {
// 文件名 + 文件后缀
String fileName = UUID.randomUUID() + file.getOriginalFilename().substring(
file.getOriginalFilename().lastIndexOf('.'));
File saveFile = new File("E:\tmp\" + fileName);
try {
file.transferTo(saveFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
使用@RequestPart注解(myimg就是对应的key)。参数类型必须使用MultipartFile类型,就是SpringMVC的约定,它就会解析这样的参数。
路径如果保持不变,上传文件就会覆盖。使用UUID生成唯一文件名,然后获取上传文件的类型就可以生成唯一的文件名且后缀和上传文件后缀一致。
使用transferTo方法进行对应路径保存文件即可。文件传输都是以二进制流的方式传递,这样的方法就可以解析这样的二进制数据,还原为原来文件保存到对应路径中。
注意:
一次上传文件大小默认是1MB,一次请求上传文件大小默认是10MB。可以在配置文件中进行修改。
# 设置一次上传文件大小(默认是1MB)
spring.servlet.multipart.max-file-size=100MB
# 设置一次请求上传文件大小(默认是10MB)
spring.servlet.multipart.max-request-size=100MB
获取Cookie
@CookieValue
@CookieValue注解会获取这个请求的Cookie,key就是属性value的值java,赋值到当前形参中。
获取Header
@RequestHeader
@RequestHeader参数中的key就是获取header中的key。SpringMVC会得到header中对应key的value赋值到当前形参中。
获取Session
@SessionAttribute
已经存储了Session:(key:name,value:123456)。
@SessionAttribute参数中的key就是要获取Session中的key。SpringMVC会把对应key的value值赋值到当前形参中。
返回静态页面数据
在返回这个静态文件时,需要添加 /。意味着从根目录(项目路径)下查找这个文件。
返回非静态页面数据
返回非静态页面也就是返回数据,使用@ResponseBody注解声明。
请求转发
发生在服务端程序内部,当服务器端收到一个客户端的请求之后,会先将请求,转发给目标地址,再将目标地址返回的结果转发给客户端。 而客户端对于这一切毫无感知的。
请求重定向
请求重定向指的是服务器端接收到客户端的请求之后,会给客户端返回了一个临时响应头,这个临时响应头中记录了,客户端需要再次发送请求(重定向)的 URL 地址,客户端再收到了地址之后,会将请求发送到新的地址上,这就是请求重定向
区别:
1)两者定义不同。
2)请求方不同。请求转发是服务器端的行为,服务器端代替客户端发送请求,并将结果返回给客户端;而请求重定向是客户端的行为,需要客户端发送两次请求。
3)数据共享不同。请求转发客户端只发送一次请求,那么整个过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象。所以整个过程中请求和响应数据是共享的。而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的。
4)最终URL地址不同。请求转发是服务器代理发送请求,客户端感知不到并且客户端只发送一次请求,即客户端URL是不变的。请求重定向需要客户端发送两次请求,那么URL就是第二次请求的URL。
小结:
在理解概念的同时需要多写代码,结合概念这样就会加深自己对知识的掌握。