关于控制器

    • @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。
    • @RestController: 是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器。(如果返回的404,看一下是不是没使用@ResponseBody这个注解)
    • @scope bean的作用域注解,单例多例使用. ``` @Scope(“singleton”) @Data public class User { private static final long serialVersionUID = 1348665906085238496L; private Long id; private String username; private String email; private String phone; private String qq; private Date createTime; private Date updateTime; }
    1. 例如上方代码表示
    2. - singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
    3. - prototype : 每次请求都会创建一个新的 bean 实例。
    4. - request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
    5. - session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
    6. <a name="XigId"></a>
    7. #### @Component,@Repository,@Service, @Controller
    8. 如果不知道组件属于哪一层可以使用component<br />@Repository<br />一般用于操作数据库的dao层,即mapper.<br />和@mapper组合使用可以解决@atuowird出红线报错的问题.<br />例如下方,因为mappermybaits的注解,

    @Component @Mapper public interface ProductsMapper extends BaseMapper { /**

    1. * 插入产品信息
    2. *
    3. * @param
    4. * @return
    5. * @author alpha
    6. * @version 0.1.0
    7. * @date
    8. */
    9. int insertProducts(Products products);
    10. /**
    11. * 根据id删除产品信息
    12. *
    13. * @param
    14. * @return
    15. * @author alpha
    16. * @version 0.1.0
    17. * @date
    18. */
    19. int deleteProducts(Long productid);
    20. /**
    21. * 根据id更新产品信息
    22. * @param
    23. * @return
    24. * @author alpha
    25. * @version 0.1.0
    26. * @date
    27. */
    28. int updateProducts(Long productid);
    29. /**
    30. * 查询产品数据集合
    31. * @param
    32. * @return
    33. * @author alpha
    34. * @version 0.1.0
    35. * @date
    36. */
    37. @Select(value ="SELECT * FROM products")

    public List selectProductslist();

    }

    1. @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。<br />@Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。<br />配置类
    2. <a name="R4sim"></a>
    3. #### @Configuration
    4. 声明该类为配置类.<br />示例,与application.properties,application.yaml这类配置文件灵活组合使用.

    @Configuration
    public class ExampleConfiguration {

    1. @Value("com.mysql.jdbc.Driver")
    2. private String driverClassName;
    3. @Value("jdbc://xxxx.xx.xxx/xx")
    4. private String driverUrl;
    5. @Value("${root}")
    6. private String driverUsername;
    7. @Value("123456")
    8. private String driverPassword;
    9. @Bean(name = "dataSource")
    10. public DataSource dataSource() {
    11. BasicDataSource dataSource = new BasicDataSource();
    12. dataSource.setDriverClassName(driverClassName);
    13. dataSource.setUrl(driverUrl);
    14. dataSource.setUsername(driverUsername);
    15. dataSource.setPassword(driverPassword);
    16. return dataSource;
    17. }
    18. @Bean
    19. public PlatformTransactionManager transactionManager() {
    20. return new DataSourceTransactionManager(dataSource());
    21. }

    }

    1. <a name="Cyav5"></a>
    2. #### 3.1. GET 请求
    3. @GetMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.GET)

    @GetMapping(“/users”) public ResponseEntity> getAllUsers() { return userRepository.findAll(); }

    1. <a name="cNNGJ"></a>
    2. #### 3.2. POST 请求
    3. @PostMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.POST)<br />关于@RequestBody注解的使用,在下面的“前后端传值”这块会讲到。

    @PostMapping(“/users”) public ResponseEntity createUser(@Valid @RequestBody UserCreateRequest userCreateRequest) { return userRespository.save(user); }

    1. <a name="tc88V"></a>
    2. #### 3.3. PUT 请求
    3. @PutMapping("/users/{userId}") 等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)

    @PutMapping(“/users/{userId}”) public ResponseEntity updateUser(@PathVariable(value = “userId”) Long userId, @Valid @RequestBody UserUpdateRequest userUpdateRequest) { …… }

    1. <a name="Ji42l"></a>
    2. #### 3.4. **DELETE 请求**
    3. @DeleteMapping("/users/{userId}")等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)

    @DeleteMapping(“/users/{userId}”) public ResponseEntity deleteUser(@PathVariable(value = “userId”) Long userId){ …… }

    1. <a name="J701B"></a>
    2. #### 3.5. **PATCH 请求**
    3. 一般实际项目中,我们都是 PUT 不够用了之后才用 PATCH 请求去更新数据。

    @PatchMapping(“/profile”) public ResponseEntity updateStudent(@RequestBody StudentUpdateRequest studentUpdateRequest) { studentRepository.updateDetail(studentUpdateRequest); return ResponseEntity.ok().build(); }

    1. 前后端传参
    2. <a name="tSRoD"></a>
    3. #### @PathVariable 和 @RequestParam

    @GetMapping(“/klasses/{klassId}/teachers”) public List getKlassRelatedTeachers( @PathVariable(“klassId”) Long klassId, @RequestParam(value = “type”, required = false) String type ) { … }

    1. 如果我们请求的 url 是:/klasses/{123456}/teachers?type=web<br />那么我们服务获取到的数据就是:klassId=123456,type=web
    2. <a name="G68WB"></a>
    3. #### 4.2. @RequestBody
    4. 用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且**Content-Type application/json** 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用HttpMessageConverter或者自定义的HttpMessageConverter将请求的 body 中的 json 字符串转换为 java 对象。<br />我用一个简单的例子来给演示一下基本使用!<br />我们有一个注册的接口:

    @PostMapping(“/sign-up”) public ResponseEntity signUp(@RequestBody @Valid UserRegisterRequest userRegisterRequest) { userService.save(userRegisterRequest); return ResponseEntity.ok().build(); }

    1. UserRegisterRequest对象:

    @Data @AllArgsConstructor @NoArgsConstructor public class UserRegisterRequest { @NotBlank private String userName; @NotBlank private String password; @FullName @NotBlank private String fullName; } ```