
一般分页查询的接口都需要传入page(当前第几页),limit(限制行数)两个参数。如果框架本身没有做处理的话我们需要自己在控制层写参数去接收和处理这俩参数。如何配置基础框架,让其自动接收和处理这些参数呢?
首先我们有一个基础的配置类BasePage,这个类里面只有page,limit,index这三个属性,我们在创建其他查询参数封装类的时候要继承BasePage这个类。然后用我们自己实现的参数解析器去解析和注入这些属性,来实现自动注入的目的。
BasePage:
//分页基类
//select * from a limit #{index},#{limmit}
public class BasePage {
private Integer page;//当前页
private Integer limit;//限制行数
private int index;// 当前位置
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getLimit() {
return limit;
}
public void setLimit(Integer limit) {
this.limit = limit;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
自定义参数解析器
import java.lang.reflect.Field;
import javax.servlet.http.HttpServletRequest;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
//参数解析器
public class RequestPageHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
public boolean supportsParameter(MethodParameter methodParameter) {
//该参数的类型是否继承了BasePage类,是的话进行参数封装
return methodParameter.getParameterType().getSuperclass()==BasePage.class;
}
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
Integer p = null;
Integer l = null;
try {
p = new Integer(request.getParameter("page"));
l = new Integer(request.getParameter("limit"));
} catch (Exception e) {
e.printStackTrace();
}
Class<?> c=methodParameter.getParameterType();//参数类型
Object obj=c.newInstance();
if(p!=null) {
//注入分页参数
Field pf=c.getSuperclass().getDeclaredField("page");
pf.setAccessible(true);
pf.set(obj,p);
if(l!=null) {
Field lf=c.getSuperclass().getDeclaredField("limit");
lf.setAccessible(true);
lf.set(obj,l);
Field ifs=c.getSuperclass().getDeclaredField("index");
ifs.setAccessible(true);
ifs.set(obj,(p-1)*l);
}
}
//注入查询参数
Field[] fs=c.getDeclaredFields();
{
String param;
for(Field f:fs) {
try {
if((param=request.getParameter(f.getName()))!=null) {
Object data = null;
if(f.getType()==String.class) {
data = param;
}else if(f.getType()==Short.class || f.getType()==short.class) {
data = new Short(param);
}else if(f.getType()==Integer.class || f.getType()==int.class) {
data = new Integer(param);
}else if(f.getType()==Long.class || f.getType()==long.class) {
data = new Long(param);
}else if(f.getType()==Double.class || f.getType()==double.class) {
data = new Double(param);
}else if(f.getType()==Float.class || f.getType()==float.class) {
data = new Float(param);
}else if(f.getType()==Boolean.class || f.getType()==boolean.class) {
data = new Boolean(param);
}else if(f.getType()==Byte.class || f.getType()==byte.class) {
data = new Byte(param);
}
if(data!=null) {
f.setAccessible(true);
f.set(obj, data);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return obj;
}
}
配置参数解析器
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new RequestPageHandlerMethodArgumentResolver());
}
}
比如现在我们有一个分页接口,这个接口有一个我们定义的QueryUser参数,我们只需要让QueryUser这个类继承BasePage这个类,即可实现自动注入:
@RestController
@RequestMapping("test")
public class TestController {
//测试
@GetMapping
public Map<String,QueryUser> test(QueryUser qu){
System.out.println(qu);
Map<String, QueryUser> map=new HashMap<String, QueryUser>();
map.put("data",qu);
return map;
}
}
QueryUser
import example.test.config.BasePage;
//查询用户
public class QueryUser extends BasePage{
private Integer id;
private String userName;
private int sex;
private boolean px;
@Override
public String toString() {
return "QueryUser [id=" + id + ", userName=" + userName + ", sex=" + sex + ", px=" + px + ", getPage()="
+ getPage() + ", getLimit()=" + getLimit() + ", getIndex()=" + getIndex() + "]";
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public boolean isPx() {
return px;
}
public void setPx(boolean px) {
this.px = px;
}
}
如果你这样请求:http://localhost:8080/test?page=102&limit=1004&userName=sdfsdf&px=true&id=1231&sex=1
会发现参数已经封装好了。