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页面关于分页代码
搜索