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

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

如果通过ajax请求获取数据

    

主要是通过 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 localPage = new ThreadLocal();

    /**
     * 开始分页
     * 
     * @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;
    }

    /**
     * 只拦截这两种类型的 
* StatementHandler
* 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 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 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 getResult() { return result; } public void setResult(List 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 + '}'; } } }
    
      
        dispatcherDemoFilter
        com.lianwei.interceptor.IndexJspFilter
      
      
        dispatcherDemoFilter
        /index.jsp
      
    
```
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 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中记得加上


        

UserContentMapper

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

UserContentMapper.xml


  

UserContentService

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

    Page 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 findAll() {
        return userContentMapper.findAll();
    }

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

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

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

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

    public List 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 page =findAllByQuerys(keywords,pageNum,pageSize);
            System.out.println("page:"+page);
            model.addAttribute("keyword", keywords);
            model.addAttribute("page", page);
        }else{
            Page 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 findAll(Integer pageNum, Integer pageSize){
        Page page = userContentService.findAllByNum(pageNum ,pageSize);
        return page;
    }
    public Page findAllByQuerys(String content,Integer pageNum, Integer pageSize){
        Page page = userContentService.findAllByNumQuery1(content,pageNum ,pageSize);
        System.out.println("page:"+page);
        return page;
    }
}

后台主要代码编写完毕

前台index页面关于分页代码

搜索

  

                    
                    

你可能感兴趣的:(首页展示,分页,搜索功能(PageHelper))