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>"
+" <a><i class='icon icon-thumbs-o-down icon-2x'></i><span class='number hidden'>"+this.downvote+"</span></a> <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/> <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>
<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>
<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>
<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/>
<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="输入内容…" 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">
<!– <span class="foot-wechat-icon"></span>–>
<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">©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
代码逻辑几乎一样,都要开始分页,然后将数据查询出来,只是结束方式不同,
毕竟插件代码不同。