SpringMVC自定义方法参数解析器 绑定mybatis分页PageBounds类型参数

一、需求 

mybatis整合了分页插件mybatis-paginator之后,我们需要从构造一个PageBounds类传入Mapper完成分页,构造PageBounds需要一些参数,比如当前页,分页尺寸,排序字段,排序参数等。这些参数我们可以通过request.getParameter()方式获取:

 Java |  copy code |? 
1
2
 
3
    int page = null==request.getParameter("page") ? 1 : request.getParemeter("page");
4
    //.....
5
    PageBounds pageBounds = new PageBounds(page,limit);
6

也可以通过如下方式,对每个参数都通过参数绑定的形式获取:

 Java |  copy code |? 
01
02
    @RequestMapping(value={"/index.action","/list.action"})
03
    @RequiresAuthentication
04
    public String list(Model model,@RequestParam(required =false,defaultValue ="1") int page,  
05
            @RequestParam(required =false,defaultValue ="15") int limit,  
06
            @RequestParam(required =false) String sort,  
07
            @RequestParam(required =false) String dir){
08
        PageBounds pageBounds = new PageBounds(page, limit);
09
        PageList<Coupon> couponList= (PageList<Coupon>) couponService.findByPage(pageBounds);
10
        model.addAttribute("couponList", couponList);
11
        model.addAttribute("page", couponList.getPaginator());
12
        return "coupon/list";
13
    }
14

但是,一个项目中,我们会有很多这样的分类,比如:产品列表分页,订单分页分页,会员列表分页。如果我们每个模块都用上面的方式去完成PageBounds的实例化,不仅影响代码的编写效率和可读性,也会造成很多代码的重复!

所以此处,我们可以使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定,已达到自动注入PageBounds类型参数的效果:

 Java |  copy code |? 
1
    @RequestMapping(value={"/index.action","/list.action"})
2
    @RequiresAuthentication
3
    public String list(Model model,PageBounds pageBounds){
4
        PageList<Coupon> couponList= (PageList<Coupon>) couponService.findByPage(pageBounds);
5
        model.addAttribute("couponList", couponList);
6
        model.addAttribute("page", couponList.getPaginator());
7
        return "coupon/list";
8
    }

二、实现

2.1、自定义一个解析器,来解析PageBounds类型参数,代码中已注解说明:

 Java |  copy code |? 
01
package com.renyiwei.web.resolver;
02
 
03
import org.springframework.core.MethodParameter;
04
 
05
import org.springframework.web.bind.support.WebDataBinderFactory;
06
import org.springframework.web.context.request.NativeWebRequest;
07
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
08
import org.springframework.web.method.support.ModelAndViewContainer;
09
 
10
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
11
 
12
/**
13
 * 自定义PageBounds方法参数解析器
14
 * 
15
 * @author RenYiwei
16
 *
17
 */
18
public class PageBoundsMethodArgumentResolver implements HandlerMethodArgumentResolver {
19
 
20
    @Override
21
    public boolean supportsParameter(MethodParameter parameter) {
22
        // 获取参数类型
23
        Class<?> paramType = parameter.getParameterType();
24
        // 如果该参数类型是PageBounds类自身或者子类,则返回true,表示这个解析器可以解析此类型
25
        return PageBounds.class.isAssignableFrom(paramType);
26
    }
27
 
28
    @Override
29
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
30
        // 在此处通过request.getParameter()方式获取分页所需参数
31
        //获取页码 这些字段可以通过自定义注解来指定
32
        int page = null == webRequest.getParameter("page") ? 1 : new Integer(webRequest.getParameter("page"));
33
        //获取分页尺寸
34
        int limit = null == webRequest.getParameter("limit") ? 15 : new Integer(webRequest.getParameter("limit"));
35
        //创建PageBounds实例 这里还可以传入排序方式等参数,构造更完美的PageBounds实例,此处为了简洁就以简单的为例
36
        PageBounds pageBounds = new PageBounds(page,limit);
37
        // 返回PageBounds实例,这个pageBounds就会以方法形参的方式传入控制器类的方法中
38
        return pageBounds;
39
    }
40
 
41
}
42

上面的PageBounds只是简单地构造了一下,还可以参入排序方式等参数来构造更完善的实例。

另外,也可以自定义注解,注解在方法参数中,来指定参数名称,默认值等,再通过methodParameter获取注解来读取自定义的值,这里就不作介绍了。

2.2、申明自定方法参数解析器,在springmvc的配置文件中配置,我的配置文件是spring-mvc.xml:

 XML |  copy code |? 
1
2
    <mvc:annotation-driven>
3
        <mvc:argument-resolvers>
4
            <bean class="com.renyiwei.web.resolver.PageBoundsMethodArgumentResolver" />
5
        </mvc:argument-resolvers>
6
    </mvc:annotation-driven>
7

2.3、在控制器方法中指定参数为PageBounds类型,在调用service时可以直接传入:

 Java |  copy code |? 
01
02
 
03
    @RequestMapping(value={"/index.action","/list.action"})
04
    @RequiresAuthentication
05
    public String list(Model model,PageBounds pageBounds){
06
        PageList<Coupon> couponList= (PageList<Coupon>) couponService.findByPage(pageBounds);
07
        model.addAttribute("couponList", couponList);
08
        model.addAttribute("page", couponList.getPaginator());
09
        return "coupon/list";
10
    }
11

本文出自 全栈笔记 版权所有,你可以在保留原文地址:SpringMVC自定义方法参数解析器 绑定mybatis分页PageBounds类型参数 及作者的情况下到你的网站或博客。

【上一篇】
【下一篇】

您可能感兴趣的文章:

发表评论

您必须 登录 后才能发表评论。