SSM框架
- SpringMVC 中常见的注解和用法
- 基础注解介绍
- @RequestMapping 注解介绍
- @PostMapping 和 @GetMapping 注解介绍
- 获取参数相关注解的介绍
- 只通过 @RequestMapping 来获取参数
- 只传递一个参数
- 传递对象参数
- 传递多个参数(非对象)
- @RequestParam 后端参数重命名
- required 必传参数的设置
- @PathVariable 获取URL中的参数
- @RequestPart 上传文件
- @CookieValue 简洁的获取 Cookie
- @RequestHeader 简洁获取 Header
- @SessionAttribute 简洁获取Session
SpringMVC 中常见的注解和用法
基础注解介绍
@RequestMapping 注解介绍
@RequestMapping 注解是用来注册接口的路由映射。
我们来看一下他的基础使用:
@Controller //在Spring 框架 启动的时候 类就加载进去了
@ResponseBody //返回非页面数据
@RequestMapping("/test")
public class TestController {
//注册接口的路由映射
@RequestMapping("/hello")
public String say(){
return "hello world";
}
}
此注解可以修饰类和方法。当修饰类的时候访问地址是 类+方法
我的电脑上运行springBoot程序的端口是8080。所以访问地址为:localhost:8080/test/hello
@RequestMapping 直接修饰类:
@Controller //在Spring 框架 启动的时候 类就加载进去了
@ResponseBody //返回非页面数据
public class TestController {
//注册接口的路由映射
@RequestMapping("/hello")
public String say(){
return "hello world";
}
}
访问地址为:localhost:8080/hello
@RequestMapping 注解是客户端发送Post和Get请求都可以接受(可以用postMan测试一下)。那么我们业务要求只能接收post请求或者只能接收Get请求我们应该如何处理呢?
我们可以显示指定@RequestMapping来接受post:
@Controller //在Spring 框架 启动的时候 类就加载进去了
@ResponseBody //返回非页面数据
public class TestController {
//注册接口的路由映射
@RequestMapping(value = "/hello",method = RequestMethod.POST)
public String say(){
return "hello world";
}
}
我们要是想让他只能接收Get我们只需要将RequestMethod.POST 改为 RequestMethod.GET就可以了。我们如果需要验证是否只能够接收单一模式的请求我们可以借助postman来发送不同类型的请求。
@PostMapping 和 @GetMapping 注解介绍
前面介绍了RequestMapping 想要接收单一类型的请求用指定显示来完成。当然有专门的注解来完成这个需求
只能接收Get 请求的两种注解写法:
@RequestMapping(value = "/hello",method = RequestMethod.GET)
@GetMapping("/hello")
只能接收Post 请求的两种注解写法:
@RequestMapping(value = "/hello",method = RequestMethod.POST)
@PostMapping("/hello")
获取参数相关注解的介绍
只通过 @RequestMapping 来获取参数
只传递一个参数
springMVC可以直接用方法中的参数来实现传参:
@Controller //在Spring 框架 启动的时候 类就加载进去了
@ResponseBody //返回非页面数据
public class TestController {
@RequestMapping("/index")
public String say4(int id){
return "id = " + id;
}
}
在网址栏里直接输入:localhost:8080/index?id=123。便可得知已经成功获取参数 。
直接传递基本数据类型的话,如果参数未传或者参数错误直接就会报错:
所以参数最好不要用基本数据类型,传递过来的数据是基本数据类型的话可以用包装类来接收。
@Controller //在Spring 框架 启动的时候 类就加载进去了
@ResponseBody //返回非页面数据
public class TestController {
@RequestMapping("/index")
public String say(Integer id){
if (id == null){
return "参数错误";
}
return "id = " + id;
}
}
用包装类来接收基本数据类型可以在方法内部来处理参数错误的情况:
传递对象参数
SpringMVC可以自动实现参数对象的赋值,比如我创建一个Userinfo对象
import lombok.Data;
@Data
public class UserInfo {
private int id;
private String name;
private String password;
private int age;
}
传递对象代码实现:
@RequestMapping("/index")
public String method(Integer id){
if (id == null){
return "参数错误";
}
return "id = " + id;
}
用postman发送请求:
通过返回的结果可知,发送的键值对中键的名称是和对象中的属性名称是一样的,不传递的参数是设置其为默认值。
传递多个参数(非对象)
传递多个参数的代码:
@RequestMapping("/index2")
public Object method(String name,Integer id){
return "name: " + name + " id:" + id;
}
通过postman来发送请求进行访问:
前后端进⾏参数匹配时,是以参数的名称进⾏匹配的 ,参数的位置不影响后端获取参数的结果
@RequestParam 后端参数重命名
前后端进⾏参数匹配时,是以参数的名称进⾏匹配的。我们在进行前后端交互的时候可能后端人员写完代码了,在某一处参数的名称为name,但是前端人员要求发送的名称是username,后端人员直接修改名字的话就变化太多了,我们可以用@RequestParam注解来实现重命名。
重命名的代码:
@RequestMapping("/index3")
public Object method2(@RequestParam("username") String name,Integer id){
return "name: " + name + " id:" + id;
}
通过postman来发送请求进行访问:
但是此代码还会有一个问题,不用@RequestParam进行重命名的时候,参数少传递是没有问题的,没有接收到参数的直接赋值为默认值。但是重命名之后参数少传我们会直接报错。
required 必传参数的设置
@RequestParam的必传参数的设置默认为true,我们要想该参数非必传的话就需要修改required
修改required:
@RequestMapping("/index3")
public Object method2(@RequestParam(value = "username",required = false) String name,Integer id){
return "name: " + name + " id:" + id;
}
修改完成之后参数就可以非必传了。
### @RequestBody 接收JSON对象
后端代码:
@RequestMapping("/index5")
public Object method4(@RequestBody UserInfo userInfo){
return userInfo;
}
用postman发送请求:
如果没有@RequestBody注解 userInfo中的属性就不会接收到参数
@PathVariable 获取URL中的参数
后端实现代码:
@RequestMapping("/index4/{name}/{password}")
public Object method3(@PathVariable String name,@PathVariable String password){
return "name: "+name + " |password: " + password;
}
用postman发送请求访问后端:
但是需要注意的就是URL中的顺序变了,后端接收的参数是按着顺序来的.
还要注意的一点就是@PathVariable 的必传参数的设置默认为true,要是想要设置为非必传的话修改为required = false也是没有效果的
@RequestMapping中{}中的单词和参数的名称是对应的,如果{}中的名称password变成了pwd,没必要方法的形参也改名只需要value = “pwd” 重命名就可以了
@RequestMapping("/index4/{name}/{pwd}")
public Object method3(@PathVariable String name,@PathVariable(value = "pwd",required = false) String password){
return "name: "+name + " |password: " + password;
}
但是如果URL改为http://localhost:8080/index4/zhangsan/123456 如果 {}中写password 参数写pwd不会报错,但是输出结果为null.
如果参数URL少写肯定会报错
@RequestPart 上传文件
后端代码:
@RequestMapping("/myupload")
public Object upload(@RequestPart("myimg") MultipartFile file){
//文件名称 UUID
String fileName = UUID.randomUUID()//文件名 用UUID而不是直接命名是为了防止文件覆盖只能保存一个文件
+ file.getOriginalFilename().substring(
file.getOriginalFilename().indexOf("."));//文件后缀
//文件保存地址
File saveFile = new File("D:\\data\\"+fileName);
try {
//保存文件
file.transferTo(saveFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
用postman发送请求访问后端:
在目的地址看到了传送的文件:
倘若文件大于springMVC的默认要求大小,我们可以修改 application.properties 配置文件 让其能传送的数据更大:
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
@CookieValue 简洁的获取 Cookie
后端代码:
@RequestMapping("/getck")
public Object getCk(@CookieValue(value = "java",required = false) String java){
return java;
}
如果直接访问localhost:8080/getck页面不会有任何结果,因为当前页面没有Cookie 。我们只需要在页面中按Fn + F12 就加一个Cookie 然后刷新就可以看到cookie的返回值。
@RequestHeader 简洁获取 Header
后端代码:
@RequestMapping("/gethd")
public Object getHeader(@RequestHeader("User-Agent") String ua){
return "User-Agent : " + ua;
}
前端发送的:
@SessionAttribute 简洁获取Session
我们获取Session之前我们应该先存储相对应的Session:
private static final String SESSION_KEY = "USERINFO_SESSION_KEY";
@RequestMapping("setsess")
public Object doPostConstruct(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute(SESSION_KEY,"张三");
return "存储Session成功";
}
简洁获取Session 的代码:
@RequestMapping("/getsess")
public Object getSession(@SessionAttribute(SESSION_KEY) String name){
return "session" + name;
}
我们先访问localhost:8080/setsess再访问localhost:8080/getsess就可以查看获取到的session了