SpringMVC 接收数据
1.设置访问路径
@RequestMapping 将handler注册到 HandlerMapping中
-
@RequestMapping 可以用到方法上也可以用到类上
用到方法上,访问某个路径就直接执行这个方法。如果方法上都有某一个路径字段,就可以把他提取出来放到类上。需要注意的是放在类上,方法上也必须有这个注解,否则HandlerMapping找不到这个方法
如果类上指定了路径,而方法上没有指定路径,那么访问类上的路径就会走这个方法
@Controller @RequestMapping("user") public class UserController { @RequestMapping public String index(){ return null; } @RequestMapping("login") public String login(){ return null; } }
当访问 user 路径时,会走index方法,访问 user/login 会走 login方法
-
@RequestMapping 的地址可以有多个,传入地址的数组即可
-
支持模糊地址
/user/* 表示user路径下任意一层地址
/user/** 表示 user路径下的任意层地址
-
指定请求方式
在 @RequestMapping 中默认是任何请求方式都能访问,可以使用 method=RequestMethod.POST 等指定请求方式,请求方式也可以传入数组
@RequestMapping(method = RequestMethod.GET) public String index(){ return null; }
如果前端的请求方式不符合,会报405的错误
除了@RequestMapping 注解之外,还有一些已经指定了请求方式的注解
-
GetMapping
-
PostMapping
-
PutMapping
-
DeleteMapping
这几个注解只能用在 方法上,内部已经指定了响应的请求方式
-
2.param接收参数
-
直接接收
直接在handler的形参列表上接收,要求是形参名和类型与传递的参数相同
访问地址:localhost:8080/param/getter?name=hhh&age=18
@Controller @RequestMapping("param") public class ParamController { @GetMapping("getter") @ResponseBody public String getParam(String name,int age){ return "name: " + name + " age: " + age; } }
这种方式,不传递也不会报错
-
使用 @RequestParam
@RequestParam 注解加在形参列表上。
-
可以指定前端传递过来的参数名。
-
可以要求传递参数不能是空。内部有一个required,默认值是true,也就是必须传递,不传会报400异常
-
也可以给定一个默认值。,内部有一个 defaultValue,指定默认值
访问地址:localhost:8080/param/data?account=lalala
@GetMapping("data") @ResponseBody public String data(@RequestParam("account") String username, @RequestParam(required = false, defaultValue = "1")int page){ return "account:" + username + " page:" + page; }
这里指定了第一个请求参数叫 account,并且使第二个请求参数可以不传递,如果不传递默认值是1
-
-
集合接值
如果同一个key,对应了很多value,那么就可以用集合去接收请求参数
访问地址:localhost:8080/param/data1?list=zhangsan&list=lisi
@GetMapping("data1") @ResponseBody public String data1(@RequestParam List<String> list){ System.out.println("list = " + list); return "ok"; }
这里的list形参列表也需要加上 @RequestParam
-
使用实体对象接值
要求请求参数的名和实体类对象的属性相同
如果没有传递对应的请求参数,那么就是该对象属性的默认值
@GetMapping("data3") @ResponseBody public String data3(User user){ return user.toString(); }
3.路径接收参数
访问地址:localhost:8080/param/path/root/12345
@GetMapping("path/{account}/{password}")
@ResponseBody
public String pathData(@PathVariable String account, @PathVariable String password){
return "username:" + account + " password:" + password;
}
这里用的注解是 @PathVariable 他也可以指定传递参数名和传递的必须性
4.json 参数接收
接收前端传递的json数据也是需要一个实体类,实体类的名称和传递的参数要相同
并且请求方式必须是 Post请求
然后在handler的形参上使用 @RequestBody
@PostMapping("json")
@ResponseBody
public String jsonData(@RequestBody User user){
return user.toString();
}
这样之后,还不能接收json数据,因为java 并不支持json格式,还要以下两个步骤
-
导入json依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.2</version> </dependency>
-
在配置类上加入 @EnableWebMvc 注解,给 HandlerAdapter配置json 转换器
@Configuration @ComponentScan("com.ztone.param") @EnableWebMvc public class MvcConfig { @Bean public RequestMappingHandlerMapping handlerMapping(){ return new RequestMappingHandlerMapping(); } @Bean public RequestMappingHandlerAdapter handlerAdapter(){ return new RequestMappingHandlerAdapter(); } }
@EnableWebMvc 注解 会自动将 HanlderAdapter 和 HandlerMapping 添加到ioc 容器,并且会给 HandlerAdapter 添加 jacksonjson 处理器,不用自己注册这两个bean了
5.接收cookie 和请求头
-
接收cookie 需要在形参上使用 @CookieValue 来指定参数接收的是 cookie,可以指定cookie的名称
-
接收请求头 使用 @RequestHeader ,也可以指定请求头的名称
6.获取原生对象
想要接收原生对象 如HttpServletRequest 、HttpServletResponse、HttpSession等,直接在形参列表传入即可。
获取ServletContext(可以读取最大的配置文件、 是全局最大的共享域、核心api)
-
方案一:request.getServletContext() / session.getServletContext()
-
方案二:
@Controller public void ApiController{ @Autowired private ServletContext servletContext }
程序启动后,ServletContext会自动装入到ioc容器,所以使用 @Autowired自动装配,就可以使用。