小编

点击上方 \公众程序员小乐\"大众关注"大众号, 星标或置顶一起发展

每天凌晨00点00分, 第一韶光与你相约

逐日英文

jsp的el表达式分页SSM 框架实现分页和搜刮分页 JavaScript

We don't need to meet again for we are just passers by.To forget is the best commemoration for each other.

很多人不须要再见,由于只是途经而已。
遗忘便是我们给彼此最好的纪念。

逐日掏心话

走远了再转头看,很多人已经淡忘,只有很少的人牵连着我们的幸福与快乐,这才是我们真正要珍惜的地方。

来自:在路上 | 责编:乐乐

链接:blog.csdn.net/zhshulin

程序员小乐(ID:study_tech)第 659 次推文 图片来自网络

昔日回顾:你不知道的 IDEA Debug 调试小技巧!

正文

  

分页是Java Web项目常用的功能,昨天在Spring MVC中实现了大略的分页操作和搜索分页,在此记录一下。
利用的框架为(MyBatis+SpringMVC+Spring)。

首先我们须要一个分页的工具类:

1.分页

import java.io.Serializable; / 分页 / public class Page implements Serializable { private static final long serialVersionUID = -3198048449643774660L; private int pageNow = 1; // 当前页数 private int pageSize = 4; // 每页显示记录的条数 private int totalCount; // 总的记录条数 private int totalPageCount; // 总的页数 @SuppressWarnings(\"大众unused\公众) private int startPos; // 开始位置,从0开始 @SuppressWarnings(\"大众unused\"大众) private boolean hasFirst;// 是否有首页 @SuppressWarnings(\"大众unused\公众) private boolean hasPre;// 是否有前一页 @SuppressWarnings(\"大众unused\"大众) private boolean hasNext;// 是否有下一页 @SuppressWarnings(\公众unused\"大众) private boolean hasLast;// 是否有末了一页 / 通过布局函数 传入 总记录数 和 当前页 @param totalCount @param pageNow / public Page(int totalCount, int pageNow) { this.totalCount = totalCount; this.pageNow = pageNow; } / 取得总页数,总页数=总记录数/总页数 @return / public int getTotalPageCount() { totalPageCount = getTotalCount() / getPageSize(); return (totalCount % pageSize == 0) ? totalPageCount : totalPageCount + 1; } public void setTotalPageCount(int totalPageCount) { this.totalPageCount = totalPageCount; } public int getPageNow() { return pageNow; } public void setPageNow(int pageNow) { this.pageNow = pageNow; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } / 取得选择记录的初始位置 @return / public int getStartPos() { return (pageNow - 1) pageSize; } public void setStartPos(int startPos) { this.startPos = startPos; } / 是否是第一页 @return / public boolean isHasFirst() { return (pageNow == 1) ? false : true; } public void setHasFirst(boolean hasFirst) { this.hasFirst = hasFirst; } / 是否有首页 @return / public boolean isHasPre() { // 如果有首页就有前一页,由于有首页就不是第一页 return isHasFirst() ? true : false; } public void setHasPre(boolean hasPre) { this.hasPre = hasPre; } / 是否有下一页 @return / public boolean isHasNext() { // 如果有尾页就有下一页,由于有尾页表明不是末了一页 return isHasLast() ? true : false; } public void setHasNext(boolean hasNext) { this.hasNext = hasNext; } / 是否有尾页 @return / public boolean isHasLast() { // 如果不是末了一页就有尾页 return (pageNow == getTotalCount()) ? false : true; } public void setHasLast(boolean hasLast) { this.hasLast = hasLast; } }

有了这个工具类后,首先编写MyBatis的XxxxMapper.xml配置文件中的SQL语句,如下:

<!-- 分页SQL语句 --> <select id=\公众selectProductsByPage\"大众 resultMap=\"大众返回值类型\"大众> select from 表名 WHERE user_id = #{userId,jdbcType=INTEGER} limit #{startPos},#{pageSize} </select> <!-- 取得记录的总数 --> <select id=\"大众getProductsCount\"大众 resultType=\"大众long\"大众> SELECT COUNT() FROM 表名 WHERE user_id = #{userId,jdbcType=INTEGER} </select>

此处我们可以看到,2个<select>须要分别传入3个和1个参数,此时在对应的DAO文件IXxxxDao中编写接口来编写对应的方法,方法名和mapper.xml中的id属性值同等:

/ 利用表明办法传入多个参数,用户产品分页,通过登任命户ID查询 @param page @param userId @return startPos},#{pageSize} / public List<Products> selectProductsByPage(@Param(value=\"大众startPos\公众) Integer startPos,@Param(value=\"大众pageSize\公众) Integer pageSize,@Param(value=\"大众userId\公众) Integer userId); / 取得产品数量信息,通过登任命户ID查询 @param userId @return / public long getProductsCount(@Param(value=\"大众userId\公众) Integer userId);

接口定义完成之后须要编写相应的业务接口和实现方法,在接口中定义这样一个方法,然后实现类中覆写一下:

/ 分页显示商品 @param request @param model @param loginUserId / void showProductsByPage(HttpServletRequest request,Model model,int loginUserId);

接下来实现类中的方法便是要调用DAO层和接管Controller传入的参数,进行业务逻辑的处理,request用来获取前端传入的参数,model用来向JSP页面返回处理结果。

@Override public void showProductsByPage(HttpServletRequest request, Model model,int loginUserId) { String pageNow = request.getParameter(\公众pageNow\"大众); Page page = null; List<ProductWithBLOBs> products = new ArrayList<ProductWithBLOBs>(); int totalCount = (int) productDao.getProductsCount(loginUserId); if (pageNow != null) { page = new Page(totalCount, Integer.parseInt(pageNow)); allProducts = this.productDao.selectProductsByPage(page.getStartPos(), page.getPageSize(), loginUserId); } else { page = new Page(totalCount, 1); allProducts = this.productDao.selectProductsByPage(page.getStartPos(), page.getPageSize(), loginUserId); } model.addAttribute(\"大众products\公众, products); model.addAttribute(\"大众page\"大众, page); }

接下来是掌握器的编写,当用户须要跳转到这个现实产品的页面时,就须要经由这个掌握器中相应方法的处理,这个处理过程便是调用业务层的方法来完成,然后返回结果到JSP动态显示,做事器端天生好页面后传给客户端(浏览器)现实,这便是一个MVC过程。

/ 初始化 “我的产品”列表 JSP页面,具有分页功能 @param request @param model @return / @RequestMapping(value = \公众映射路径\公众, method = RequestMethod.GET) public String showMyProduct(HttpServletRequest request, Model model) { // 取得SESSION中的loginUser User loginUser = (User) request.getSession().getAttribute(\"大众loginUser\"大众); // 判断SESSION是否失落效 if (loginUser == null || \"大众\"大众.equals(loginUser)) { return \"大众redirect:/\"大众; } int loginUserId = loginUser.getUserId(); //此处的productService是注入的IProductService接口的工具 this.productService.showProductsByPage(request, model, loginUserId); return \公众跳转到的JSP路径\"大众; }

JSP页面接管部分我就不写了,每个人都一样,也便是结合JSTL和EL来写,(在循环输出的时候也做了判断,如果接管的参数为空,那么输出暂无商品,只有接管的参数不为空的时候,才循环输出,利用<<c:when test=\"大众${}\"大众>结合<c:otherwise>),这里只给出分页的干系代码

<!-- 分页功能 start --> <div align=\公众center\"大众> <font size=\"大众2\"大众>共 ${page.totalPageCount} 页</font> <font size=\公众2\"大众>第 ${page.pageNow} 页</font> <a href=\"大众myProductPage?pageNow=1\公众>首页</a> <c:choose> <c:when test=\"大众${page.pageNow - 1 > 0}\公众> <a href=\公众myProductPage?pageNow=${page.pageNow - 1}\"大众>上一页</a> </c:when> <c:when test=\公众${page.pageNow - 1 <= 0}\"大众> <a href=\"大众myProductPage?pageNow=1\公众>上一页</a> </c:when> </c:choose> <c:choose> <c:when test=\"大众${page.totalPageCount==0}\公众> <a href=\"大众myProductPage?pageNow=${page.pageNow}\"大众>下一页</a> </c:when> <c:when test=\"大众${page.pageNow + 1 < page.totalPageCount}\"大众> <a href=\"大众myProductPage?pageNow=${page.pageNow + 1}\"大众>下一页</a> </c:when> <c:when test=\"大众${page.pageNow + 1 >= page.totalPageCount}\"大众> <a href=\"大众myProductPage?pageNow=${page.totalPageCount}\公众>下一页</a> </c:when> </c:choose> <c:choose> <c:when test=\公众${page.totalPageCount==0}\"大众> <a href=\"大众myProductPage?pageNow=${page.pageNow}\"大众>尾页</a> </c:when> <c:otherwise> <a href=\公众myProductPage?pageNow=${page.totalPageCount}\公众>尾页</a> </c:otherwise> </c:choose> </div> <!-- 分页功能 End -->

2.查询分页

关于查询分页,大致过程完备一样,只是第三个参数(上面是loginUserId)须要接管用户输入的参数,这样的话我们须要在掌握器中接管用户输入的这个参数(页面中的<input>利用GET办法传参)。

然后将其加入到SESSION中,即可完成查询分页(此处由于“下一页”这中超链接的缘故原由,利用了不同的JSP页面处理分页和搜索分页,暂时没找到在一个JSP页面中完成的方法,涌现了重复代码,这里的重复代码便是输出内容的那段代码,可以单独拿出去,然后用一个<include>标签加载到须要的JSP页面就可以了,这样可以避免代码重复):

这里给出掌握器的代码作为参考:

/ 通过 产品名称 查询产品 @param request @param model @return / @RequestMapping(value = \"大众映射地址\"大众, method = RequestMethod.GET) public String searchForProducts(HttpServletRequest request, Model model) { HttpSession session = request.getSession(); String param = request.getParameter(\"大众param\"大众); String condition = (String) session.getAttribute(\"大众condition\公众); //先判断SESSION中的condition是否为空 if (condition == null) { condition = new String(); session.setAttribute(\"大众condition\"大众, condition); //如果Session中的condition为空,再判断传入的参数是否为空,如果为空就跳转到搜索结果页面 if (param == null || \公众\公众.equals(param)) { return \公众private/space/ProductSearchResult\"大众; } } //如果SESSION不为空,且传入的搜索条件param不为空,那么将param赋值给condition if (param != null && !(\"大众\"大众.equals(param))) { condition = param; session.setAttribute(\"大众condition\"大众, condition); } //利用session中的condition属性值来作为查询条件 this.productService.showSearchedProductsByPage(request, model, condition); return \公众跳转的页面\"大众; }

欢迎在留言区留下你的不雅观点,一起谈论提高。
如果本日的文章让你有新的启示,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入程序员小乐技能群,在"大众年夜众号后台回答“加群”或者“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新口试题搜集

从 Spring Cloud 看一个微做事框架的「 五脏六腑 」

学界:为代码自动添加注释,让 Java 程序的阅读和开拓更高效

在 JVM 眼中 .class 文件是什么样的?值得收藏!

关注微信"大众年夜众号「程序员小乐」,收看更多精彩内容

嘿,你在看吗?