手把手教你如何玩转插件:分页插件(Pagehelper)

转自:https://blog.csdn.net/cs_hnu_scw/article/details/80718467#commentBox

情景引入:

小白:起床起床,,,快起床!!!

我:怎么怎么了,小白你到底又怎么了。。

小白:我发现在Web系统中,分页是一种很常见的功能,可是,我之前写的方法都比较麻烦,移植性不是很高,有没有什么好办法可以快速实现分页的呢?

我:确实是的,分页功能几乎在每个系统中都是存在的,它的实现也是有很多种方式的。

小白:对呀,有没有什么好方法呢?

我:这个嘛,对于分页来说的话,其实我们在复杂的系统中,有很多特别的处理,这些都是需要我们进行自定义的编写处理的。但是,如果你就想实现一种分页效果的话,我可以给你提提建议。

小白:好哟,赶紧说赶紧说!!

我:害我又没有懒觉睡,真是的。那接下来,我跟你说说用一种分页插件如何进行快速实现分页效果吧。

情景分析:

    我们在任何的系统中,分页功能是必不可少的。然而,对于这个功能如果有一种快速开发的实现方式,当然可以节省我们很多的时间了。接下来,我就给大家基于不同的环境来说说如何使用一个分页插件:pagehelper。。不过,大家可要记住了,对于不同的情况,都要认真分析场景,而不是只会套用哦。。当然,如果你想用最原始的方式实现,也是可以的,我也写了两种方法,会在讲解完后,贴到后面,如果有需要的就进行稍微查看即可(但是,不是非常理想,仅供参考)。

情景一:(SpringBoot 和 Mybatis环境)

方法一:使用pagehelper-spring-boot-starter的形式(最简单和通用的方式)

使用步骤:

(1)在pom.xml文件中引入依赖库


  
  
  1. <!-- 分页插件 -->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper-spring-boot-starter</artifactId>
  5. <version> 1.2.3</version>
  6. </dependency>

(2)在application.properties中添加分页配置


  
  
  1. # 配置pageHelper分页插件的内容
  2. pagehelper.helper-dialect=mysql
  3. pagehelper.reasonable= true
  4. pagehelper.support-methods-arguments= true
  5. pagehelper.params=count=countSql

或者在application.yml文件中添加分页配置


  
  
  1. pagehelper:
  2. helperDialect: mysql
  3. reasonable: true
  4. supportMethodsArguments: true
  5. params: count=countSql

(3)进行使用。(可以在controller层或者service层使用即可)


  
  
  1. /**
  2. * 查询所有的person内容
  3. * @return
  4. */
  5. @RequestMapping(value = "/list")
  6. public String jumpJsp(Map<String, Object> result){
  7. PageHelper.startPage( 3 , 3);
  8. List<Person> personList = personService.findPerson();
  9. //得到分页的结果对象
  10. PageInfo<Person> personPageInfo = new PageInfo<>(personList);
  11. //得到分页中的person条目对象
  12. List<Person> pageList = personPageInfo.getList();
  13. //将结果存入map进行传送
  14. result.put( "pageInfo" , pageList);
  15. return "person_list";
  16. }

解析:

(1)PageHelper.startPage(pageNum , pageSize),这个方法就是类似我们数据库操作的limit start , count

(2)得到的对象PageInfo里面包含很多的字段信息,这个可以自己看源码,非常详细

(3)如果我们只想得到分页处理之后我们的实体对象的结果,那么就调用PageInfo对象的getList()方法即可。

(4)这种配置使用的方式是最通用的方式,也就是对于环境搭建不同方式都可以利用这种使用方法。

问题:如果运行时出现,org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration': 这个错误。

解决办法:这是由于分页插件pagehelper的版本和mybatis不兼容的原因,修改分页插件的版本即可。

方法二:使用最原始的形式(SpringBoot+Mybatis配置文件的形式,也就是整合环境还是利用xml的形式搭建的,但是都是通过@configuration注解开发类)

使用步骤:

(1)在pom.xml文件中,添加分页插件的依赖(注意和第一种方法的区别)


  
  
  1. <!-- 分页插件 -->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper</artifactId>
  5. <version> 4.1.6</version>
  6. </dependency>

(2)在mybatis的配置文件中添加如下的插件


  
  
  1. <!-- 配置mybatis的分页插件PageHelper -->
  2. <plugins>
  3. <!-- com.github.pagehelper为PageHelper类所在包名 -->
  4. <plugin interceptor= "com.github.pagehelper.PageHelper">
  5. <!-- 设置数据库类型Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库 -->
  6. <property name= "dialect" value= "mysql"/>
  7. </plugin>
  8. </plugins>

(3)在controller或者service层进行使用插件


  
  
  1. /**
  2. * 查询所有的person内容
  3. * @return
  4. */
  5. @RequestMapping(value = "/list")
  6. public String jumpJsp(Map<String, Object> result){
  7. PageHelper.startPage( 1 , 5);
  8. List<Person> personList = personService.findPerson();
  9. //得到分页的结果对象
  10. PageInfo<Person> personPageInfo = new PageInfo<>(personList);
  11. //得到分页中的person条目对象
  12. List<Person> pageList = personPageInfo.getList();
  13. //将结果存入map进行传送
  14. result.put( "pageInfo" , pageList);
  15. return "person_list";
  16. }
分析:对于这种方法的话,适用于对整合环境还是通过mybatis.xml的形式,所以,这种是具有针对性的一种情况。

方法三:使用最原始的方式(SpringBoot+Mybatis搭建中,Mybatis是利用在application.properties进行设置,并且mapper文件的操作还是使用.xml形式编写的sql语句,而非mapper注解编写)

使用步骤:

(1)在pom.xml文件中添加分页插件的依赖


  
  
  1. <!-- 分页插件 -->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper</artifactId>
  5. <version> 4.1.6</version>
  6. </dependency>

(2)添加下面一个类


  
  
  1. package com.hnu.scw.config;
  2. import com.github.pagehelper.PageHelper;
  3. import org.apache.ibatis.plugin.Interceptor;
  4. import org.mybatis.spring.SqlSessionFactoryBean;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import java.util.Properties;
  8. /**
  9. * @ Author :scw
  10. * @ Date :Created in 下午 2:48 2018/6/17 0017
  11. * @ Description:用于配置分页插件的使用
  12. * @ Modified By:
  13. * @Version: $version$
  14. */
  15. @Configuration
  16. public class PgeHeplerConfig {
  17. //将分页插件注入到容器中
  18. @Bean
  19. public PageHelper pageHelper() {
  20. //分页插件
  21. PageHelper pageHelper = new PageHelper();
  22. Properties properties = new Properties();
  23. properties.setProperty( "reasonable", "true");
  24. properties.setProperty( "supportMethodsArguments", "true");
  25. properties.setProperty( "returnPageInfo", "check");
  26. properties.setProperty( "params", "count=countSql");
  27. pageHelper.setProperties(properties);
  28. //添加插件
  29. new SqlSessionFactoryBean().setPlugins( new Interceptor[]{pageHelper});
  30. return pageHelper;
  31. }
  32. }

或者如下的代码:


  
  
  1. package com.hnu.scw.config;
  2. import com.github.pagehelper.PageHelper;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import java.util.Properties;
  6. /**
  7. * @ Author :scw
  8. * @ Date :Created in 下午 2:48 2018/6/17 0017
  9. * @ Description:用于配置分页插件的使用
  10. * @ Modified By:
  11. * @Version: $version$
  12. */
  13. @Configuration
  14. public class PgeHeplerConfig {
  15. //将分页插件注入到容器中
  16. @Bean
  17. public PageHelper pageHelper() {
  18. //分页插件
  19. PageHelper pageHelper = new PageHelper();
  20. Properties properties = new Properties();
  21. properties.setProperty( "reasonable", "true");
  22. properties.setProperty( "supportMethodsArguments", "true");
  23. properties.setProperty( "helperDialect", "mysql");
  24. properties.setProperty( "params", "count=countSql");
  25. pageHelper.setProperties(properties);
  26. return pageHelper;
  27. }
  28. }

还可以直接在springboot的启动类添加下面的代码即可。(其实都一样的道理,因为上面的类都是用了@Configuration注解配置了的,也就是添加到了容器中)


  
  
  1. //将分页插件注入到容器中
  2. @Bean
  3. public PageHelper pageHelper() {
  4. //分页插件
  5. PageHelper pageHelper = new PageHelper();
  6. Properties properties = new Properties();
  7. properties.setProperty( "reasonable", "true");
  8. properties.setProperty( "supportMethodsArguments", "true");
  9. properties.setProperty( "helperDialect", "mysql");
  10. properties.setProperty( "params", "count=countSql");
  11. pageHelper.setProperties(properties);
  12. return pageHelper;
  13. }

(3)直接使用


  
  
  1. /**
  2. * 查询所有的person内容
  3. * @return
  4. */
  5. @RequestMapping(value = "/list")
  6. public String jumpJsp(Map<String, Object> result){
  7. PageHelper.startPage( 1 , 5);
  8. List<Person> personList = personService.findPerson();
  9. //得到分页的结果对象
  10. PageInfo<Person> personPageInfo = new PageInfo<>(personList);
  11. //得到分页中的person条目对象
  12. List<Person> pageList = personPageInfo.getList();
  13. //将结果存入map进行传送
  14. result.put( "pageInfo" , pageList);
  15. return "person_list";
  16. }

情景二:Spring+SpringMVC+Mybatis+Maven环境

使用步骤:(其实这个就类似情景一种的方式二,换汤不换药

(1)在pom.xml中添加分页插件的依赖


  
  
  1. <!-- 分页插件 -->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper</artifactId>
  5. <version> 4.1.6</version>
  6. </dependency>

(2)在mybatis中的配置文件SqlMapConfig.xml(这个名字是你自己搭建环境所取的,就是配置一些关于Mybatis的配置文件)添加分页插件。


  
  
  1. <!-- 配置mybatis的分页插件PageHelper -->
  2. <plugins>
  3. <!-- com.github.pagehelper为PageHelper类所在包名 -->
  4. <plugin interceptor= "com.github.pagehelper.PageHelper">
  5. <!-- 设置数据库类型Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库 -->
  6. <property name= "dialect" value= "mysql"/>
  7. </plugin>
  8. </plugins>

(3)在controller层或者service实现层中使用分页。


  
  
  1. /**
  2. * 查询所有的person内容
  3. * @return
  4. */
  5. @RequestMapping(value = "/list")
  6. public String jumpJsp(Map<String, Object> result){
  7. PageHelper.startPage( 1 , 8);
  8. List<Person> personList = personService.findPerson();
  9. //得到分页的结果对象
  10. PageInfo<Person> personPageInfo = new PageInfo<>(personList);
  11. //得到分页中的person条目对象
  12. List<Person> pageList = personPageInfo.getList();
  13. //将结果存入map进行传送
  14. result.put( "pageInfo" , pageList);
  15. return "person_list";
  16. }

总结:

(1)pagehelper插件本身就是基于Mybatis这种框架进行开发的插件。所以,主要都是针对Mybatis数据操作的架构的。

(2)上面描述了多种情况的具体配置方式,都是自身经过实际开发编写的,而且对于不同的情景,各位要理解为什么要这样,这虽然只是讲解了分页插件的使用,当遇到其他插件的时候,都可以类似进行处理。

(3)如果是用到的SSH(Spring+SpringMVC+Hibernate)或者SpringBoot+Hibernate这样的架构的时候,这个插件是无法使用的,就需要自己通过hibernate的形式进行处理,比如可以用HQL语法或者Criteria进行处理即可。毕竟,Hibernate是一种全自动化的数据库操作框架。


下面的内容,是关于原始方式实现分页效果,仅供各位进行参考(其中是通过实例来帮助大家进行分析)

实现方法一:通过自定义分页标签(JSP)

分页,这个功能,我想在很多的系统中,都有用到过吧。这已经是非常非常普通的应用功能了,所以就需要将这个功能能自定义为一个jsp标签的话,那就肯定很方便了。所以下面就说一下,如果实现这个功能。

步骤:

(1)写两个Java类,其中Page,很简单就是一个分页对象,然后NavigationTag这个就是自定义标签的核心映射类了(如果对于这个自定义标签的流程不是很清楚的话,可以看看我之前写的J2EE的知识点中的内容,都很详细介绍了)。

Page:


  
  
  1. package com.hnuscw.common.utils;
  2. import java.util.List;
  3. public class Page <T> {
  4. private int total;
  5. private int page;
  6. private int size;
  7. private List <T> rows;
  8. public int getTotal() {
  9. return total;
  10. }
  11. public void setTotal(int total) {
  12. this.total = total;
  13. }
  14. public int getPage() {
  15. return page;
  16. }
  17. public void setPage(int page) {
  18. this.page = page;
  19. }
  20. public int getSize() {
  21. return size;
  22. }
  23. public void setSize(int size) {
  24. this.size = size;
  25. }
  26. public List <T> getRows() {
  27. return rows;
  28. }
  29. public void setRows(List <T> rows) {
  30. this.rows = rows;
  31. }
  32. }

Navigation:


  
  
  1. package com.hnuscw.common.utils;
  2. import java.io.IOException;
  3. import java.util.Map;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.jsp.JspException;
  6. import javax.servlet.jsp.JspWriter;
  7. import javax.servlet.jsp.tagext.TagSupport;
  8. import org.apache.taglibs.standard.tag.common.core.UrlSupport;
  9. /**
  10. * 显示格式 上一页 1 2 3 4 5 下一页
  11. */
  12. public class NavigationTag extends TagSupport {
  13. static final long serialVersionUID = 2372405317744358833L;
  14. /**
  15. * request 中用于保存Page <E> 对象的变量名,默认为“page”
  16. */
  17. private String bean = "page";
  18. /**
  19. * 分页跳转的url地址,此属性必须
  20. */
  21. private String url = null;
  22. /**
  23. * 显示页码数量
  24. */
  25. private int number = 5;
  26. @Override
  27. public int doStartTag() throws JspException {
  28. JspWriter writer = pageContext.getOut();
  29. HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
  30. Page page = (Page)request.getAttribute(bean);
  31. if (page == null)
  32. return SKIP_BODY;
  33. url = resolveUrl(url, pageContext);
  34. try {
  35. //计算总页数
  36. int pageCount = page.getTotal() / page.getSize();
  37. if (page.getTotal() % page.getSize() > 0) {
  38. pageCount++;
  39. }
  40. writer.print(" <nav> <ul class=\"pagination\">");
  41. //显示“上一页”按钮
  42. if (page.getPage() > 1) {
  43. String preUrl = append(url, "page", page.getPage() - 1);
  44. preUrl = append(preUrl, "rows", page.getSize());
  45. writer.print(" <li> <a href=\"" + preUrl + "\">上一页 </a> </li>");
  46. } else {
  47. writer.print(" <li class=\"disabled\"> <a href=\"#\">上一页 </a> </li>");
  48. }
  49. //显示当前页码的前2页码和后两页码
  50. //若1 则 1 2 3 4 5, 若2 则 1 2 3 4 5, 若3 则1 2 3 4 5,
  51. //若4 则 2 3 4 5 6 ,若10 则 8 9 10 11 12
  52. int indexPage = (page.getPage() - 2 > 0)? page.getPage() - 2 : 1;
  53. for(int i=1; i <= number && indexPage <= pageCount; indexPage++, i++) {
  54. if( indexPage == page.getPage()) {
  55. writer.print( "< li class= \" active\"> <a href=\"#\">"+indexPage+" <span class=\"sr-only\">(current) </span> </a> </li>");
  56. continue;
  57. }
  58. String pageUrl = append(url, "page", indexPage);
  59. pageUrl = append(pageUrl, "rows", page.getSize());
  60. writer.print(" <li> <a href=\"" + pageUrl + "\">"+ indexPage +" </a> </li>");
  61. }
  62. //显示“下一页”按钮
  63. if (page.getPage() < pageCount) {
  64. String nextUrl = append(url, " page", page.getPage() + 1);
  65. nextUrl = append(nextUrl, " rows", page.getSize());
  66. writer.print("< li> <a href=\"" + nextUrl + "\">下一页 </a> </li>");
  67. } else {
  68. writer.print(" <li class=\"disabled\"> <a href=\"#\">下一页 </a> </li>");
  69. }
  70. writer.print(" </nav>");
  71. } catch (IOException e) {
  72. e.printStackTrace();
  73. }
  74. return SKIP_BODY;
  75. }
  76. private String append(String url, String key, int value) {
  77. return append(url, key, String.valueOf(value));
  78. }
  79. /**
  80. * 为url 参加参数对儿
  81. *
  82. * @param url
  83. * @param key
  84. * @param value
  85. * @return
  86. */
  87. private String append(String url, String key, String value) {
  88. if (url == null || url.trim().length() == 0) {
  89. return "";
  90. }
  91. if (url.indexOf("?") == -1) {
  92. url = url + "?" + key + "=" + value;
  93. } else {
  94. if(url.endsWith("?")) {
  95. url = url + key + "=" + value;
  96. } else {
  97. url = url + "&" + key + "=" + value;
  98. }
  99. }
  100. return url;
  101. }
  102. /**
  103. * 为url 添加翻页请求参数
  104. *
  105. * @param url
  106. * @param pageContext
  107. * @return
  108. * @throws javax.servlet.jsp.JspException
  109. */
  110. private String resolveUrl(String url, javax.servlet.jsp.PageContext pageContext) throws JspException{
  111. //UrlSupport.resolveUrl(url, context, pageContext)
  112. Map params = pageContext.getRequest().getParameterMap();
  113. for (Object key:params.keySet()) {
  114. if ("page".equals(key) || "rows".equals(key)) continue;
  115. Object value = params.get(key);
  116. if (value == null) continue;
  117. if (value.getClass().isArray()) {
  118. url = append(url, key.toString(), ((String[])value)[0]);
  119. } else if (value instanceof String) {
  120. url = append(url, key.toString(), value.toString());
  121. }
  122. }
  123. return url;
  124. }
  125. /**
  126. * @return the bean
  127. */
  128. public String getBean() {
  129. return bean;
  130. }
  131. /**
  132. * @param bean the bean to set
  133. */
  134. public void setBean(String bean) {
  135. this.bean = bean;
  136. }
  137. /**
  138. * @return the url
  139. */
  140. public String getUrl() {
  141. return url;
  142. }
  143. /**
  144. * @param url the url to set
  145. */
  146. public void setUrl(String url) {
  147. this.url = url;
  148. }
  149. public void setNumber(int number) {
  150. this.number = number;
  151. }
  152. }

(2)编写自定义标签的tld,命令为commons.tld,并且放在WEB-INF下面的tld文件下(这个文件自己创建就是了)


  
  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE taglib
  3. PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  4. "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
  5. <taglib>
  6. <tlib-version>2.0 </tlib-version>
  7. <jsp-version>1.2 </jsp-version>
  8. <short-name>common </short-name>
  9. <uri>http://hnuscw.com/common/ </uri>
  10. <display-name>Common Tag </display-name>
  11. <description>Common Tag library </description>
  12. <tag>
  13. <name>page </name>
  14. <tag-class>com.hnuscw.common.utils.NavigationTag </tag-class>
  15. <body-content>JSP </body-content>
  16. <description>create navigation for paging </description>
  17. <attribute>
  18. <name>bean </name>
  19. <rtexprvalue>true </rtexprvalue>
  20. </attribute>
  21. <attribute>
  22. <name>number </name>
  23. <rtexprvalue>true </rtexprvalue>
  24. </attribute>
  25. <attribute>
  26. <name>url </name>
  27. <required>true </required>
  28. <rtexprvalue>true </rtexprvalue>
  29. </attribute>
  30. </tag>
  31. </taglib>

(3)在jsp页面中进行使用

引入标签:

<%@ taglib prefix="hnuscw" uri="http://hnuscw.com/common/"%>
  
  
使用标签:

  
  
  1. <div class="col-md-12 text-right">
  2. <hnuscw:page url="${pageContext.request.contextPath }/customer/list.action" />
  3. </div>

测试实例:为了方便很多的使用,我这就还是用一个实际的例子还显示这个效果吧。

jsp页面:命名为:customer.jsp(当然可以不要这么多内容,自行更改即可,只是这个就相当于一个管理系统的了,所以以后只需要稍微修改就可以)


  
  
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding= "UTF-8"%>
  3. <%@ page trimDirectiveWhitespaces="true"%>
  4. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  5. <%@ taglib prefix="itcast" uri="http://itcast.cn/common/"%>
  6. <%
  7. String path = request.getContextPath();
  8. String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
  9. + path + "/";
  10. %>
  11. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  12. <html xmlns="http://www.w3.org/1999/xhtml">
  13. <head>
  14. <meta charset="utf-8">
  15. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  16. <meta name="viewport" content="width=device-width, initial-scale=1">
  17. <meta name="description" content="">
  18. <meta name="author" content="">
  19. <title>客户列表-BootCRM </title>
  20. <!-- Bootstrap Core CSS -->
  21. <link href="<%=basePath%>css/bootstrap.min.css" rel="stylesheet">
  22. <!-- MetisMenu CSS -->
  23. <link href="<%=basePath%>css/metisMenu.min.css" rel="stylesheet">
  24. <!-- DataTables CSS -->
  25. <link href="<%=basePath%>css/dataTables.bootstrap.css" rel="stylesheet">
  26. <!-- Custom CSS -->
  27. <link href="<%=basePath%>css/sb-admin-2.css" rel="stylesheet">
  28. <!-- Custom Fonts -->
  29. <link href="<%=basePath%>css/font-awesome.min.css" rel="stylesheet"
  30. type= "text/css">
  31. <link href="<%=basePath%>css/boot-crm.css" rel="stylesheet"
  32. type= "text/css">
  33. <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
  34. <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  35. <!--[if lt IE 9]>
  36. <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
  37. <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
  38. <![endif]-->
  39. </head>
  40. <body>
  41. <div id="wrapper">
  42. <!-- Navigation -->
  43. <nav class="navbar navbar-default navbar-static-top" role="navigation"
  44. style= "margin-bottom: 0">
  45. <div class="navbar-header">
  46. <button type="button" class="navbar-toggle" data-toggle="collapse"
  47. data-target= ".navbar-collapse">
  48. <span class="sr-only">Toggle navigation </span> <span
  49. class= "icon-bar"> </span> <span class="icon-bar"> </span> <span
  50. class= "icon-bar"> </span>
  51. </button>
  52. <a class="navbar-brand" href="index.html">BOOT客户管理系统 v2.0 </a>
  53. </div>
  54. <!-- /.navbar-header -->
  55. <ul class="nav navbar-top-links navbar-right">
  56. <li class="dropdown"> <a class="dropdown-toggle"
  57. data-toggle= "dropdown" href= "#"> <i class="fa fa-envelope fa-fw"> </i>
  58. <i class="fa fa-caret-down"> </i>
  59. </a>
  60. <ul class="dropdown-menu dropdown-messages">
  61. <li> <a href="#">
  62. <div>
  63. <strong>令狐冲 </strong> <span class="pull-right text-muted">
  64. <em>昨天 </em>
  65. </span>
  66. </div>
  67. <div>今天晚上向大哥找我吃饭,讨论一下去梅庄的事... </div>
  68. </a> </li>
  69. <li class="divider"> </li>
  70. <li> <a class="text-center" href="#"> <strong>查看全部消息 </strong>
  71. <i class="fa fa-angle-right"> </i>
  72. </a> </li>
  73. </ul> <!-- /.dropdown-messages --> </li>
  74. <!-- /.dropdown -->
  75. <li class="dropdown"> <a class="dropdown-toggle"
  76. data-toggle= "dropdown" href= "#"> <i class="fa fa-tasks fa-fw"> </i>
  77. <i class="fa fa-caret-down"> </i>
  78. </a>
  79. <ul class="dropdown-menu dropdown-tasks">
  80. <li> <a href="#">
  81. <div>
  82. <p>
  83. <strong>任务 1 </strong> <span class="pull-right text-muted">完成40% </span>
  84. </p>
  85. <div class="progress progress-striped active">
  86. <div class="progress-bar progress-bar-success"
  87. role= "progressbar" aria-valuenow= "40" aria-valuemin= "0"
  88. aria-valuemax= "100" style= "width: 40%">
  89. <span class="sr-only">完成40% </span>
  90. </div>
  91. </div>
  92. </div>
  93. </a> </li>
  94. <li class="divider"> </li>
  95. <li> <a href="#">
  96. <div>
  97. <p>
  98. <strong>任务 2 </strong> <span class="pull-right text-muted">完成20% </span>
  99. </p>
  100. <div class="progress progress-striped active">
  101. <div class="progress-bar progress-bar-info" role="progressbar"
  102. aria-valuenow= "20" aria-valuemin= "0" aria-valuemax= "100"
  103. style= "width: 20%">
  104. <span class="sr-only">完成20% </span>
  105. </div>
  106. </div>
  107. </div>
  108. </a> </li>
  109. <li class="divider"> </li>
  110. <li> <a class="text-center" href="#"> <strong>查看所有任务 </strong>
  111. <i class="fa fa-angle-right"> </i>
  112. </a> </li>
  113. </ul> <!-- /.dropdown-tasks --> </li>
  114. <!-- /.dropdown -->
  115. <li class="dropdown"> <a class="dropdown-toggle"
  116. data-toggle= "dropdown" href= "#"> <i class="fa fa-bell fa-fw"> </i>
  117. <i class="fa fa-caret-down"> </i>
  118. </a>
  119. <ul class="dropdown-menu dropdown-alerts">
  120. <li> <a href="#">
  121. <div>
  122. <i class="fa fa-comment fa-fw"> </i> 新回复 <span
  123. class= "pull-right text-muted small">4分钟之前 </span>
  124. </div>
  125. </a> </li>
  126. <li class="divider"> </li>
  127. <li> <a href="#">
  128. <div>
  129. <i class="fa fa-envelope fa-fw"> </i> 新消息 <span
  130. class= "pull-right text-muted small">4分钟之前 </span>
  131. </div>
  132. </a> </li>
  133. <li class="divider"> </li>
  134. <li> <a href="#">
  135. <div>
  136. <i class="fa fa-tasks fa-fw"> </i> 新任务 <span
  137. class= "pull-right text-muted small">4分钟之前 </span>
  138. </div>
  139. </a> </li>
  140. <li class="divider"> </li>
  141. <li> <a href="#">
  142. <div>
  143. <i class="fa fa-upload fa-fw"> </i> 服务器重启 <span
  144. class= "pull-right text-muted small">4分钟之前 </span>
  145. </div>
  146. </a> </li>
  147. <li class="divider"> </li>
  148. <li> <a class="text-center" href="#"> <strong>查看所有提醒 </strong>
  149. <i class="fa fa-angle-right"> </i>
  150. </a> </li>
  151. </ul> <!-- /.dropdown-alerts --> </li>
  152. <!-- /.dropdown -->
  153. <li class="dropdown"> <a class="dropdown-toggle"
  154. data-toggle= "dropdown" href= "#"> <i class="fa fa-user fa-fw"> </i>
  155. <i class="fa fa-caret-down"> </i>
  156. </a>
  157. <ul class="dropdown-menu dropdown-user">
  158. <li> <a href="#"> <i class="fa fa-user fa-fw"> </i> 用户设置 </a> </li>
  159. <li> <a href="#"> <i class="fa fa-gear fa-fw"> </i> 系统设置 </a> </li>
  160. <li class="divider"> </li>
  161. <li> <a href="login.html"> <i class="fa fa-sign-out fa-fw"> </i>
  162. 退出登录 </a> </li>
  163. </ul> <!-- /.dropdown-user --> </li>
  164. <!-- /.dropdown -->
  165. </ul>
  166. <!-- /.navbar-top-links -->
  167. <div class="navbar-default sidebar" role="navigation">
  168. <div class="sidebar-nav navbar-collapse">
  169. <ul class="nav" id="side-menu">
  170. <li class="sidebar-search">
  171. <div class="input-group custom-search-form">
  172. <input type="text" class="form-control" placeholder="查询内容...">
  173. <span class="input-group-btn">
  174. <button class="btn btn-default" type="button">
  175. <i class="fa fa-search" style="padding: 3px 0 3px 0;"> </i>
  176. </button>
  177. </span>
  178. </div> <!-- /input-group -->
  179. </li>
  180. <li> <a href="customer.action" class="active"> <i
  181. class= "fa fa-edit fa-fw"> </i> 客户管理 </a> </li>
  182. <li> <a href="salevisit.action"> <i
  183. class= "fa fa-dashboard fa-fw"> </i> 客户拜访 </a> </li>
  184. </ul>
  185. </div>
  186. <!-- /.sidebar-collapse -->
  187. </div>
  188. <!-- /.navbar-static-side --> </nav>
  189. <div id="page-wrapper">
  190. <div class="row">
  191. <div class="col-lg-12">
  192. <h1 class="page-header">客户管理 </h1>
  193. </div>
  194. <!-- /.col-lg-12 -->
  195. </div>
  196. <!-- /.row -->
  197. <div class="panel panel-default">
  198. <div class="panel-body">
  199. <form class="form-inline" action="${pageContext.request.contextPath }/customer/list.action" method="get">
  200. <div class="form-group">
  201. <label for="customerName">客户名称 </label>
  202. <input type="text" class="form-control" id="customerName" value="${custName }" name="custName">
  203. </div>
  204. <div class="form-group">
  205. <label for="customerFrom">客户来源 </label>
  206. <select class="form-control" id="customerFrom" placeholder="客户来源" name="custSource">
  207. <option value="">--请选择-- </option>
  208. <c:forEach items="${fromType}" var="item">
  209. <option value="${item.dict_id}"<c:if test="${item.dict_id == custSource}"> selected </c:if>>${item.dict_item_name } </option>
  210. </c:forEach>
  211. </select>
  212. </div>
  213. <div class="form-group">
  214. <label for="custIndustry">所属行业 </label>
  215. <select class="form-control" id="custIndustry" name="custIndustry">
  216. <option value="">--请选择-- </option>
  217. <c:forEach items="${industryType}" var="item">
  218. <option value="${item.dict_id}"<c:if test="${item.dict_id == custIndustry}"> selected </c:if>>${item.dict_item_name } </option>
  219. </c:forEach>
  220. </select>
  221. </div>
  222. <div class="form-group">
  223. <label for="custLevel">客户级别 </label>
  224. <select class="form-control" id="custLevel" name="custLevel">
  225. <option value="">--请选择-- </option>
  226. <c:forEach items="${levelType}" var="item">
  227. <option value="${item.dict_id}"<c:if test="${item.dict_id == custLevel}"> selected </c:if>>${item.dict_item_name } </option>
  228. </c:forEach>
  229. </select>
  230. </div>
  231. <button type="submit" class="btn btn-primary">查询 </button>
  232. </form>
  233. </div>
  234. </div>
  235. <div class="row">
  236. <div class="col-lg-12">
  237. <div class="panel panel-default">
  238. <div class="panel-heading">客户信息列表 </div>
  239. <!-- /.panel-heading -->
  240. <table class="table table-bordered table-striped">
  241. <thead>
  242. <tr>
  243. <th>ID </th>
  244. <th>客户名称 </th>
  245. <th>客户来源 </th>
  246. <th>客户所属行业 </th>
  247. <th>客户级别 </th>
  248. <th>固定电话 </th>
  249. <th>手机 </th>
  250. <th>操作 </th>
  251. </tr>
  252. </thead>
  253. <tbody>
  254. <c:forEach items="${page.rows}" var="row">
  255. <tr>
  256. <td>${row.cust_id} </td>
  257. <td>${row.cust_name} </td>
  258. <td>${row.cust_source} </td>
  259. <td>${row.cust_industry} </td>
  260. <td>${row.cust_level} </td>
  261. <td>${row.cust_phone} </td>
  262. <td>${row.cust_mobile} </td>
  263. <td>
  264. <a href="#" class="btn btn-primary btn-xs" data-toggle="modal" data-target="#customerEditDialog" onclick="editCustomer(${row.cust_id})">修改 </a>
  265. <a href="#" class="btn btn-danger btn-xs" onclick="deleteCustomer(${row.cust_id})">删除 </a>
  266. </td>
  267. </tr>
  268. </c:forEach>
  269. </tbody>
  270. </table>
  271. <div class="col-md-12 text-right">
  272. <itcast:page url="${pageContext.request.contextPath }/customer/list.action" />
  273. </div>
  274. <!-- /.panel-body -->
  275. </div>
  276. <!-- /.panel -->
  277. </div>
  278. <!-- /.col-lg-12 -->
  279. </div>
  280. </div>
  281. <!-- /#page-wrapper -->
  282. </div>
  283. <!-- 客户编辑对话框 -->
  284. <div class="modal fade" id="customerEditDialog" tabindex="-1" role="dialog"
  285. aria-labelledby= "myModalLabel">
  286. <div class="modal-dialog" role="document">
  287. <div class="modal-content">
  288. <div class="modal-header">
  289. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  290. <span aria-hidden="true">× </span>
  291. </button>
  292. <h4 class="modal-title" id="myModalLabel">修改客户信息 </h4>
  293. </div>
  294. <div class="modal-body">
  295. <form class="form-horizontal" id="edit_customer_form">
  296. <input type="hidden" id="edit_cust_id" name="cust_id"/>
  297. <div class="form-group">
  298. <label for="edit_customerName" class="col-sm-2 control-label">客户名称 </label>
  299. <div class="col-sm-10">
  300. <input type="text" class="form-control" id="edit_customerName" placeholder="客户名称" name="cust_name">
  301. </div>
  302. </div>
  303. <div class="form-group">
  304. <label for="edit_customerFrom" style="float:left;padding:7px 15px 0 27px;">客户来源 </label>
  305. <div class="col-sm-10">
  306. <select class="form-control" id="edit_customerFrom" placeholder="客户来源" name="cust_source">
  307. <option value="">--请选择-- </option>
  308. <c:forEach items="${fromType}" var="item">
  309. <option value="${item.dict_id}"<c:if test="${item.dict_id == custSource}"> selected </c:if>>${item.dict_item_name } </option>
  310. </c:forEach>
  311. </select>
  312. </div>
  313. </div>
  314. <div class="form-group">
  315. <label for="edit_custIndustry" style="float:left;padding:7px 15px 0 27px;">所属行业 </label>
  316. <div class="col-sm-10">
  317. <select class="form-control" id="edit_custIndustry" name="cust_industry">
  318. <option value="">--请选择-- </option>
  319. <c:forEach items="${industryType}" var="item">
  320. <option value="${item.dict_id}"<c:if test="${item.dict_id == custIndustry}"> selected </c:if>>${item.dict_item_name } </option>
  321. </c:forEach>
  322. </select>
  323. </div>
  324. </div>
  325. <div class="form-group">
  326. <label for="edit_custLevel" style="float:left;padding:7px 15px 0 27px;">客户级别 </label>
  327. <div class="col-sm-10">
  328. <select class="form-control" id="edit_custLevel" name="cust_level">
  329. <option value="">--请选择-- </option>
  330. <c:forEach items="${levelType}" var="item">
  331. <option value="${item.dict_id}"<c:if test="${item.dict_id == custLevel}"> selected </c:if>>${item.dict_item_name } </option>
  332. </c:forEach>
  333. </select>
  334. </div>
  335. </div>
  336. <div class="form-group">
  337. <label for="edit_linkMan" class="col-sm-2 control-label">联系人 </label>
  338. <div class="col-sm-10">
  339. <input type="text" class="form-control" id="edit_linkMan" placeholder="联系人" name="cust_linkman">
  340. </div>
  341. </div>
  342. <div class="form-group">
  343. <label for="edit_phone" class="col-sm-2 control-label">固定电话 </label>
  344. <div class="col-sm-10">
  345. <input type="text" class="form-control" id="edit_phone" placeholder="固定电话" name="cust_phone">
  346. </div>
  347. </div>
  348. <div class="form-group">
  349. <label for="edit_mobile" class="col-sm-2 control-label">移动电话 </label>
  350. <div class="col-sm-10">
  351. <input type="text" class="form-control" id="edit_mobile" placeholder="移动电话" name="cust_mobile">
  352. </div>
  353. </div>
  354. <div class="form-group">
  355. <label for="edit_zipcode" class="col-sm-2 control-label">邮政编码 </label>
  356. <div class="col-sm-10">
  357. <input type="text" class="form-control" id="edit_zipcode" placeholder="邮政编码" name="cust_zipcode">
  358. </div>
  359. </div>
  360. <div class="form-group">
  361. <label for="edit_address" class="col-sm-2 control-label">联系地址 </label>
  362. <div class="col-sm-10">
  363. <input type="text" class="form-control" id="edit_address" placeholder="联系地址" name="cust_address">
  364. </div>
  365. </div>
  366. </form>
  367. </div>
  368. <div class="modal-footer">
  369. <button type="button" class="btn btn-default" data-dismiss="modal">关闭 </button>
  370. <button type="button" class="btn btn-primary" onclick="updateCustomer()">保存修改 </button>
  371. </div>
  372. </div>
  373. </div>
  374. </div>
  375. <!-- /#wrapper -->
  376. <!-- jQuery -->
  377. <script src="<%=basePath%>js/jquery.min.js"> </script>
  378. <!-- Bootstrap Core JavaScript -->
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值