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??

  1. Patch方式是对put方式的一种补充;
  2. 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

  1. 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
  2. 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
@PostMapping("/")
//	使用@requestBody来将请求体写入具体的接收对象中
	public User insert(@RequestBody User user) {
		return userService.insert(user);
	}

16. @ResponseBody

  1. @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页面传值