SpringMVC工作原理
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@RestController
无法返回指定页面
- 返回的是输出结果,如JSON,是提供前端获取数据,提交数据
- 结合@RequestMapping,@GetMapping,@PostMapping…
@RestController与@Controller的区别
@RestController注解等价于@ResponseBody + @Controller。@RestController和@Controller的共同点是都用来表示Spring某个类是否可以接收HTTP请求,二者区别: @RestController无法返回指定页面,而@Controller可以;前者可以直接返回数据,后者需要@ResponseBody辅助。下面详细分析。
① 是否可以返回页面
答:@RestController无法返回指定页面,而@Controller可以。
解析:对于Controller, 如果只是使用@RestController注解,则其方法无法返回指定页面,此时配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是 return 里的内容。 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
② 返回内容
如果需要返回JSON,XML或自定义mediaType内容到页面,@RestController自己就可以搞定,这个注解对于返回数据比较方便,因为它会自动将对象实体转换为JSON格式。而@Controller需要在对应的方法加上@ResponseBody注解。
@GetMapping查询数据
@GetMapping
@GetMapping("{id}")
接受后不去找网页,直接返回数据给浏览器或者其他
@GetMapping
public User get(){
User user = new User();
user.setId(1);
user.setAge(18);
user.setName(“张三”);
user.setSex(“男”);
System.out.println(user);
return user;
}
@GetMapping("{id}")
public User getById(@PathVariable(“id”) int id){
User user = new User();
user.setId(1);
user.setAge(19);
user.setName(“张三”);
user.setSex(“女”);
System.out.println(user);
return user;
}
@PostMapping
新增数据
RequestBody:需要发来一个对象时,参数括号里要加RequestBody配合使用
@PostMapping
public User addUser(@RequestBody User user){
System.out.println(“addUser”+user);
return user;
}
发送一个User对象过来
{
“id”: 5,
“name”: “zzzqh”,
“sex”:“女”,
“age”:18
}
@Controller
1.Controller+RequestMapping+GetMapping
2.yaml文件配置以下内容配合使用
spring:
mvc:
view:
prefix: /
suffix: .html
3.pom.xml引入freemarker
4.yaml文件配置freemarker相关的信息
freemarker:
suffix: .html
template-loader-path: classpath:/static/
5.返回的是页面
@ResponseBody
结合@Controller
@ResponseBody+@Controller=@RestController
URL请求参数:
@RequestParam
接受url中带?后面的参数的
public ModelAndView param(@RequestParam(value = “id”,required = false,defaultValue = “0”) int id,
@RequestParam(value = “type”,required = false)String type){}
http://localhost:8080/param?id=001
@PathVariable
接受url中/隔开的参数
http://localhost:8080/path/2
@RequestMapping(“path/{id}”)
public ModelAndView path(@PathVariable(required = false) int id){
System.out.println(id);
ModelAndView modelAndView = new ModelAndView(PAGE);
modelAndView.addObject(“id”,id);
return modelAndView;
}
@CrossOrigin
解决跨域问题,一般用过滤器解决,不用注解
@Service
bean注册,跟业务逻辑有关
在接口实现类里面加Service注解,在Controller里加Autowired
@Component
bean注册,组件,跟业务逻辑没有关系
@Autowired
获取bean
@Resource
获取bean
@Autowired+@Qualifier
获取bean
以上三个总结
// @Resource= @Autowired+@Qualifier
//如果接口实现只有一个,用@Autowired就可以了,也不用指定名字
//如果接口有多个实现,那么用 @Resource,并指定name,或者使用 @Autowired+@Qualifier+@Qualifier的value值,建议用@Resource
@Autowired
@Qualifier(“AdminServiceImpl”)
private UserService userService;
@Resource(name = "adminServiceImpl")
private UserService userService1;
@Configuration+@Bean
bean注册(人为)
@Values
从yaml配置文件中取参数
@Value(“${view.page}”)
private String page;
工作中常用的注解
@RestController
@DeleteMapping 删除URL映射
@PutMapping: 和PostMapping作用等同,都是用来向服务器提交信息。如果是添加信息,倾向于用@PostMapping,如果是更新信息,倾向于用@PutMapping。两者差别不是很明显。