SPRING MVC
一、知识点
1. @Component
- 用于标记在一个类上,使用它标记的类或接口就是一个Spring Component对象。
- Spring将会扫描使用了该注解的类的方法。通俗来说,被Component标记的类就是一个bean容器。
- 相当于配置文件中的<bean id="" class=""/>, 定义Spring管理Bean。
2. @Service(注入Mapper层)
- 用于标注服务层,使用它标记的类就是一个SpringMVC Controller 对象,主要用来进行业务的逻辑处理。
3. @repository(实现Dao访问)
- 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件。
4. @Mapper(实现Dao访问)
- 与对应的xxxMapper.xml文件对应,实现Mybatis服务
5. @Controller(注入Service服务)
- 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。
6. @RestController
[外链图片转存失败(img-FcqbD9au-1568278833500)(C:\Users\Leisure\AppData\Roaming\Typora\typora-user-images\1565860486083.png)]
- 一个组合注解,相当于@Controller加上@ResponseBody,返回json数据不需要在方法前面加@ResponseBody注解了,但使用**@RestControlle**这个注解,就不能返回jsp、html页面,视图解析器无法解析jsp、html页面
7. @RequestMapping("/persons")
@Controller
public class HelloWorldController {
@RequestMapping("")
public String home() {
User user;
return "index";
}
}
- 使用**@RequestMapping**注解来将请求URL,映射到整个类上或某个特定的处理器方法上。
- @RequestMapping注解和其他**@RequestMapping**类型注解可以组合使用。
8. @GetMapping
/**
* 查询所有role数据
* @return
*/
@GetMapping("/")
public List<Role> findAll(){
return roleService.findAll();
}
RequestMapping的Get方式
用法:
a. 直接在浏览器地址栏输入某个地址
b. 点击链接
c. 表单默认的提交方式
特点:
a. 请求参数会添加到请求资源路劲的后面,只能添加少量参数(因为请求行只有一行,大约只能存放2K左右的数据)(2K左右的数据,看起来也不少。。。)
b. 请求参数会显示在浏览器地址栏,路由器会记录请求地址
9. @PostMapping
/**
* 插入role数据
* @param role
* @return
*/
@PostMapping("/")
public int insertRole(@RequestBody Role role){
return roleService.insertRole(role);
}
就是RequestMapping的Post方式
用法:
a. 设置表单method = “post”
特点:
a. 请求参数添加到实体内容里面,可以添加大量的参数(也解释了为什么浏览器地址栏不能发送post请求,在地址栏里我们只能填写URL,并不能进入到Http包的实体当中)
b. 相对安全,但是,post请求不会对请求参数进行加密处理(可以使用https协议来保证数据安全)。
10. @PutMapping
用于修改数据,可使用**@RequestBody**来接受值
/** 更新用户
* 处理"/users"的PUT请求,用来更新User信息
* @param user
* @return
*/
@PutMapping("/")
public User update(@RequestBody User user) {
return userService.update(user);
}
11. @DeleteMapping
用于删除数据,可使用@PathVariable来接受数据
/**
* 通过id删除用户
* @param id
* @return
*/
@DeleteMapping("/{id}")
public boolean deleteRole(@PathVariable long id){
System.out.println(id);
return roleService.deleteRole(id);
}
12. @PatchMapping??
- Patch方式是对put方式的一种补充;
- put方式是可以更新.但是更新的是整体.patch是对局部更新;
13. @PathVariable
其用来获取请求路径(url )中的动态参数。
@GetMapping("/{id}")
// 使用@PathVariable来获取url上的动态参数id
public User get(@PathVariable Long id) {
return userService.get(id);
}
14. @RequestParam
获取请求参数的值,将请求参数绑定到你控制器的方法参数上
@Controller
@RequestMapping("/pets")
@SessionAttributes("pet")
public class EditPetForm {
// ...
@RequestMapping(method = RequestMapping.GET)
// 通过@RequestParam获取petId的值
public String setupForm(@RequestParam("petId") int petId, ModelMap model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
return "petForm";
}
// ,..
}
15. @RequestBody
- 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
- 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
@PostMapping("/")
// 使用@requestBody来将请求体写入具体的接收对象中
public User insert(@RequestBody User user) {
return userService.insert(user);
}
16. @ResponseBody
- @Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
注意:@RestController包含@ResponseBody注解
@RequestMapping(value = "user/login")
@ResponseBody
// 将ajax(datas)发出的请求写入 User 对象中,返回json对象响应回去
public User login(User user) {
User user = new User();
user .setUserid(1);
user .setUsername("MrF");
user .setStatus("1");
return user ;
}
二、页面跳转和值传递
注意:
返回String时,如果不加注解@ResponseBody,表示返回的是个页面;如果加了该注解,表示返回的真的是一个字符串
1. 重定向
return “redirect:files/{path}”;
@RequestMapping("/loginUser")
public String login(String username, String password, Model model) throws Exception {
if (username != null && password != null) {
if ("admin".equals(username) && "123".equals(password)) {
// 登录成功,重定向到主页面
return "redirect:/main";
}
}
}
2. 转发
return “forward:files/{path}”;
public String login(String username, String password, Model model) throws Exception {
if (username != null && password != null) {
if ("admin".equals(username) && "123".equals(password)) {
// 登录成功,重定向到主页面
return "redirect:/main";
} else {
// 向 request 域中设置错误提示信息
model.addAttribute("loginFlag", "用户名或密码错误");
// 登录失败,转发到登录页面
return "forward:/login";
}
} else {
// 只是把模型放到request域里面,并没有真正的安排好
model.addAttribute("loginFlag", "用户名或密码错误");
// 登录失败,转发到登录页面
return "forward:/login";
}
}
3.传值
1. 利用ModelAndView页面传值