java学习--黑马SpringBoot3课程个人总结-2024-02-03

1.@RestController注解

知识来源
在网上的一番搜索后,我大致总结出了几点:
1.@RestController为开发提供了方便☺,在提供json接口时需要的配置操作再也不需要自己配置了。
2.@RestController注解相当于@ResponseBody和@Controller的结合
3.@RestController注解时,返回的是内容实例


上面说到@RestController注解相当于@ResponseBody和@Controller的结合,那么在这里就大致介绍一下这两个注解的作用;

@ResponseBody
在实际操作中我们只需要在Controller层使用@RequestBody注解就可以将对象进行反序列化;而若需要对Controller的方法进行序列化,我们需要在返回值上使用@ResponseBody;也可以将@ResponseBody注解在Controller类上,这样可以将这个类中所有的方法序列化。

@Controller
@Controller是一种特殊化的@Component类,在实际操作中**@Controller用来表示Spring某个类是否可以接受HTTP请求**,她通常与@ResponseBody绑定使用

@Component
1.把普通POJO(Plain Ordinary Java Object简单的java对象)实例化到spring容器中,相当于配置文件中的
2.泛指组件,当组件不好归类的时候,可以使用@Component注解进行标注


总结来看
用@RestController标记的类表示这是一个RESTful风格的控制器,它可以处理HTTP请求并返回JSON格式的响应。 @RestController注解在处理请求时,会自动将方法的返回值转换为JSON格式的响应体,并返回给客户端。

2.新增文章分类

@RestController
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    //添加文章的分类
    @PostMapping
    public Result add(@RequestBody @Validated Category category){
        categoryService.add(category);
        return Result.success();
    }
}

Service层

  //新增文章分类
    @Override
    public void add(Category category) {
        //补充属性值
        category.setCreateTime(LocalDateTime.now());
        category.setUpdateTime(LocalDateTime.now());
        Map<String ,Object> map = ThreadLocalUtil.get();
        Integer userId =(Integer) map.get("id");
        category.setCreateUser(userId);
        categoryMapper.add(category);
    }

Mapper层

   //新增文章分类
    @Insert("insert into category (category_name,category_alias,create_user,create_time,update_time) " +
            "values (#{categoryName},#{categoryAlias},#{createUser},#{createTime},#{updateTime})")
    void add(Category category);

3.文章分类列表

 //获取文章分类的列表
    @GetMapping
    public Result<List<Category>> list(){
        List<Category> categoryList= categoryService.list();
        return Result.success(categoryList);
    }
   @Override
    public List<Category> list() {
        Map<String,Object> map = ThreadLocalUtil.get();
        Integer userId = (Integer) map.get("id");

        return categoryMapper.list(userId);
    }
 //展示文章分类
    @Select("select * from category where create_user=#{userId};")
    List<Category> list(Integer userId);

改变格式
java学习--黑马SpringBoot3课程个人总结-2024-02-03_第1张图片


测试结果

java学习--黑马SpringBoot3课程个人总结-2024-02-03_第2张图片

3.获取文章分类详情

   //获取文章的详细信息
    @GetMapping("/detail")
    public Result<Category> detail(Integer id){
        Category category=categoryService.findById(id);
        return Result.success(category);
    }
   //根据id查询分类的信息
    @Override
    public Category findById(Integer id) {
        Category category=categoryMapper.findById(id);
        return category;
    }
    //根据id查询文章的分类信息
    @Select("select * from category where id=#{id}")
    Category findById(Integer id);

4.定义不同的分组,进行分组校验

@Data
public class Category {
    @NotNull(groups =Update.class)
    private Integer id;//主键ID
    @NotEmpty(groups = {Add.class,Update.class})
    private String categoryName;//分类名称
    @NotEmpty(groups = {Add.class,Update.class})
    private String categoryAlias;//分类别名
    private Integer createUser;//创建人ID
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;//创建时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;//更新时间

    //定义分组
    public interface Add{

    }

    public interface Update{

    }

}

在Controller层的代码
java学习--黑马SpringBoot3课程个人总结-2024-02-03_第3张图片

//如果某个校验项没有指定分组,那么他就属于默认分组
//分组之间可以继承,A extends B 那么A就拥有B的所有校验项
依据以上两个规则,我们可以做对代码进行优化
    //如果某个校验项没有指定分组,那么他就属于默认分组
    //分组之间可以继承,A extends B 那么A就拥有B的所有校验项
    //定义分组
    public interface Add extends Default {
    }
    public interface Update extends Default{
    }

java学习--黑马SpringBoot3课程个人总结-2024-02-03_第4张图片

5.新增文章——参数校验--------自定义校验

要求如下
java学习--黑马SpringBoot3课程个人总结-2024-02-03_第5张图片

实现的过程和原理如下
java学习--黑马SpringBoot3课程个人总结-2024-02-03_第6张图片
代码如下

   @RequestMapping
    public Result addArticle(@RequestBody @Validated Article article){
        articleService.addArticle(article);
        return Result.success();
    }
``


```java

@Documented//元注解
@Target({FIELD})
@Retention(RUNTIME)//元注解
@Constraint(validatedBy = {StateValidation.class})//提供校验规则的类
public @interface State {
    //提供失败后的提示信息
    String message() default "state参数只能是已发布或者草稿";
    //指定分组
    Class<?>[] groups() default {};
    //负载,获取到State注解的附加信息
    Class<? extends Payload>[] payload() default {};
}
@Data
public class Article {
    private Integer id;//主键ID
    @NotEmpty
    @Pattern(regexp = "^\\S{1,10}$")
    private String title;//文章标题
    @NotEmpty
    private String content;//文章内容
    @NotEmpty
    @URL
    private String coverImg;//封面图像
    @State
    private String state;//发布状态 已发布|草稿
    @NotNull
    private Integer categoryId;//文章分类id
    private Integer createUser;//创建人ID
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
}
public class StateValidation implements ConstraintValidator<State,String> {

    /**
     *
     * @param value 将来要校验的数据
     * @param constraintValidatorContext
     * @return
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (value==null){
            return false;
        }
        return value.equals("已发布") || value.equals("草稿");
    }
}

你可能感兴趣的:(Java的学习笔记,java,学习,开发语言)