请求映射路径:
问题:多人开发,每人设置不同的请求路径,冲突问题如何解决?(为解决@RequestMapping访问路径冲突问题)
-
设置模块名作为请求路径前缀
@Controller
public class BookController {
@RequestMapping("/book/save")
@ResponseBody
public String save(){
return "{'module':'book save'}";
}
}
================================================
@Controller
public class UserController {
@RequestMapping("/user/save")
@ResponseBody
public String save(){
return "{'module':'user save'}";
}
}
-
上述代码虽能解决冲突问题,但较为麻烦;因此,对上述代码加以优化(以BookController为例)
@RequestMapping可以设置在方法上,也可以设置在类上,类和方法上同时设置代表当前访问路径为:/book/save
@Controller
@RequestMapping("/book")
public class BookController {
@RequestMapping("/save")
@ResponseBody
public String save(){
return "{'module':'book save'}";
}
}
Post请求中文乱码处理:
- 为Web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
...
// 配置字符编码过滤器
protected Filter[] getServletFilters(){
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("utf-8");
return new Filter[]{filter};
}
}
请求参数:
-
普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name ,int age){
System.out.println(name);
System.out.println(age);
return "{'module':'common param'}";
}
-
普通参数:请求参数名与形参变量名不同,使用@RequestParam绑定参数关系
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name")String username ,int age){
System.out.println(name);
System.out.println(age);
return "{'module':'common param different name'}";
}
-
POJO参数:请求参数名与形参对应属性名相同,定义POJO类型形参即可接收参数
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
return "{'module':'pojo param'}";
}
-
数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
return "{'module':'array param'}";
}
-
集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
return "{'module':'list param'}";
}
-
JSON数据:
步骤一:添加json数据转换相关坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
步骤二:设置发送json数据(使用PostMan(邮差)工具,请求body中添加json数据)
步骤三:开启自动转换json数据的支持(@EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能——json数据进行自动类型转换)
@Configuration
@ComponentScan("com.it.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
步骤四:设置接收json数据——形参注解@RequestBody
@RequestMapping("/listParamForJson")
@ReponseBody
public String listParamForJson(@RequestBody List<String> likes){
return "{'module':'list common for json param'}";
}
-
日期类型参数传递
日期类型数据基于系统不同,格式也不同(2022-11-21 2022/11/21 11/21/2022...)
接收形参时,根据不同的日期格式设置不同的接收方式——@DateTimeFormat(其转换工作靠类型转换器-Converter接口来完成的)
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
@DateTimeFormat(pattern = "yyyy-MM-dd") Date date1,
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date2){
return "{'module':'data param'}";
}
响应JSON数据——@ReponseBody(其转换工作靠HttpMessageConverter接口):
-
响应页面跳转页面
@RequestMapping("/toJumpPage")
public String toJumpPage(){
return "page.jsp"
}
-
响应文本数据(上述请求参数代码中,return返回的均为字符串,并非是json数据)
@RequestMapping("/toText")
@ReponseBody
public String toText(){
return "reponse.txt";
}
-
响应POJO对象
@RequestMapping("/toJsonPOJO")
@ReponseBody
public User toJsonPOJO(){
User user = new User();
user.setName("tom");
return user;
}
-
响应POJO集合对象
@RequestMapping("/toJsonList")
@ReponseBody
public List<User> toJsonList(){
User user1 = new User();
user1.setName("tom");
User user2 = new User();
user2.setName("jerry");
return userList;
}
REST风格:是一种约定方式,而不是规范(意味着可以打破)
REST(Representational State Transfer)表现形式状态转换(访问网络资源的格式)
- 传统风格资源描述形式:
http://localhost/user/getById?id=1
http://localhost/user/saveUser
- REST风格描述形式:
http://localhost/user/1
http://localhost/user
- 优点:
隐藏资源的访问行为,无法通过地址得知对资源是何种操作
书写简化
范例:
/**
save方法:无参
仅限于POST提交,其他提交方式报错
若想修改为其他提交方式,则需修改method值,如:method = RequestMethod.GET
*/
@RequestMapping(value="/users",method = RequestMethod.POST)
@ResponseBody
public String save(){
return "{'module':'user save'}";
}
===============================================================
/**
getById方法:带参
使用注解 @PathVariable 并且路径参数value中使用{形参名}进行占位
*/
@RequestMapping(value="/users/{id1}",method = RequestMethod.GET)
@ResponseBody
public String getById(@PathVariable Integer id1){
return "{'module':'user getById'}";
}
@RequestParam、@RequestBody、@PathVariable
- @RequestParam:用于接收url地址传参或表单传参
- @RequestBody:用于接收json数据
- @PathVariable:用于接收路径参数,使用{参数名称}描述路径参数
简化开发
@RestController :等同于 @Controller与@ResponseBody两个注解组合功能
@RestController
public class BookController {
}
@GetMapping("/{id1}"):等同于@RequestMapping(value="/users/{id1}",method = RequestMethod.GET)
同理 @PostMapping:等同于@RequestMapping(value="/users/{id1}",method = RequestMethod.POST)
@GetMapping("/{id}")
public String getById(@PathVariable Integer id){
return "{'module':'book getById}";
}