首页展示,分页,搜索功能(PageHelper)

1.首先插入相关数据
SET FOREIGN_KEY_CHECKS=0; #解除外键约束
SET FOREIGN_KEY_CHECKS=1;#设置外键约束

如果通过ajax请求获取数据

    <script language=javascript>
    $.ajax({
        type: "post",
        dataType: "json",
        url: '${ctx}/index',
        success: function (data) {

            var Data=data;
            var content = null;
            var page =null;
            for(var key in Data) {
                if(key == "page"){
                    page = Data[key];
                }
                if(key == "content"){
                    content = Data[key];
                }
            }

            if (data!=null && data != "" ) {
               $(content).each(function () {
                   var ll = this.title;
                  // alert(ll);
                  // alert(0);
                   $("#content_col").append("<div class='content-text' ><div class='author clearfix'><div>"
                       +"<a href='#' target='_blank' rel='nofollow' style='height: 35px' onclick=''>"
                       +"<img src='"+this.imgUrl+"'></a></div><a href='' target='_blank' onclick=''>"
                       +"<h2 class='author-h2'>"+this.nickName+"</h2></a></div>"
                       +"<h2>"+this.title+"</h2>"+this.content+
                       "<div style='height: 5px'></div><div class='stats'><span class='stats-vote'><i class='number'>"+this.upvote+"</i> 赞</span>"
                      +"<span class='stats-comments'><span class='dash'> · </span>"
                   +"<a href='#' class='comments' target='_blank' onclick=''>"
                       +"<i class='number'>"+this.commentNum+"</i> 评论 </a></span> </div><div style='height: 5px'></div>"
                     +"<div class='stats-buttons bar clearfix'><a><i class='icon icon-thumbs-o-up icon-2x'></i><span class='number hidden'>"+this.upvote+"</span></a>"
                       +"&nbsp;&nbsp;&nbsp;<a><i class='icon icon-thumbs-o-down icon-2x'></i><span class='number hidden'>"+this.downvote+"</span></a>&nbsp;&nbsp;&nbsp;<a><i class='icon icon-comment-alt icon-2x'></i></a>"
                       +"</div><div class='single-share'><a class='share-wechat' data-type='wechat' title='分享到微信' rel='nofollow' style='margin-left:18px;color: grey'>"
                       +"<i class='icon icon-wechat icon-2x'></i></a><a class='share-qq' data-type='qq' title='分享到QQ' rel='nofollow' style='margin-left:18px;color: grey'>"
                       +"<i class='icon icon-qq icon-2x'></i> </a><a class='share-weibo' data-type='weibo' title='分享到微博' rel='nofollow' style='margin-left:18px;color: grey'>"
                       +"<i class='icon icon-weibo icon-2x'></i></a></div><br/>&nbsp;<div class='single-clear'></div></div>"
                       +"<div style='position: absolute;width:900px;background-color: #EBEBEB;height: 10px;left: 0px'></div>"
                   );

               });

                var cnt = "<ul class='pager pager-loose'>";
                if(page.pageNum <= 1){
                    cnt += "<li><a href='javascript:void(0);'>« 上一页</a></li>";
                }else {
                    var pNum = page.pageNum-1;
                    cnt += "<li class='previous'><a href='${ctx}/index_list?pageNum="+pNum+"&&id=${user.id}'>« 上一页</a></li>";
                }
                for(var i=1;i<=page.pages;i++){
                    if(page.pageNum == i){
                     cnt += "<li class='active'><a href='javascript:void(0);'>"+i+"</a></li>";
                    }else{
                        cnt += "<li ><a href='${ctx}/index_list?pageNum="+i+"&&id=${user.id}'>"+i+"</a></li>";
                    }
                }

                if(page.pageNum >= page.pages){
                    cnt += "<li><a href='javascript:void(0);'>下一页 »</a></li>";
                }else {
                    var pNum = page.pageNum+1;
                    cnt += "<li><a href='${ctx}/index_list?pageNum="+pNum+"&&id=${user.id}'>下一页 »</a></li></ul>";
                }

               //分页
                $("#page-info").append(cnt);

            }
        }
    });
    </script>

主要是通过 AJAX 获取数据后再添加到 div 中,这样只是解决了 index 页面的首次正常访问,有动态数据,但当点击下一页的时候就会产生新问题。这时可以新建一个和 index.jsp 一样的页面 index2.jsp,只不过这次不是用 AJAX 从后台获取数据,而是通过点击下一页或者其他页码,先经过 Controller,将分页数据封装后返回到 index2.jsp。这样做费时费力还耗资源,所以也不可取。

推荐的解决办法是:在进入 index.jsp 之前进行过滤器拦截,先获取页面数据,之后再返回 index.jsp 页面。

编写PageHelper 这是mybatis的工具类

package com.lianwei.common;

import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.apache.ibatis.scripting.defaults.DefaultParameterHandler;
import org.apache.log4j.Logger;

import java.io.Serializable;
import java.sql.*;
import java.util.List;
import java.util.Properties;

/**
 * Mybatis+Mysql 分页工具类
 */
@Intercepts({
        @Signature(type = StatementHandler.class, method = "prepare", args = {
                Connection.class}),
        @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {
                Statement.class})})
public class PageHelper implements Interceptor {
    private static final Logger logger = Logger.getLogger(PageHelper.class);

    public static final ThreadLocal<Page> localPage = new ThreadLocal<Page>();

    /**
     * 开始分页
     * 
     * @param pageNum
     * @param pageSize
     */
    public static void startPage(Integer pageNum, Integer pageSize) {
        System.out.println("pageNumc:" + pageNum);
        localPage.set(new Page(pageNum, pageSize));
    }

    /**
     * 结束分页并返回结果,该方法必须被调用,否则localPage会一直保存下去,直到下一次startPage
     * 
     * @return
     */
    public static Page endPage() {
        Page page = localPage.get();
        localPage.remove();
        return page;
    }

    //@Override
    public Object intercept(Invocation invocation) throws Throwable {
        if (localPage.get() == null) {
            return invocation.proceed();
        }
        if (invocation.getTarget() instanceof StatementHandler) {
            StatementHandler statementHandler = (StatementHandler) invocation
                    .getTarget();
            MetaObject metaStatementHandler = SystemMetaObject
                    .forObject(statementHandler);
            // 分离代理对象链(由于目标类可能被多个拦截器拦截,从而形成多次代理,通过下面的两次循环
            // 可以分离出最原始的的目标类)
            while (metaStatementHandler.hasGetter("h")) {
                Object object = metaStatementHandler.getValue("h");
                metaStatementHandler = SystemMetaObject.forObject(object);
            }
            // 分离最后一个代理对象的目标类
            while (metaStatementHandler.hasGetter("target")) {
                Object object = metaStatementHandler.getValue("target");
                metaStatementHandler = SystemMetaObject.forObject(object);
            }
            MappedStatement mappedStatement = (MappedStatement) metaStatementHandler
                    .getValue("delegate.mappedStatement");
            // 分页信息if (localPage.get() != null) {
            Page page = localPage.get();
            BoundSql boundSql = (BoundSql) metaStatementHandler
                    .getValue("delegate.boundSql");
            // 分页参数作为参数对象parameterObject的一个属性
            String sql = boundSql.getSql();

            Connection connection = (Connection) invocation.getArgs()[0];
            // 重设分页参数里的总页数等
            setPageParameter(sql, connection, mappedStatement, boundSql, page);

            System.out.println("total:" + page.getPages());

            // 如果当前页大于总页数,则等于总页数
            if (page.getPageNum() > page.getPages()) {
                page.setPageNum(page.getPages());
            }

            // 重写sql
            String pageSql = buildPageSql(sql, page);
            System.out.println("sql::::" + pageSql);

            // 重写分页sql
            metaStatementHandler.setValue("delegate.boundSql.sql", pageSql);

            // 将执行权交给下一个拦截器
            return invocation.proceed();
        } else if (invocation.getTarget() instanceof ResultSetHandler) {
            Object result = invocation.proceed();
            Page page = localPage.get();
            page.setResult((List) result);
            return result;
        }
        return null;
    }

    /**
     * 只拦截这两种类型的 <br>
     * StatementHandler <br>
     * ResultSetHandler
     * 
     * @param target
     * @return
     */
    //@Override
    public Object plugin(Object target) {
        if (target instanceof StatementHandler
                || target instanceof ResultSetHandler) {
            return Plugin.wrap(target, this);
        } else {
            return target;
        }
    }

    //@Override
    public void setProperties(Properties properties) {

    }

    /**
     * 修改原SQL为分页SQL
     * 
     * @param sql
     * @param page
     * @return
     */
    private String buildPageSql(String sql, Page page) {
        StringBuilder pageSql = new StringBuilder(200);
        pageSql.append(sql);
        pageSql.append(" limit ").append(page.getStartRow());
        pageSql.append(" , ").append(page.getPageSize());
        return pageSql.toString();
    }

    /**
     * 获取总记录数
     * 
     * @param sql
     * @param connection
     * @param mappedStatement
     * @param boundSql
     * @param page
     */
    private void setPageParameter(String sql, Connection connection,
            MappedStatement mappedStatement, BoundSql boundSql, Page page) {
        // 记录总记录数
        String countSql = "select count(0) from (" + sql + ") as total";
        PreparedStatement countStmt = null;
        ResultSet rs = null;
        try {
            countStmt = connection.prepareStatement(countSql);
            BoundSql countBS = new BoundSql(mappedStatement.getConfiguration(),
                    countSql, boundSql.getParameterMappings(),
                    boundSql.getParameterObject());

            //
            for (ParameterMapping parameterMapping : boundSql
                    .getParameterMappings()) {
                String property = parameterMapping.getProperty();
                if (boundSql.hasAdditionalParameter(property)) {
                    countBS.setAdditionalParameter(property,
                            boundSql.getAdditionalParameter(property));
                }
            }
            //

            setParameters(countStmt, mappedStatement, countBS,
                    boundSql.getParameterObject());
            rs = countStmt.executeQuery();
            int totalCount = 0;
            if (rs.next()) {
                totalCount = rs.getInt(1);
            }
            page.setTotal(totalCount);

        } catch (SQLException e) {
            logger.error("Ignore this exception", e);
        } finally {
            try {
                if (rs != null)
                    rs.close();
            } catch (SQLException e) {
                logger.error("Ignore this exception", e);
            }
            try {
                countStmt.close();
            } catch (SQLException e) {
                logger.error("Ignore this exception", e);
            }
        }
    }

    /**
     * 代入参数值
     * 
     * @param ps
     * @param mappedStatement
     * @param boundSql
     * @param parameterObject
     * @throws SQLException
     */
    private void setParameters(PreparedStatement ps,
            MappedStatement mappedStatement, BoundSql boundSql,
            Object parameterObject) throws SQLException {

        ParameterHandler parameterHandler = new DefaultParameterHandler(
                mappedStatement, parameterObject, boundSql);
        parameterHandler.setParameters(ps);
    }

    /**
     * 分页对象,里面包括分页信息和数据结果
     */
    public static class Page<E> implements Serializable {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        private int pageNum;
        private int pageSize;
        private int startRow;
        private int endRow;
        private long total;
        private int pages;
        private List<E> result;

        public Page(Integer pageNum, Integer pageSize) {
            if (pageNum == null || pageNum < 1) {
                pageNum = 1;
            }
            if (pageSize == null || pageSize < 1) {
                pageSize = 7;
            }
            this.pageNum = pageNum;
            this.pageSize = pageSize;
        }



        public List<E> getResult() {
            return result;
        }

        public void setResult(List<E> result) {
            this.result = result;
        }

        public int getPages() {
            // 计算总页数
            long totalPage = this.getTotal() / this.getPageSize()
                    + ((this.getTotal() % this.getPageSize() == 0) ? 0 : 1);
            this.setPages((int) totalPage);
            return pages;
        }

        public void setPages(int pages) {
            this.pages = pages;
        }

        public int getEndRow() {
            this.endRow = pageNum * pageSize;
            return endRow;
        }

        public void setEndRow(int endRow) {
            this.endRow = endRow;
        }

        public int getPageNum() {
            return pageNum;
        }

        public void setPageNum(int pageNum) {
            this.pageNum = pageNum;
        }

        public int getPageSize() {
            return pageSize;
        }

        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }

        public int getStartRow() {
            this.startRow = this.pageNum > 0
                    ? (this.pageNum - 1) * this.pageSize
                    : 0;
            return startRow;
        }

        public void setStartRow(int startRow) {
            this.startRow = startRow;
        }

        public long getTotal() {
            return total;
        }

        private int startPage;//开始页码(按钮上的数字)
        private int endPage;//结束页码(按钮上的数字)

        public int getStartPage() {
            return startPage;
        }

        public void setStartPage(int startPage) {
            this.startPage = startPage;
        }

        public int getEndPage() {
            return endPage;
        }

        public void setEndPage(int endPage) {
            this.endPage = endPage;
        }
        public void setTotal(long total) {
            //计算总页码数:
            int totalCount = Integer.parseInt(total+"");
            pages=(totalCount+pageSize-1)/pageSize;
            //计算页面的页码中“显示”的起始页码和结束页码
            //一般显示的页码较好的效果是最多显示10个页码
            //算法是前5后4,不足补10
            //计算显示的起始页码(根据当前页码计算):当前页码-5
            startPage = pageNum - 5;
            if(startPage < 1){
                startPage = 1;//页码修复
            }

            //计算显示的结束页码(根据开始页码计算):开始页码+9
            endPage = startPage + 9;
            if(endPage > pages){//页码修复
                endPage = pages;
            }

            //起始页面重新计算(根据结束页码计算):结束页码-9
            startPage = endPage - 9;
            if(startPage < 1){
                startPage = 1;//页码修复
            }

            System.out.println(startPage +"和" +endPage);

            this.total = total;
        }

        @Override
        public String toString() {
            return "Page{" + "pageNum=" + pageNum + ", pageSize=" + pageSize
                    + ", startRow=" + startRow + ", endRow=" + endRow
                    + ", total=" + total + ", pages=" + pages + '}';
        }
    }
}
    <!--自定义过滤器-->
      <filter>
        <filter-name>dispatcherDemoFilter</filter-name>
        <filter-class>com.lianwei.interceptor.IndexJspFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>dispatcherDemoFilter</filter-name>
        <url-pattern>/index.jsp</url-pattern>
      </filter-mapping>
    
```
2.编写过滤器类  IndexJspFilter.java
```
package com.lianwei.interceptor;
import com.lianwei.common.PageHelper;
import com.lianwei.common.PageHelper.Page;
import com.lianwei.dao.UserContentMapper;
import com.lianwei.entity.UserContent;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;


public class IndexJspFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }



    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("===========自定义过滤器==========");
        HttpServletRequest servletRequest = (HttpServletRequest) request;
     ServletContext   context = servletRequest.getSession().getServletContext();
        System.out.println("context:"+context);
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
        UserContentMapper userContentMapper = ctx.getBean(UserContentMapper.class);
        PageHelper.startPage(null, null);//开始分页
        List<UserContent> list =  userContentMapper.findAll();
        System.out.println("list:"+list);
        PageHelper.Page endPage = PageHelper.endPage();//分页结束
        System.out.println("endPage:"+endPage);
        request.setAttribute("page", endPage );

        chain.doFilter(request, response);
    }

    public void destroy() {

    }
}

```

在mybatis-config中记得加上

<!-- 自定义分页插件 -->
        <plugin interceptor="com.lianwei.common.PageHelper"></plugin>

UserContentMapper

//无搜索查询
    List<UserContent> findAll();
//模糊查询
List<UserContent> findAllByNumQuery( String content);

UserContentMapper.xml

<select id="findAll" resultMap="ResultMapWithBLOBs"  >
    select
    <include refid="Base_Column_List" />
    ,
    <include refid="Blob_Column_List" />
    from user_content
  </select>
  <select id="findAllByNumQuery"  resultMap="ResultMapWithBLOBs" >
    select
    <include refid="Base_Column_List" />
    ,
    <include refid="Blob_Column_List" />
    from user_content
    where
    <if test="_parameter!=null">
      concat(id, uid, title, category, personal, rpttime, imgurl, nickname, upvote, downvote,
      commentnum) like  "%${_parameter}%"
    </if>
  </select>

UserContentService

    List<UserContent> findAll();
    List<UserContent> findAllByNumQuery(String keyword);
     Page<UserContent> findAllByNum(Integer pageNum, Integer pageSize);

    Page<UserContent> findAllByNumQuery1(String content, Integer pageNum, Integer pageSize);


UserContentServiceImpl

package com.lianwei.service.impl;



import com.lianwei.common.PageHelper;
import com.lianwei.common.PageHelper.Page;
import com.lianwei.dao.UserContentMapper;
import com.lianwei.entity.UserContent;
import com.lianwei.service.UserContentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserContentServiceImpl implements UserContentService {
    @Autowired
    private UserContentMapper userContentMapper;
    public List<UserContent> findAll() {
        return userContentMapper.findAll();
    }

    public Page<UserContent> findAllByNum(Integer pageNum, Integer pageSize) {
        //分页查询
        System.out.println("第"+pageNum+"页");
        System.out.println("每页显示:"+pageSize+"条");
       /* 这个逻辑也挺简单,就是首先传参数开始分页,然后将数据查询出来,
       * 最后结束分页,返回endPage
       * */
        PageHelper.startPage(pageNum, pageSize);//开始分页
        List<UserContent> list =  userContentMapper.findAll();

        Page endPage = PageHelper.endPage();//分页结束
       // List<UserContent> result = endPage.getResult();
       // System.out.println("result:"+result);
        return endPage;
    }

    public Page<UserContent> findAllByNumQuery1(String content, Integer pageNum, Integer pageSize) {
        //分页查询
        System.out.println("第"+pageNum+"页");
        System.out.println("每页显示:"+pageSize+"条");
        /* 这个逻辑也挺简单,就是首先传参数开始分页,然后将数据查询出来,
         * 最后结束分页,返回endPage
         * */
        PageHelper.startPage(pageNum, pageSize);//开始分页

        List<UserContent> list =  userContentMapper.findAllByNumQuery(content);
        System.out.println("list:"+list);
        Page endPage = PageHelper.endPage();//分页结束 返回的是endPage
        // List<UserContent> result = endPage.getResult();
        // System.out.println("result:"+result);
        return endPage;
    }

    public List<UserContent> findAllByNumQuery(String keyword) {
        return userContentMapper.findAllByNumQuery(keyword);
    }

    //模糊查询



}

IndexJspController

package com.lianwei.controller;


import com.lianwei.common.PageHelper;
import com.lianwei.common.PageHelper.Page;
import com.lianwei.entity.User;
import com.lianwei.entity.UserContent;
import com.lianwei.service.UserContentService;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.annotation.Resource;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

@Controller
public class IndexJspController extends BaseController {
    private final static Logger log = Logger.getLogger(IndexJspController.class);
@Resource
UserContentService userContentService;
    @RequestMapping("/index_list")
    public String findAllList(Model model, @RequestParam(value = "id",required = false) String id ,
                              @RequestParam(value = "pageNum",required = false) Integer pageNum ,
                              @RequestParam(value = "pageSize",required = false) Integer pageSize,
                              @RequestParam(value = "keyword",required = false) String keyword,
                              HttpServletRequest request) {

        log.info( "===========进入index_list=========" );
        System.out.println("pageNum:"+pageNum);
        System.out.println("pageSize:"+pageSize);
        System.out.println("keyword:"+keyword);
        String keywords = keyword;
        System.out.println("keywords:"+keywords);
        User user = (User) request.getSession().getAttribute("user");
        if(user!=null){
            model.addAttribute( "user",user );
        }
        if(StringUtils.isNotBlank(keywords)){
            Page<UserContent> page =findAllByQuerys(keywords,pageNum,pageSize);
            System.out.println("page:"+page);
            model.addAttribute("keyword", keywords);
            model.addAttribute("page", page);
        }else{
            Page<UserContent> page =  findAll(pageNum,pageSize);
            System.out.println("page:"+page);
            model.addAttribute( "page",page );
        }


        return "../index";
}

}





BaseController

package com.lianwei.controller;


import com.lianwei.common.PageHelper.Page;
import com.lianwei.entity.OpenUser;
import com.lianwei.entity.User;
import com.lianwei.entity.UserContent;
import com.lianwei.service.UserContentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

@Component
public class BaseController {
    @Resource
    private UserContentService userContentService;
    /**
     * 获取当前用户
     * @return
     */
    public User getCurrentUser(){
        User user = null;
        Authentication authentication = null;
        SecurityContext context = SecurityContextHolder.getContext();
        if(context!=null){
            authentication = context.getAuthentication();
        }
        if(authentication!=null){
            Object principal = authentication.getPrincipal();
            if(principal instanceof OpenUser){
                user = ((OpenUser) principal).getUser();
            }else if(authentication.getPrincipal().toString().equals( "anonymousUser" )){
                //如果是匿名用户
                return null;
            }else {
                user = (User)principal;
            }

        }
        return user;
    }
    public Page<UserContent> findAll(Integer pageNum, Integer pageSize){
        Page<UserContent> page = userContentService.findAllByNum(pageNum ,pageSize);
        return page;
    }
    public Page<UserContent> findAllByQuerys(String content,Integer pageNum, Integer pageSize){
        Page<UserContent> page = userContentService.findAllByNumQuery1(content,pageNum ,pageSize);
        System.out.println("page:"+page);
        return page;
    }
}

后台主要代码编写完毕

前台index页面关于分页代码

搜索

  <form method="post" action="${ctx}/index_list"  id="indexSearchForm"  class="navbar-form navbar-right" role="search" style="margin-top: -35px;margin-right: 10px">
            <div class="form-group">
                <input type="text" id="keyword" name="keyword" value="${keyword}" class="form-control" placeholder="搜索">
            </div>
            &nbsp; &nbsp;<i onclick="searchForm();" class="icon icon-search" style="color: white"></i>
        </form>
<script>
    function searchForm(){
        var keyword =  $("#keyword").val();
        if(keyword!=null && keyword.trim()!=""){
            $("#indexSearchForm").submit();
        }
    }
<script>

分页内容


    <div id="content" class="row-fluid">
        <div class="col-md-9"  style="background-color: white;">
            <div id="content_col" class="content-main xxlib">

                <c:forEach var="cont" items="${page.result}" varStatus="i">
                    <!-- 正文开始 -->

                    <div class="content-text">

                        <div class="author clearfix">
                            <div>
                                <a href="#" target="_blank" rel="nofollow" style="height: 35px">
                                     <img src="${cont.imgurl}">
                                </a>
                            </div>

                                <div class="author-h2">
                                    <div style="float: left;font-size: 15px;color: #9b8878">
                                        ${cont.nickname}
                                    </div>
                                    <%--上传时间--%>
                                    <div style="float: left;margin-left: 10px;color: grey;margin-top: 2px;font-size: 12px">

                                       <%-- <fmt:formatDate value="${cont.rpttime}" type="date" dateStyle="full"/>--%>
                                           <fmt:formatDate value="${cont.rpttime}"  pattern="yyyy-M-d HH:mm" />
                                    </div>
                                </div>

                        </div>


                        <h2>${cont.title}</h2>
                        <div style="padding: 0px; float: none;margin-bottom: 10px;" class="xxlib content editormd-preview-theme-dark" id="content-text_${cont.id}">${cont.content}</div>
                        <div style="height: 5px"></div>
                        <div class="stats">
                            <!-- 笑脸、评论数等 -->
                            <span class="stats-vote"><i id="${cont.id}" class="number">${cont.upvote}</i> 赞</span>
                            <span class="stats-comments">
                    <span class="dash"> · </span>
                         <a  onclick="reply(${cont.id},${cont.uid});">
                              <i class="number" id="comment_num_${cont.id}">${cont.commentnum}</i> 评论
                          </a>
                    </span>
                        </div>
                        <div style="height: 5px"></div>
                        <div class="stats-buttons bar clearfix">
                            <a style="cursor: pointer;" onclick="upvote_click(${cont.id},1);">
                                <i class="icon icon-thumbs-o-up icon-2x"></i>
                                <span class="number hidden" id="up_${cont.id}">${cont.upvote}</span>
                            </a>
                            &nbsp;
                            <a style="cursor: pointer;" onclick="upvote_click(${cont.id},-1);">
                                <i class="icon icon-thumbs-o-down icon-2x"></i>
                                <span class="number hidden" id="down_${cont.id}">${cont.downvote}</span>
                            </a>
                            &nbsp;
                            <a style="cursor: pointer;" onclick="reply(${cont.id},${cont.uid});" title="点击打开或关闭">
                                <i class="icon icon-comment-alt icon-2x"></i>
                            </a>
                        </div>
                        <div class="single-share">
                            <a class="share-wechat" data-type="wechat" title="分享到微信" rel="nofollow" style="margin-left:18px;color: grey;cursor: pointer; text-decoration:none;">
                                <i class="icon icon-wechat icon-2x"></i>
                            </a>
                            <a class="share-qq" data-type="qq" title="分享到QQ" rel="nofollow" style="margin-left:18px;color: grey;cursor: pointer; text-decoration:none;">
                                <i class="icon icon-qq icon-2x"></i>
                            </a>
                            <a  class="share-weibo" data-type="weibo" title="分享到微博" rel="nofollow" style="margin-left:18px;color: grey;cursor: pointer; text-decoration:none;">
                                <i class="icon icon-weibo icon-2x"></i>
                            </a>
                        </div>
                        <br/>
                        &nbsp;
                        <div class="commentAll" style="display:none" id="comment_reply_${cont.id}">
                            <!--评论区域 begin-->
                            <div class="reviewArea clearfix">
                                <textarea style="padding: 10px 15px 10px 15px;" id="comment_input_${cont.id}"  class="content comment-input" placeholder="输入内容&hellip;" onkeyup="keyUP(this)"></textarea>
                                <a class="plBtn" id="comment_${cont.id}" onclick="_comment(${cont.id},${user.id==null?0:user.id},${cont.uid})" style="background: #339b53;color: white;cursor: pointer;">评论</a>
                            </div>
                            <!--评论区域 end-->
                            <div class="comment-show-first" id="comment-show-${cont.id}">

                            </div>

                        </div>

                        <div class="single-clear">

                        </div>
                    </div>
                    <!-- 正文结束 -->
                    <div style="position: absolute;width:900px;background-color: #EBEBEB;height: 10px;left: 0px">
                    </div>
                </c:forEach>

            </div>





            <div id="page-info" style="position: absolute;width:900px;background-color: #EBEBEB;height: 80px;left: 0px;">
                <ul class="pager pager-loose">
                    <c:if test="${page.pageNum <= 1}">
                        <li><a href="javascript:void(0);">« 上一页</a></li>
                    </c:if>
                    <c:if test="${page.pageNum > 1}">
                        <li class="previous"><a href="${ctx}/index_list?pageNum=${page.pageNum-1}&&keyword=${keyword}">« 上一页</a></li>
                    </c:if>
                    <c:forEach begin="${page.startPage}" end="${page.endPage}" var="pn">
                        <c:if test="${page.pageNum==pn}">
                            <li class="active"><a href="javascript:void(0);">${pn}</a></li>
                        </c:if>
                        <c:if test="${page.pageNum!=pn}">
                            <li ><a href="${ctx}/index_list?pageNum=${pn}&&keyword=${keyword}">${pn}</a></li>
                        </c:if>
                    </c:forEach>

                    <c:if test="${page.pageNum>=page.pages}">
                        <li><a href="javascript:void(0);">下一页 »</a></li>
                    </c:if>
                    <c:if test="${page.pageNum<page.pages}">
                        <li><a href="${ctx}/index_list?pageNum=${page.pageNum+1}&&keyword=${keyword}">下一页 »</a></li>
                    </c:if>

                </ul>
            </div>



            <div class="foot" style="position: absolute;left: 0px;float: left;margin-top: 60px;">
                <div class="foot-nav clearfix">
                    <div class="foot-nav-col">
                        <h3>
                            关于
                        </h3>
                        <ul>
                            <li>
                                <a href="#" target="_blank" rel="nofollow">
                                    关于梦境
                                </a>
                            </li>
                            <li>
                                <a href="#" target="_blank" rel="nofollow">
                                    加入我们
                                </a>
                            </li>
                            <li>
                                <a href="#" target="_blank" rel="nofollow">
                                    联系方式
                                </a>
                            </li>
                        </ul>
                    </div>
                    <div class="foot-nav-col">
                        <h3>
                            帮助
                        </h3>
                        <ul>
                            <li>
                                <a href="#" target="_blank" rel="nofollow">
                                    在线反馈
                                </a>
                            </li>
                            <li>
                                <a href="#" target="_blank" rel="nofollow">
                                    用户协议
                                </a>
                            </li>
                            <li>
                                <a href="#" target="_blank" rel="nofollow">
                                    隐私政策
                                </a>
                            </li>
                        </ul>
                    </div>
                    <div class="foot-nav-col">
                        <h3>
                            下载
                        </h3>
                        <ul>
                            <li>
                                <a href="#"
                                   target="_blank" rel="external nofollow">
                                    Android 客户端
                                </a>
                            </li>
                            <li>
                                <a href="#" target="_blank" rel="external nofollow">
                                    iPhone 客户端
                                </a>
                            </li>
                        </ul>
                    </div>
                    <div class="foot-nav-col">
                        <h3>
                            关注
                        </h3>
                        <ul>
                            <li>
                                <a href="http://www.dreamland.wang" onMouseOut="hideImg()"  onmouseover="showImg()">
                                    微信
                                    <div id="wxImg" style="display:none;height:50px;back-ground:#f00;position:absolute;">
                                        <img src="images/dreamland.png"/><br/>
                                        手机扫描二维码关注
                                    </div>
                                    <!-- <div class="foot-wechat-tips">
                                        &lt;!&ndash; <span class="foot-wechat-icon"></span>&ndash;&gt;
                                         <span class=" icon icon-wechat icon-2x"></span>
                                         手机扫描二维码关注
                                     </div>-->
                                </a>
                            </li>
                            <li>
                                <a href="#" target="_blank" rel="external nofollow">
                                    新浪微博
                                </a>
                            </li>
                            <li>
                                <a href="http://www.dreamland.wang" target="_blank" rel="external nofollow">
                                    QQ空间
                                </a>
                            </li>
                        </ul>
                    </div>
                </div>
               <!-- rgba(60,63,65,0.31)-->
                <hr style="position: absolute;background-color: rgba(161,171,175,0.31);width: 1000px;height: 1px;left: 0px"/>
                <hr style="position: absolute;background-color: rgba(161,171,175,0.31);width: 1000px;height: 1px;left: 0px"/>
                <div class="foot-nav clearfix" style="position: absolute;left: 0px;margin-top: 40px;text-align: center">
                    <div class="foot-copyrights" style="margin-left: 200px">
                        <p>
                            互联网ICP备案:皖ICP备18007469号
                        </p>
                        <p>
                            <span>违法和不良信息举报电话:010-xxxxxxx</span>
                            <span>邮箱:dreamland_wang@163.com</span>
                        </p>
                        <p style="margin-top: 8px">&copy;www.dreamland.wang 梦境网版权所有</p>
                    </div>
                </div>
            </div>
            <!--col-md-9结束 -->
        </div>

<%--右边的天气广告内容--%>
        <div class="col-md-3" style="position:absolute;top:0px;left: 880px;width: 268px;">
            <div style="background-color: white;width: 250px;height: 440px">
                <iframe name="weather_inc" src="http://i.tianqi.com/index.php?c=code&id=82" width="250" height="440" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
            </div>

            <div style="margin-top: 20px;" onclick="goBook()">
                <img src="images/drk.jpg">
            </div>

            <div style="margin-top: 20px;background-image: url('${ctx}/images/java.jpg');cursor:pointer;" onclick="goBook()">
                <div class="ssm" style="width: 40px;height: 20px;border:1px solid #000;text-align: center">广告</div>
                <div style="padding: 1px">
                    <h3>SSM 博客系统开发实战</h3>
                    <ul style="list-style-type: none">
                        <li>
                            SSM 博客系统开发实战
                        </li>
                        <li> 王林永·Java 高级工程师,CSDN博客专栏.</li>
                        <li> ¥29.99 | 20 课</li>
                        <div class="ssm" style="float: left;width: 40px;height: 20px;border:1px solid #000;text-align: center;color: red">最新</div>
                        <div class="ssm" style="float: left;width: 40px;height: 20px;border:1px solid #000;margin-left: 5px;text-align: center;color: red">架构</div>
                        <div class="ssm" style="float: left;width: 40px;height: 20px;border:1px solid #000;margin-left: 5px;text-align: center;color: red">SSM</div>
                        <div class="ssm" style="float: left;width: 40px;height: 20px;border:1px solid #000;margin-left: 5px;text-align: center;color: red">Java</div>
                    </ul>

                </div>
                <br/>
                <div style="font-size: 10px;padding: 2px;margin-top: 2px">
                    <ul style="list-style-type: none">
                        <li>导读:为什么选择 SSM 框架开发项目</li>
                        <li>第01课:基础环境安装及Maven创建父子工程</li>
                        <li>第02课:SSM 框架的搭建</li>
                        <li>第03课:MySQL表设计及反向生成实体类</li>
                        <li>第04课:接口设计及通用 Mapper</li>
                        <li>第05课:注册(邮件激活、Ajax 异步获取)</li>
                        <li>第06课:登录之账号登录(验证码)</li>
                        <li>第07课:登录之手机快捷登录</li>
                        <li>第08课:首页展示及分页(PageHelper)</li>
                        <li>第09课:评论、回复及点赞模块</li>
                        <li>第10课:个人主页模块</li>
                        <li>第11课:博客书写页面——KindEditor </li>
                        <li>第12课:个人资料修改页面</li>
                        <li>第13课:第三方 QQ 登录及账号绑定与解除</li>
                        <li>第14课:首页搜索功能(Solr)</li>
                        <li>第15课:Spring-Security 源码解读及认证授权</li>
                        <li>第16课:Spring-Security 之手机登录认证授权</li>
                        <li>第17课:Spring-Security 之QQ登录认证授权</li>
                        <li>第18课:Linux 系统部署发布</li>
                        <li>第19课:项目总结</li>

                    </ul>
                </div>

            </div>
        </div>

    </div>

在编写过程中遇到的问题有?

mapper.xml文件中获取不到参数param1和_parameter理解不透彻,逻辑不清晰
Page<UserContent>和List<UserContent>混淆不清

分页操作在serviceImpl中实现
首先获取到当前页及每页的数量
调用PageHelper.startPage(pageNum, pageSize);//开始分页 一定要有
接着将数据查询出来
一定要将数据查询出来,然后插件才能根据所得数据完成分页
List<UserContent> list = userContentMapper.findAll(); //普通查询
List<UserContent> list = userContentMapper.findAllByNumQuery(content);//模糊查询

然后Page endPage = PageHelper.endPage();//分页结束 返回的是endPage
// List<UserContent> result = endPage.getResult();
// System.out.println("result:"+result);
//endPage:Page{pageNum=1, pageSize=7, startRow=0, endRow=0, total=25, pages=4}

endPage中有getResult()的结果,只是自定义插件没有toString出来
最后在前台页面将数据获取出来

扩展:
使用谷歌插件完成分页:
引入相关依赖
```

<!--PageHelp分页插件jar-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.2<version>
        </dependency>

逻辑跟自己定义的分页插件一样:
也是在Servic层编写Page<entity>,但是这个插件是PageInfo<entity>,
**dao层是没有Page<entity>这个接口的
dao层是没有Page<entity>这个接口的
dao层是没有Page<entity>这个接口的
之前在这老是报返回结果相关类的错误,是因为Page和List一定要搞清
**
serviceImpl层相关代码
首先PageHelper.startPage(当前页,每页的数量)
接着将数据查询出来
List<UserContent> list = userContentMapper.findAll(); //普通查询
然后封装下
PageInfo<UserContent> page = new PageInfo<UserContent>(list);

最后返回page

代码逻辑几乎一样,都要开始分页,然后将数据查询出来,只是结束方式不同,
毕竟插件代码不同。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354