【前言】
本文主要针对上一篇mybatis分页器实现一个不够合理的地方进行了优化。
原文链接 http://duanhengbin.iteye.com/blog/1998017
=================================================================================
今天研究了一下@RequestMapping 的文档,spring 提供了极其丰富的入参选择,利用HttpServletRequest 实现了一个简化 分页框架的方法。
先来看一下简化结果
【改造前】
@RequestMapping(value = "/user/users") public String list( @RequestParam(required = false, defaultValue = "1") int pageNo, @RequestParam(required = false, defaultValue = "5") int pageSize, @ModelAttribute("name") String name, @ModelAttribute("levelId") String levelId, @ModelAttribute("subjectId") String subjectId, Model model) { // 这里是“信使”诞生之地,一出生就加载了很多重要信息! Page page = Page.newBuilder(pageNo, pageSize, "users"); page.getParams().put("name", name); //这里再保存查询条件 page.getParams().put("levelId", levelId); page.getParams().put("subjectId", subjectId); model.addAttribute("users",userService.selectByNameLevelSubject( name, levelId, subjectId, page)); model.addAttribute("page", page); //这里将page返回前台 return USER_LIST_JSP; }
【改造后】
@RequestMapping(value = "/user/users") public String list( @ModelAttribute("name") String name, @ModelAttribute("levelId") String levelId, @ModelAttribute("subjectId") String subjectId, Model model, HttpServletRequest request) { Page page = Page.newBuilder2(5, request); // 第一个参数为每页行数 model.addAttribute("users",userService.selectByNameLevelSubject( name, levelId, subjectId, page)); model.addAttribute("page", page); //这里将page返回前台 return USER_LIST_JSP; }
newBuilder2()的结构要简洁得多,Controller入参无需再追加 pageNo 和pageSize了,也无需再将入参手动加入到page对象中,只是需要引入 HttpServletRequest对象。
另外,最大的好处在于,通用性增强了,将来请求接口发生变化时无需为分页修改代码。
现在看看 newBuilder2()的实现方法
/** * 从 HttpServletRequest 抽取请求入参来构造Page对象 */ public static Page newBuilder2(int pageSize, HttpServletRequest request){ Page page = new Page(); String uri = request.getRequestURI(); int pot= uri.lastIndexOf("/"); // 从uri中抽取右侧"/"后字符串作为的acton名 例子中对应的是 "users" page.setSearchUrl(uri.substring(pot+1)); // 这里是核心代码:遍历 request.getParameterMap() 提取请求参数,要注意数组的情况 for (Object key : request.getParameterMap().keySet()){ String[] args = request.getParameterValues(key.toString()); if (args.length>1){ page.getParamLists().put(key.toString(), convertParamArr(args,request)); }else{ page.getParams().put(key.toString(), convertIsoToUtf8(request.getParameter(key.toString()),request)); } } page.setPageSize(pageSize); // 这里是每页行数 if ( page.getParams().get("pageNo") == null ){ page.getParams().put("pageNo", "1"); // 当前页 原来缺省值设定改到了这里 }else{ page.setPageNo( Integer.parseInt(page.getParams().get("pageNo"))); // 点击分页标签时的请求 编辑totalRecord 项目(避免重复查询总记录数) page.setTotalRecord(Integer.parseInt(page.getParams().get("totalRecord"))); } return page; } /** * GET请求时,单个入参的转码处理 */ private static String convertIsoToUtf8(String strIn, HttpServletRequest request) { if (strIn == null || !request.getMethod().equalsIgnoreCase("get")) { return strIn; } try { String result = new String(strIn.getBytes("iso-8859-1"), "utf-8"); return result; } catch (UnsupportedEncodingException e) { return strIn; } } /** * GET请求时,数组型入参的转码处理 */ private static List<String> convertParamArr(String[] param, HttpServletRequest request) { List<String> list = Lists.newArrayList(); if (param != null) { for (String p : param) { String convertP = convertIsoToUtf8(p, request); if (!list.contains(convertP)) { list.add(convertP); } } } return list; }上面两个方法convertIsoToUtf8 和 convertParamArr 是为了处理Get请求时乱码问题。
相关推荐
根据读@requestmapping源码,理解实现原理后,自己写的简单的仿@requestmapping的代码,将该代码放置到自己的工程中就可以用。
SpringMVC@RequestMapping(重点)@RequestParam@PathVariable示例
前段时间项目中用到了REST风格来开发程序,但是当用POST、PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request....
springmvc之@RequestMapping的简单demo
springmvc关于@requestMapping和@requestParam的使用,详细代码,独立可用无需修改。
5.2 @RequestMapping通配符和占位符 1 @RequestMapping注解 类上指定的URL相对于应用根目录 @RequestMapping注解可以使用在控制器类和控制器类的方法上,一般情况下,类定义处的@ RequestMapping提供初步的请求映射...
02@RequestMapping映射.md
Spring MVC--2.@RequestMapping 映射请求
利用反射获取requestMapping注解的value,springMvc实现路径映射功能的逻辑
SpringMybatis项目基于@RequestMapping和RequstAttribute实现登录注册
@RequestMapping注解可以使用请求URL、请求方式、请求参数、请求头和带占位符的URL等方式来映射请求;且包括REST与HiddenHttpMethodFilter相关内容
@RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。 RequestMapping注解有六个属性(分成三类进行说明)与六个...
JSF常用注解,常见的JSF注解的使用方法及其解释。
示例代码: @Controller @RequestMapping("/people") class PersonController { @RequestMapping(method = RequestMethod.GET) public HttpEntity<PersonResource> showAll() { … } @RequestMapping(value = ...
本篇文章主要介绍了Spring MVC之@RequestMapping 详解,RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。有兴趣的可以了解一下。
弹簧 @Controller @RequestMapping @RequestParam,模型和ModelAndView Spring MVC实践
springmvc-RequestMapping 根据映射的 URL 定位具有 @RequestMapping 注释的整个类或特定处理程序方法目的 : 大多数时候,当我们不熟悉基于 spring 框架的 Web 应用程序时,我们只有一种选择来定位 Controller 类或...
性能:示例代码:@RequestMapping("/adder-service") public class AdderService { @RequestMapping("/add/{0}/{1}") public int add(@PathVariable int a, @PathVariable int b) {... } ...