当前位置:   article > 正文

SpringBoot使用注解进行分页_servletutils.getparameter

servletutils.getparameter

分页使用可以说非常普遍了,有时候会需要非常灵活的方式去开启或关闭分页,尝试使用一下注解的方式来进行分页。

依赖安装

需要使用的依赖:

  • Mybatis-Plus
  • PageHelper
  • SpringBoot AOP

添加pom依赖

  1. <!-- Mybatis-Plus -->
  2. <dependency>
  3. <groupId>com.baomidou</groupId>
  4. <artifactId>mybatis-plus-boot-starter</artifactId>
  5. <version>3.4.3.4</version>
  6. </dependency>
  7. <!-- 分页 -->
  8. <dependency>
  9. <groupId>com.github.pagehelper</groupId>
  10. <artifactId>pagehelper-spring-boot-starter</artifactId>
  11. <version>1.4.0</version>
  12. </dependency>
  13. <!-- AOP -->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-aop</artifactId>
  17. <version>2.5.5</version>
  18. </dependency>

添加公共返回实体类

需要两种实体类,一种是不分页直接返回数据的,另一种是分页返回数据和总数据条数的

普通实体类 AjaxResult

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class AjaxResult<T> {
  5. public static final int CODE_SUCCESS = 200;
  6. public static final int CODE_UNAUTHORIZED = 401;
  7. public static final int CODE_FORBIDDEN = 403;
  8. public static final int CODE_ERROR = 500;
  9. public static final String MSG_SUCCESS = "操作成功";
  10. public static final String MSG_FAILED = "操作失败";
  11. public static final String MSG_NOT_PERMISSION = "用户权限不足";
  12. public static final String MSG_UNAUTHORIZED = "用户未登录或身份已过期";
  13. private int code;
  14. private String msg;
  15. private T data;
  16. public static <T> AjaxResult success(int code, T data) {
  17. return new AjaxResult(code, MSG_SUCCESS, data);
  18. }
  19. public static <T> AjaxResult success(T data) {
  20. return success(CODE_SUCCESS, data);
  21. }
  22. public static AjaxResult success() {
  23. return success(CODE_SUCCESS, null);
  24. }
  25. public static AjaxResult error(int code, String msg) {
  26. return new AjaxResult(code, msg, null);
  27. }
  28. public static AjaxResult error(String msg) {
  29. return error(CODE_ERROR, msg);
  30. }
  31. public static AjaxResult error() {
  32. return new AjaxResult(CODE_ERROR, MSG_FAILED, null);
  33. }
  34. }

分页实体类 PageResult

继承AjaxResult,额外添加total、pageNo和pageSize等字段

  1. @Data
  2. public class PageResult extends AjaxResult {
  3. private long total;
  4. private long pageNo;
  5. private long pageSize;
  6. public PageResult() {
  7. this.setCode(CODE_SUCCESS);
  8. this.setMsg(MSG_SUCCESS);
  9. }
  10. public PageResult(AjaxResult ajaxResult) {
  11. this();
  12. if (Objects.nonNull(ajaxResult)) {
  13. setCode(ajaxResult.getCode());
  14. setMsg(ajaxResult.getMsg());
  15. }
  16. }
  17. }

注解处理

分页注解 Pagination

创建一个用于分页的注解Pagination

其实这里的pageNo和pageSize没什么需求的话可以去掉的

  1. /**
  2. * 分页注解
  3. */
  4. @Target(ElementType.METHOD)
  5. @Retention(RetentionPolicy.RUNTIME)
  6. public @interface Pagination {
  7. // 第几页的请求参数名称 通过获取参数名称获取真正的pageNo
  8. String pageNo() default "pageNo";
  9. // 分页大小的请求参数名称
  10. String pageSize() default "pageSize";
  11. }

使用AOP进行分页

创建一个类用于处理分页注解,切入点要根据自己注解进行修改

  1. @Aspect
  2. @Component
  3. @Slf4j
  4. public class PaginationAspect {
  5. /**
  6. * 定义切入点
  7. */
  8. @Pointcut("@annotation(cn.montaro.social.aspect.annotation.Pagination)")
  9. public void access() {
  10. }
  11. @SneakyThrows
  12. @Around("access()")
  13. public Object around(ProceedingJoinPoint joinPoint) {
  14. Object[] args = joinPoint.getArgs();
  15. Pagination pagination = getPaginationAnnotation(joinPoint);
  16. startPage(pagination.pageNo(), pagination.pageSize());
  17. // 调用原本方法的内容并获取返回值
  18. Object result = joinPoint.proceed(args);
  19. // 返回的数据类型要保证和注解方法上的一致
  20. return pageResult(result);
  21. }
  22. /**
  23. * 获取Pagination注解
  24. *
  25. * @param joinPoint
  26. * @return
  27. */
  28. public Pagination getPaginationAnnotation(ProceedingJoinPoint joinPoint) {
  29. MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
  30. Method method = methodSignature.getMethod();
  31. Pagination pagination = method.getAnnotation(Pagination.class);
  32. return pagination;
  33. }
  34. /**
  35. * 开始分页
  36. */
  37. private void startPage(String pageNoParameterName, String pageSizeParameterName) {
  38. // 获取pageNo和pageSize
  39. int pageNo = ServletUtils.getParameterToInt(pageNoParameterName, 1);
  40. int pageSize = ServletUtils.getParameterToInt(pageSizeParameterName, 10);
  41. PageHelper.startPage(pageNo, pageSize);
  42. }
  43. /**
  44. * 对分页结果进行包装 如果分页成功则会返回PageResult
  45. *
  46. * @param result
  47. */
  48. private Object pageResult(Object result) {
  49. /**
  50. * 如果分页成功,则查询返回的结应该是一个Page {@link com.github.pagehelper.Page}
  51. * 进行一次强制转换就能获取到 total、pageNo、pageSize 这些字段
  52. */
  53. PageInfo pageInfo = null;
  54. AjaxResult ajaxResult = null;
  55. // 列表数据 如果方法返回Page则直接使用 如果是AjaxResult则getData再封装
  56. Object list = null;
  57. if (result instanceof Page) {
  58. list = result;
  59. Page page = (Page) result;
  60. pageInfo = new PageInfo(page);
  61. } else if (result instanceof AjaxResult) {
  62. ajaxResult = (AjaxResult) result;
  63. Object data = ajaxResult.getData();
  64. if (data instanceof List) {
  65. list = data;
  66. pageInfo = new PageInfo((List) data);
  67. }
  68. }
  69. if (pageInfo != null) {
  70. PageResult pageResult = new PageResult(ajaxResult);
  71. pageResult.setData(list);
  72. pageResult.setPageNo(pageInfo.getPageNum());
  73. pageResult.setPageSize(pageInfo.getPageSize());
  74. pageResult.setTotal(pageInfo.getTotal());
  75. return pageResult;
  76. }
  77. return result;
  78. }
  79. }

还有注解中使用到的ServletUtils

  1. public class ServletUtils {
  2. public static HttpServletRequest getRequest() {
  3. ServletRequestAttributes requestAttributes = getRequestAttributes();
  4. return requestAttributes.getRequest();
  5. }
  6. public static ServletRequestAttributes getRequestAttributes() {
  7. RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  8. return (ServletRequestAttributes) requestAttributes;
  9. }
  10. public static Integer getParameterToInt(String parameterName, Integer defaultValue) {
  11. HttpServletRequest request = getRequest();
  12. String strValue = request.getParameter(parameterName);
  13. Integer intValue = Convert.toInt(strValue, defaultValue);
  14. return intValue;
  15. }
  16. public static Integer getParameterToInt(String parameterName) {
  17. return getParameterToInt(parameterName, null);
  18. }
  19. }

使用注解

为了避免跑题,此处就省略mybatis-plus的使用了。

需要分页就加上@Pagination注解就行了,不需要就注释掉,代码完全不需要修改

分页的时候传入pageNo和pageSize参数就可以了,如果参数名需要更改,就修改@Pagination就可以了

编写Controller类

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Autowired
  5. private IUserService userService;
  6. /**
  7. * 列出所有用户
  8. * @return
  9. */
  10. @Pagination
  11. @GetMapping("/list")
  12. public AjaxResult list(UserQueryReq query) {
  13. List<User> userList = userService.selectUserListByQuery(query);
  14. return AjaxResult.success(userList);
  15. }
  16. }

测试

使用的Postman测试查看效果

使用注解的时候

把注解注释掉

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/309890?site
推荐阅读
相关标签
  

闽ICP备14008679号