- 浏览: 2298965 次
- 性别:
- 来自: 成都
-
文章分类
- 全部博客 (357)
- J2EE (49)
- JavaScript (40)
- Spring (19)
- Struts (5)
- CSS (8)
- Hibernate (16)
- Java (67)
- DWR (4)
- JSON (3)
- XFIRE (1)
- Tomcat (1)
- Ant (2)
- 设计模式 (2)
- 经典收藏 (2)
- JSP (10)
- Linux (0)
- WebLogic (11)
- myeclipse (13)
- Buffalo (4)
- 文件上传相关 (1)
- oracle (33)
- html (6)
- JSTL (3)
- SVN (2)
- GIT (1)
- 孙卫琴(Java网络编程精解) (1)
- DOM4J (2)
- Swing (1)
- AJAX (1)
- Eclipse (5)
- 日志组件 (3)
- PowerDesigner (1)
- Jquery (22)
- IT技术开发相关网址 (1)
- Nutz (1)
- 其它 (1)
- Velocity (3)
- WebService (1)
- MySql (2)
- Android (1)
- Maven (2)
- Quartz (11)
- Lucene (1)
- springsource (1)
- Junit (1)
- Activiti (0)
最新评论
-
yzlseu:
拼凑,没有营养
Activiti进阶—分配组任务 -
zhangsenhao:
非常赞!代码很清楚
SpringMVC3.0+MyIbatis3.0(分页示例) -
xiamw2000:
分页写得不对,应该是 : order by ${orderNa ...
SpringMVC3.0+MyIbatis3.0(分页示例) -
sheertewtw:
...
SpringMVC:上传与下载 -
kingtoon:
...
XSS之xssprotect
参考资料
1 ssh分页(多个例子)
http://useryouyou.iteye.com/blog/593954
2 ssh2分页例子
http://459104018-qq-com.iteye.com/blog/467196
3 ssh2分页
http://blog.csdn.net/shmily2038/archive/2009/12/28/5090044.aspx
注意事项:
此示例是在:Struts2.2+Spring3.1+Hibernate3.6整合(登录示例及CRUD操作)基础上加的分页功能:
http://liuzidong.iteye.com/blog/935493
实现功能:分页,排序,设置每页显示多少条,转到第多少页
调用说明:
1 导入只需要:com.liuzd.page包下的类或者将page.jar加入WEB-INF/lib下也行^_^
2 Struts2前台类实现: BaseAction父类
3 在子类方法中调用父类提供的方法:
Page page = executePage(querySql,totalCount," id desc ");
需要传递三个参数就行了: querySql(查询sql语句), totalCount(总行数),
" id desc "(排序的列名与排序方式)
4 返回分页数据
List<User> users = this.userService.getUserListByPage(page);
5 在spring配置文件中请保持有: jdbcTemplate与hibernateTemplate这二个Bean的名字,否则dbUtil类不能使用
6 具体可参见:四的说明
一 运行环境:XP+Myeclipse6.6+WebLogic92+Oracle10g
二 工程相关图片:
1 DEMO图片
2 工程代码图片
3 page.jar图片
三 此示例是在:
Struts2.2+Spring3.1+Hibernate3.6整合(登录示例及CRUD操作)基础上加的分页功能:
http://liuzidong.iteye.com/blog/935493,jar包在此页面中下载
四 关注类及页面:
1 BaseAction类(可能你在项目有其它的父类要使用,只要关注这个类中的: protected Page executePage(String querySql,Long totalCount,String columnNameDescOrAsc)方法就行了,方法中的参数不用修改,它来自于page.jsp,你可拷贝这个方法到你的父类中就实现了分页功能,分页类详见注释)
2 UserAction子类(只关注:方法:userList()中的调用方式)
3 UserDAOImpl类(关注方法:public List<User> getUserListByPage(final Page page) )
4 userList.jsp页面
在排序处:
在下面加上:
四 要关注的类与页面
1 BaseAction.java
2 UserAction.java
3 UserDAOImpl.java
5 JSP引用
五 你不需要关注的分页类与JSP页面,可在附件下载jar与源码
1 Page.java
2 PageState.java
3 PageUtil.java
4 page.jsp
额 看错额
<jsp:param name="url" value="userAction!userList.action" />
这里报了一个错,不知道为啥上面这句什么意思
/userList.jsp(65,4) Expecting "jsp:param" standard action with "name" and "value" attributes
1 ssh分页(多个例子)
http://useryouyou.iteye.com/blog/593954
2 ssh2分页例子
http://459104018-qq-com.iteye.com/blog/467196
3 ssh2分页
http://blog.csdn.net/shmily2038/archive/2009/12/28/5090044.aspx
注意事项:
此示例是在:Struts2.2+Spring3.1+Hibernate3.6整合(登录示例及CRUD操作)基础上加的分页功能:
http://liuzidong.iteye.com/blog/935493
实现功能:分页,排序,设置每页显示多少条,转到第多少页
调用说明:
1 导入只需要:com.liuzd.page包下的类或者将page.jar加入WEB-INF/lib下也行^_^
2 Struts2前台类实现: BaseAction父类
3 在子类方法中调用父类提供的方法:
Page page = executePage(querySql,totalCount," id desc ");
需要传递三个参数就行了: querySql(查询sql语句), totalCount(总行数),
" id desc "(排序的列名与排序方式)
4 返回分页数据
List<User> users = this.userService.getUserListByPage(page);
5 在spring配置文件中请保持有: jdbcTemplate与hibernateTemplate这二个Bean的名字,否则dbUtil类不能使用
6 具体可参见:四的说明
一 运行环境:XP+Myeclipse6.6+WebLogic92+Oracle10g
二 工程相关图片:
1 DEMO图片

2 工程代码图片

3 page.jar图片

三 此示例是在:
Struts2.2+Spring3.1+Hibernate3.6整合(登录示例及CRUD操作)基础上加的分页功能:
http://liuzidong.iteye.com/blog/935493,jar包在此页面中下载
四 关注类及页面:
1 BaseAction类(可能你在项目有其它的父类要使用,只要关注这个类中的: protected Page executePage(String querySql,Long totalCount,String columnNameDescOrAsc)方法就行了,方法中的参数不用修改,它来自于page.jsp,你可拷贝这个方法到你的父类中就实现了分页功能,分页类详见注释)
2 UserAction子类(只关注:方法:userList()中的调用方式)
3 UserDAOImpl类(关注方法:public List<User> getUserListByPage(final Page page) )
4 userList.jsp页面
<%@ taglib uri="/WEB-INF/c.tld" prefix="c"%> <c:set var="page" value="${sessionScope.page}" />
在排序处:
<font color='red'>${page.sortName eq "username" ? page.sortInfo :page.defaultInfo}</font>
在下面加上:
<jsp:include page="/page/page.jsp"> <jsp:param name="url" value="userAction!userList.action" /> <!-- 演示传值:要用%26 --> <jsp:param name="urlParams" value="%26age=2" /> </jsp:include>
四 要关注的类与页面
1 BaseAction.java
package com.liuzd.common; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.SessionAware; import com.liuzd.page.Page; import com.liuzd.page.PageUtil; import com.liuzd.page.PageState; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** * 基本Struts2的分页父类 * @author liuzd * @version 1.0 2011-05-12 * @since JDK1.5 * */ public class BaseAction extends ActionSupport implements SessionAware{ private static final long serialVersionUID = 1L; public void setSession(Map<String, Object> sessionMap) { } protected Map<String,Object> getMapSession(){ return (Map<String,Object>)ActionContext.getContext().getSession(); } protected Object getMapSessionGet(String key){ return getMapSession().get(key); } protected void setMapSessionPut(String key,Object value){ getMapSession().put(key, value); } /*** * 获取请求对象 * */ protected HttpServletRequest getRequest(){ return ServletActionContext.getRequest (); } /*** * 获取会话对象 * */ protected javax.servlet.http.HttpSession getSession(){ return getRequest().getSession(); } /*** * 设置请求参数 * */ protected void setRequestAttribute(String attribute,Object attrValue){ getRequest().setAttribute(attribute, attrValue); } /*** * 获取请求参数 * */ protected Object getRequestAttribute(String attribute){ return getRequest().getAttribute(attribute); } /*** * 设置Session参数与值 * */ protected void setSessionAttribute(String attribute,Object attrValue){ getSession().setAttribute(attribute, attrValue); } /*** * 获取Session参数与值 * */ protected Object getSessionAttribute(String attribute){ return getSession().getAttribute(attribute); } /** * oracel的三层分页语句 * 子类在展现数据前,进行分页计算! * @param querySql 查询的SQL语句,未进行分页 * @param totalCount 根据查询SQL获取的总条数 * @param columnNameDescOrAsc 列名+排序方式 : ID DESC or ASC */ protected Page executePage(String querySql,Long totalCount,String columnNameDescOrAsc){ String oracleSql = PageUtil.createQuerySql(querySql,columnNameDescOrAsc); if(null == totalCount){ totalCount = 0L; } /**页面状态,这个状态是分页自带的,与业务无关*/ String pageAction = getRequest().getParameter("pageAction"); String value = null; /**获取下标判断分页状态*/ int index = PageState.getOrdinal(pageAction); if(0 == index){ /**每页显示多少条*/ value = getRequest().getParameter("everyPage"); } Page page = null; /** * index < 1 只有二种状态 * 1 当首次调用时,分页状态类中没有值为 NULL 返回 -1 * 2 当页面设置每页显示多少条: index=0,当每页显示多少条时,分页类要重新计算 * */ if(index < 1){ page = PageUtil.inintPage(oracleSql,totalCount,index,value,getPage()); }else{ /** * 当页面排序时 * */ if(5 == index){ value = getRequest().getParameter("sortName"); /** * 到指定多少页 * */ }else if(6 == index){ value = getRequest().getParameter("currentPage"); } page = PageUtil.execPage(index,value,getPage()); } setSession(page); return page; } private Page getPage() { Page page = (Page)getSession().getAttribute(PageUtil.SESSION_PAGE_KEY); if(page == null){ page = new Page(); } return page; } private void setSession(Page page) { getSession().setAttribute(PageUtil.SESSION_PAGE_KEY,page); } }
2 UserAction.java
package com.liuzd.s2sh.web; import java.util.List; import javax.annotation.Resource; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import com.liuzd.common.BaseAction; import com.liuzd.common.DbUtils; import com.liuzd.page.Page; import com.liuzd.s2sh.entity.User; import com.liuzd.s2sh.service.UserService; @Component("u") @Scope("prototype") public class UserAction extends BaseAction { private static final long serialVersionUID = 1L; private String message = null; private User user = null; private String action = null; public String getAction() { return action; } public void setAction(String action) { this.action = action; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { System.out.println("user: " + user); User dbUser = this.userService.checkUserExits(user); if (null != dbUser) { message = "用户: " + user.getUsername() + "登录成功"; System.out.println(message); getMapSession().put("sessionUser", dbUser); return userList(); //return "success"; } message = "用户: " + user.getUsername() + "登录失败"; return "fail"; } public String loadUser() { action = "update"; message = "编辑用户信息"; User loadUser = new User(); loadUser.setId(user.getId()); user = this.userService.getUserByUid(loadUser); this.getRequest().setAttribute("myname", "天涯海角"); this.getMapSession().put("mysex", "男"); System.out.println("loaduser: " + user); return "user"; } public String addUser() { action = "add"; return "user"; } public String saveUser() { this.userService.addUser(user); return "user"; } public String delUser() { action = "del"; this.userService.delUser(user); return userList(); } public String editUser() { System.out.println("action: " + action + ",编辑用户: " + user); if ("update".equals(action)) { this.userService.editUser(user); } else if ("add".equals(action)) { saveUser(); } return userList(); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } private UserService userService = null; private DbUtils dbUtil = null; public String userList() { //因为Hibernate分页的性能问题,使用原生sql来解决 String querySql = "select * from users where 1=1 "; //用jdbc查询总条数 Long totalCount = getDbUtil().getCountByQuerySql(querySql); //调用父类方法进行分页参数相关计算 Page page = executePage(querySql,totalCount," id desc "); //返回分页数据 List<User> users = this.userService.getUserListByPage(page); getRequest().setAttribute("userList",users); return "userList"; } public UserService getUserService() { return userService; } @Resource public void setUserService(UserService userService) { this.userService = userService; } public DbUtils getDbUtil() { return dbUtil; } @Resource public void setDbUtil(DbUtils dbUtil) { this.dbUtil = dbUtil; } }
3 UserDAOImpl.java
package com.liuzd.s2sh.dao.impl; import java.sql.SQLException; import java.util.List; import javax.annotation.Resource; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.stereotype.Component; import com.liuzd.page.Page; import com.liuzd.s2sh.dao.UserDAO; import com.liuzd.s2sh.entity.User; @Component("userDao") public class UserDAOImpl implements UserDAO { private HibernateTemplate hibernateTemplate; public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } @Resource public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } @SuppressWarnings("unchecked") public User getUserByUserIdAndUserNameExits(User user) { List<User> users = hibernateTemplate .find("from User u where u.username = '" + user.getUsername() + "' and u.password='" + user.getPassword() + "'"); if (users != null && users.size() > 0) { return users.get(0); } return null; } public void saveUser(User user) { this.hibernateTemplate.save(user); } public void delUser(User user) { User delUser = getUser(user); this.hibernateTemplate.delete(delUser); } @SuppressWarnings("unchecked") public List<User> finUserAll() { return this.hibernateTemplate.find("from User"); } public User getUser(User user) { return this.hibernateTemplate.get(User.class, user.getId()); } public void updateUser(User user) { this.hibernateTemplate.update(user); } @SuppressWarnings("unchecked") public Long getUserCount() { List list = this.getHibernateTemplate().find("select count(*) from User"); return ((Long) list.iterator().next()); } public Long getUserCount(String querySql) { return (Long) getHibernateTemplate().find(querySql).iterator().next(); } @SuppressWarnings("unchecked") public List<User> getUserListByPage(final Page page) { return this.getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { /*Query query = session.createQuery("from User"); //性能问题所在 query.setFirstResult(page.getBeginIndex()); query.setMaxResults(page.getEveryPage()); return query.list();*/ /* .add(Restrictions.gt("id", 2)) //greater than = id > 2 .add(Restrictions.lt("id", 8)) //little than = id < 8 .add(Restrictions.like("title", "t_")) .createCriteria("category") .add(Restrictions.between("id", 3, 5)) //category.id >= 3 and category.id <=5 .add(Expression.ge("age", new Integer(20)); .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .setMaxResults(50) .list(); .add( Property.forName("name").like("F%") ) .addOrder( Property.forName("name").asc() ) .addOrder( Property.forName("age").desc() ) .setMaxResults(50) .list(); * */ /*Criteria c = session.createCriteria(User.class); String sortName = page.getSortName(); if(StringUtils.isNotEmpty(sortName)){ if("asc".equals(page.getSortState())){ c.addOrder(org.hibernate.criterion.Order.asc(sortName)); }else{ c.addOrder(org.hibernate.criterion.Order.desc(sortName)); } } c.setFirstResult(page.getBeginIndex()); c.setMaxResults(page.getEveryPage()); return c.list();*/ Query query = session.createSQLQuery(page.getQuerySql()).addEntity(User.class); return query.list(); } }); } }
5 JSP引用
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <%@ taglib uri="/WEB-INF/c.tld" prefix="c"%> <c:set var="page" value="${sessionScope.page}" /> <html> <head> <title>用户集合</title> </head> <body> <table width="60%" border="1" cellpadding="0" align="center"> <thead> <tr> <th style="cursor: hand;" title="按姓名进行排序" onclick="sortPage('username')" valign="top"> 姓名<font color='red'>${page.sortName eq "username" ? page.sortInfo : page.defaultInfo}</font> </th> <th style="cursor: hand;" title="按年龄进行排序" onclick="sortPage('age')" valign="top"> 年龄<font color='red'>${page.sortName eq "age" ? page.sortInfo : page.defaultInfo}</font> </th> <th style="cursor: hand;" title="按性别进行排序" onclick="sortPage('sex')" valign="top"> 性别<font color='red'>${page.sortName eq "sex" ? page.sortInfo : page.defaultInfo}</font> </th> <th style="cursor: hand;" title="按地址进行排序" onclick="sortPage('address')" valign="top"> 地址<font color='red'>${page.sortName eq "address" ? page.sortInfo : page.defaultInfo}</font> </th> <th style="cursor: hand;" > 操作 </th> </tr> </thead> <tbody> <!-- <s:iterator value="#request.userList" status="status" > <tr align="center"> <td><s:property value="username"/></td> <td><s:property value="age"/></td> <td><s:property value="sex"/></td> <td><s:property value="address"/></td> <td> <s:a href="userAction!addUser.action">添加</s:a> | <s:a href="userAction!loadUser.action?user.id=%{id}">编辑</s:a> | <a href="<s:url action="userAction!delUser.action"><s:param name="user.id" value="id"/></s:url>">删除</a> </td> </tr> </s:iterator> --> <c:forEach items="${requestScope.userList}" var="user"> <tr align="center"> <td> ${user.username} </td> <td> ${user.age} </td> <td> ${user.sex eq 1 ? "男" : user.sex eq 2 ? "女" : "未知"} </td> <td> ${user.address} </td> <td> <a href="${pageContext.request.contextPath}/userAction!addUser.action">添加</a> | <a href="${pageContext.request.contextPath}/userAction!loadUser.action?user.id=${user.id}">编辑</a> | <a href="${pageContext.request.contextPath}/userAction!delUser.action?user.id=${user.id}">删除</a> </td> </tr> </c:forEach> <jsp:include page="page.jsp"> <jsp:param name="url" value="userAction!userList.action" /> <!-- 演示传值:要用%26 --> <jsp:param name="urlParams" value="%26age=2" /> </jsp:include> </tbody> </table> <br> <a href="${pageContext.request.contextPath}/Login.jsp">返回</a> <br> <s:debug></s:debug> </body> </html>
五 你不需要关注的分页类与JSP页面,可在附件下载jar与源码
1 Page.java
package com.liuzd.page; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ToStringBuilder; /** * 分页类 * @author liuzd * @version 1.0 2011-05-12 * @since JDK1.5 * */ public class Page implements java.io.Serializable{ private static final long serialVersionUID = 1L; //前一页 private Boolean hasPrePage; //后一页 private Boolean hasNextPage; //每页显示多少条:默认10条 private Long everyPage = 10L; //总页数 private Long totalPage; //当前第多少页:默认第1页 private Long currentPage = 1L; //开始下标 private Long beginIndex; //结束下标 private Long endinIndex; //总共多少条 private Long totalCount; //查询结果集语句 private String querySql; //未进行分页的语句 private String initQuerySql; //排序列名 private String sortName; //排序状态 private String sortState; //排序信息 private String sortInfo; //是否排序 private Boolean sort; private String defaultInfo = " "; public String getDefaultInfo() { return defaultInfo; } public void setDefaultInfo(String defaultInfo) { this.defaultInfo = defaultInfo; } public String getSortInfo() { return sortInfo; } public void setSortInfo(String sortInfo) { this.sortInfo = sortInfo; } public String getSortName() { return sortName; } public void setSortName(String sortName) { setPageSortState(sortName); } public String getSortState() { return sortState; } public void setSortState(String sortState) { this.sortState = sortState; } public String getQuerySql() { return querySql; } public void setQuerySql(String querySql) { this.querySql = querySql; } public Page() { } /** * 常用,用于计算分页 * */ public Page(Long totalRecords){ this.totalCount = totalRecords; setTotalPage(getTotalPage(totalRecords)); } /** * 设置每页显示多少条时使用 * */ public Page(Long everyPage,Long totalRecords){ this.everyPage = everyPage; this.totalCount = totalRecords; setTotalPage(getTotalPage(totalRecords)); } /** * @param state 状态码 * @param value 到第多少页或者设置每页显示多少条或者为排序列名 */ public void pageState(int index,String value) { sort = false; switch (index) { case 0 :setEveryPage(Long.parseLong(value));break; case 1 :first();break; case 2: previous();break; case 3: next();break; case 4: last();break; case 5: sort = true;sort(value);break; case 6 ://到指定第多少页 setCurrentPage(Long.parseLong(value)); break; } } /** * 最前一页 */ private void first() { currentPage = 1L; } private void previous() { currentPage--; } private void next() { currentPage++; } private void last() { currentPage = totalPage; } private void sort(String sortName) { //设置排序状态 setPageSortState(sortName); } /** * 计算总页数 * */ private Long getTotalPage(Long totalRecords) { Long totalPage = 0L; if (totalRecords % everyPage == 0) totalPage = totalRecords / everyPage; else { totalPage = totalRecords / everyPage + 1; } return totalPage; } public Long getBeginIndex() { this.beginIndex = (currentPage - 1) * everyPage; return this.beginIndex; } public void setBeginIndex(Long beginIndex) { this.beginIndex = beginIndex; } public Long getCurrentPage() { this.currentPage = currentPage == 0 ? 1 : currentPage; return this.currentPage; } public void setCurrentPage(Long currentPage) { if(0 == currentPage){ currentPage = 1L; } this.currentPage = currentPage; } public Long getEveryPage() { this.everyPage = everyPage == 0 ? 10 : everyPage; return this.everyPage; } public void setEveryPage(Long everyPage) { this.everyPage = everyPage; } public Boolean getHasNextPage() { this.hasNextPage = (currentPage != totalPage) && (totalPage != 0); return this.hasNextPage; } public void setHasNextPage(Boolean hasNextPage) { this.hasNextPage = hasNextPage; } public Boolean getHasPrePage() { this.hasPrePage = currentPage != 1; return this.hasPrePage; } public void setHasPrePage(Boolean hasPrePage) { this.hasPrePage = hasPrePage; } public Long getTotalPage() { return this.totalPage; } public void setTotalPage(Long totalPage) { if(this.currentPage > totalPage){ this.currentPage = totalPage; } this.totalPage = totalPage; } public Long getTotalCount() { return this.totalCount; } public void setTotalCount(Long totalCount) { setTotalPage(getTotalPage(totalCount)); this.totalCount = totalCount; } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } /** * 设置排序状态 * */ private void setPageSortState(String newPageSortName){ //判断之前的排序字段是否为空 if(StringUtils.isEmpty(sortName)){ //默认排序为升序 this.sortState = PageUtil.ASC; this.sortInfo = PageUtil.PAGE_ASC; }else{ if(StringUtils.equalsIgnoreCase(newPageSortName, sortName)){ //判断sortState排序状态值 if(StringUtils.equalsIgnoreCase(sortState, PageUtil.ASC)){ this.sortState = PageUtil.DESC; this.sortInfo = PageUtil.PAGE_DESC; }else{ this.sortState = PageUtil.ASC; this.sortInfo = PageUtil.PAGE_ASC; } }else{ //默认 this.sortState = PageUtil.ASC; this.sortInfo = PageUtil.PAGE_ASC; } } sortName = newPageSortName.toLowerCase(); } public Boolean isSort() { return sort; } public void setSort(Boolean sort) { this.sort = sort; } public String getInitQuerySql() { return initQuerySql; } public void setInitQuerySql(String initQuerySql) { this.initQuerySql = initQuerySql; } public Long getEndinIndex() { this.endinIndex = (currentPage) * everyPage; return endinIndex; } public void setEndinIndex(Long endinIndex) { this.endinIndex = endinIndex; } }
2 PageState.java
package com.liuzd.page; import org.apache.commons.lang3.StringUtils; /** * 分页状态类 * @author liuzd * @version 1.0 2011-05-12 * @since JDK1.5 * */ public enum PageState { /** * 设置每页显示多少条 * */ SETPAGE, /** * 首页 * */ FIRST, /** * 向前一页 * */ PREVIOUS, /** * 向后一页 * */ NEXT, /** * 末页 * */ LAST, /** * 排序 * */ SORT, /** * 到第多少页 * */ GOPAGE; /** * @param value 索引名称 * @return 返回索引下标 */ public static int getOrdinal(String value) { int index = -1; if (StringUtils.isEmpty(value)) { return index; } String newValue = StringUtils.trim(value).toUpperCase(); try { index = valueOf(newValue).ordinal(); } catch (IllegalArgumentException e) {} return index; } }
3 PageUtil.java
package com.liuzd.page; /** * 分页工具类 * @author liuzd * @version 1.0 2011-05-12 * @since JDK1.5 * */ public class PageUtil { public static final String ASC = "asc"; public static final String DESC = "desc"; public static final String PAGE_DESC = "↓"; public static final String PAGE_ASC = "↑"; public static final String PAGE_NULL = " "; public static final String SESSION_PAGE_KEY = "page"; /** * @param querySql 查询SQL * @param beginIndex 开始下标 * @param endinIndex 结束下标 * @return */ public static String getPageQuerySql(String querySql,Long beginIndex, Long endinIndex) { if(querySql.indexOf("where rn>") != -1 && querySql.indexOf("and rn<=") != -1){ return querySql.toUpperCase(); } return new java.lang.StringBuffer().append(querySql).append(" where rn>").append(beginIndex).append(" and rn<=").append(endinIndex).toString().toUpperCase(); } /** * @param querySql 查询SQL * @param orderByName 排序列名 * @return */ @SuppressWarnings("unused") public static String createQuerySql(String querySql, String orderByName) { StringBuilder sql = new StringBuilder(); sql.append("select ttt.* from(select tt.*,rownum rn from("); sql.append(querySql); if (org.apache.commons.lang3.StringUtils.isNotEmpty(orderByName)) { sql.append(" order by ").append(orderByName); } sql.append(" )tt)ttt "); return sql.toString(); } /** * 取得排序名称+desc or asc * @param querySql 查询SQL * @return 返回查询语句 SELECT ... FROM TABLE ORDER BY ID DESC 中的 ID DESC */ public static String getSortDescOrAsc(String querySql) { /**取得ordery by之前的查询字符串*/ querySql = querySql.toUpperCase(); String temp = "ORDER BY"; int orderIndex = querySql.lastIndexOf(temp); String newsql = querySql.substring(orderIndex); String temp2 = ")"; int lastIndex = newsql.indexOf(temp2); String orderByName = newsql.substring(temp.length(),lastIndex).trim(); return orderByName; } /** * 初始化分页类 * @param initPageSql 未分页的查询SQL * @param totalCount 总行数 * @param index 分页状态 * @param value 只有在设置每页显示多少条时,值不会NULL,其它为NULL */ public static Page inintPage(String initPageSql,Long totalCount,Integer index,String value,Page sessionPage){ Page page = null; if(index < 0){ page = new Page(totalCount); }else{ /**每页显示多少条*/ Long everPage = null == value ? 10 : Long.parseLong(value); /**获取Session中的分页类,方便保存页面分页状态*/ page = sessionPage; page.setEveryPage(everPage); page.setTotalCount(totalCount); } page.setInitQuerySql(initPageSql); /**对查询SQL进行分页计算*/ String querySql = getPageQuerySql(initPageSql,page.getBeginIndex(), page.getEndinIndex()); /**真正传递到后台执行获取分页数据的sql*/ page.setQuerySql(querySql); /**保存到Session中*/ return page; } /** * 当页点击:首页,前一页,后一页,末页,排序,到第多少页时进行分页操作 * @param index 分页状态 * @param value 排序字段名或者到第多少页 */ public static Page execPage(int index,String value,Page sessionPage){ Page page = sessionPage; /**调用方法进行分页计算*/ page.pageState(index,value); /**未进行分页前的sql*/ String initPageSql = page.getInitQuerySql(); /**进行分页SQL组合*/ String querySql = getPageQuerySql(initPageSql,page.getBeginIndex(), page.getEndinIndex()); /**替换排序列名*/ if (page.isSort() == true) { String sortName = page.getSortName(); if (null != sortName) { /**获取排序状态:值(desc or asc)*/ String descAsc = page.getSortState(); /**组合新的排序字段与状态*/ String sortNameDescAsc = (" " + sortName + " " + descAsc).toUpperCase(); /**返回之前的排序字段与状态*/ String getOldSortName = PageUtil.getSortDescOrAsc(querySql); /**返回最新的排序字段与状态*/ querySql = querySql.replace(getOldSortName,sortNameDescAsc); } } page.setQuerySql(querySql); return page; } }
4 page.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/c.tld" prefix="c"%> <c:set var="page" value="${sessionScope.page}" /> <c:set var="path" value="${pageContext.request.contextPath}" /> <c:set var="url" value="${param.url}" /> <c:set var="urlParams" value="${param.urlParams}" /> <c:set var="pathurl" value="${path}/${url}" /> <tr> <td colspan="5"> 共${page.totalCount}条记录 共${page.totalPage}页 每页显示${page.everyPage}条 当前第${page.currentPage}页 <c:choose> <c:when test="${page.hasPrePage eq false}"> <<首页 <上页 </c:when> <c:otherwise> <a href="${pathurl}?&pageAction=first${urlParams}"><<首页 </a> <a href="${pathurl}?pageAction=previous${urlParams}" /><上一页</a> </c:otherwise> </c:choose> || <c:choose> <c:when test="${page.hasNextPage eq false}"> 下页> 尾页>> </c:when> <c:otherwise> <a href="${pathurl}?&pageAction=next${urlParams}">下一页> </a> <a href="${pathurl}?pageAction=last${urlParams}" />末页>></a> </c:otherwise> </c:choose> <SELECT name="indexChange" id="indexChange" onchange="getCurrentPage(this.value);"> <c:forEach var="index" begin="1" end="${page.totalPage}" step="1"> <option value="${index}" ${page.currentPage eq index ? "selected" : ""}> 第${index}页 </option> </c:forEach> </SELECT> 每页显示:<select name="everyPage" id="everyPage" onchange="setEveryPage(this.value);"> <c:forEach var="pageCount" begin="5" end="${page.totalCount}" step="5"> <option value="${pageCount}" ${page.everyPage eq pageCount ? "selected" : ""}> ${pageCount}条 </option> </c:forEach> </select> </td> </tr> <div style='display: none'> <a class=listlink id="indexPageHref" href='#'></a> </div> <script> function getCurrentPage(index){ var a = document.getElementById("indexPageHref"); a.href = '${pathurl}?pageAction=gopage¤tPage='+index+'${urlParams}'; a.setAttribute("onclick",''); a.click("return false"); } function setEveryPage(everyPage){ var a = document.getElementById("indexPageHref"); var currentPage = document.getElementById('indexChange').value; a.href = '${pathurl}?pageAction=setpage&everyPage='+everyPage+'${urlParams}'; a.setAttribute("onclick",''); a.click("return false"); } function sortPage(sortName){ var a = document.getElementById("indexPageHref"); a.href = '${pathurl}?pageAction=sort&sortName='+sortName+'${urlParams}'; a.setAttribute("onclick",''); a.click("return false"); } </script>
- page.jar (5.9 KB)
- 下载次数: 305
- page-source.zip (4.3 KB)
- 下载次数: 278
- S2SH-Page-project.zip (119.1 KB)
- 下载次数: 330
- s2sh-page-all.zip (681.5 KB)
- 下载次数: 1199
评论
6 楼
zhengxiaojunkite
2015-03-17
你好,我把你的项目导入了,Deploy到Tomcat8,但是url:http://localhost:8888/S2SH-Page/出错:
type Status report
message /S2SH-Page/
description The requested resource is not available.
你的web.xml明明已经配置了:
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
请帮我看看,多谢多谢
type Status report
message /S2SH-Page/
description The requested resource is not available.
你的web.xml明明已经配置了:
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
请帮我看看,多谢多谢


5 楼
MLGB447593134
2012-03-05
嘿嘿 ,已经可以了,下下来的文件和原本有出入,一些个空格啊 注释什么的有问题,很难找出来。已经可以用了,非常感谢大神。
4 楼
MLGB447593134
2012-03-05
liuzidong 写道
请确定你的项目工程中存在相关的jstl的jar文件吗及在页面引用c.tld
请参考:JSTL 使用配置总结
http://liuzidong.iteye.com/blog/617003
分页方面的事你可以不用操心了,只要传递相应参数就行了!
完全照搬大神的代码,包也是按照前面一个工程导进来的,有jstl.jar就配了一下数据源,还没移植呢。/userList.jsp(65,4) Expecting "jsp:param" standard action with "name" and "value" attributes,报的这个错请参考:JSTL 使用配置总结
http://liuzidong.iteye.com/blog/617003
分页方面的事你可以不用操心了,只要传递相应参数就行了!

3 楼
liuzidong
2012-03-05
请确定你的项目工程中存在相关的jstl的jar文件吗及在页面引用c.tld
请参考:JSTL 使用配置总结
http://liuzidong.iteye.com/blog/617003
分页方面的事你可以不用操心了,只要传递相应参数就行了!
请参考:JSTL 使用配置总结
http://liuzidong.iteye.com/blog/617003
分页方面的事你可以不用操心了,只要传递相应参数就行了!

2 楼
MLGB447593134
2012-03-05

<jsp:param name="url" value="userAction!userList.action" />
这里报了一个错,不知道为啥上面这句什么意思
/userList.jsp(65,4) Expecting "jsp:param" standard action with "name" and "value" attributes
1 楼
MLGB447593134
2012-03-05
大神给的代码确定和网页上的一样吗,怎么没有分页功能,反而实现的是jquery
发表评论
-
【转载】Eclipse Class Decompiler——Java反编译插件
2018-06-24 11:09 1385参见:jd-eclipse 的安装和使用(最新版的) h ... -
Java多线程序源码
2016-06-24 15:04 10591、《Java多线程编程核心技术》源代码(高洪岩) 2、Jav ... -
Spring & Junit
2016-05-27 13:18 7821 测试基类(BaseJunit4Test) import ... -
XSS之xssprotect
2012-12-07 23:03 29556参考资料 1 跨网站脚本 ... -
myeclispe之图解weblogic81配置
2011-11-07 10:11 1641一 创建Weblogic81域(如下图) 注意事项:一般 ... -
Cannot forward a response that is already committed
2011-09-07 09:43 5615参考资料 1 Cannot forward a respons ... -
WebLogic之Cannot parse POST parameters of request解决方法
2011-09-06 15:31 11374参考资料 1 关于Cannot parse POST para ... -
WebLogic之weblogic.xml.jaxp.RegistrySAXTransformerFactory
2011-08-16 16:46 8815参考资料 1 Thread: java.lang.ClassC ... -
Quartz之一个任务绑定多个触发器
2011-08-15 16:27 5072参见官方示例: SchedulerFactory sf = ... -
Quartz之QuartzInitializerListener
2011-08-15 15:12 7960问题:我想在WEB容器启动时就执行任务怎么办呢 Quartz: ... -
Quartz之QuartzInitializerServlet
2011-08-15 14:39 9305问题:我想在应用程序启动之后去执行任务怎么办呢! Quartz ... -
jQuery与Java实现图片的剪切
2011-08-05 15:10 30554一 参考资料 1 jquery Jcrop 头像,logo截图 ... -
WebLogic之Session
2011-07-25 13:15 24081参考资料 1 关于WebLogic的Session丢失的问题 ... -
Frameset导致Cookies和Session丢失的原因及解决办法
2011-07-25 12:28 4398参考资料 1 Frameset导致Cookies和Sessio ... -
java,javascript对18位身份证格式的验证算法
2011-07-12 14:15 7142参考资料 1 java实现的18位身份证格式验证算法 http ... -
Quartz之CronTrigger
2011-07-11 15:01 14754参考资料 1 quartz 学习笔记 http://china ... -
Quartz之CronExpression
2011-07-08 16:15 33839参考资料 1 Spring中任务调度(Quartz篇)-续-c ... -
Quartz之SimpleTrigger
2011-07-08 15:21 27270SimpleTrigger: 它只能用于指定任务在一个特定时间 ... -
Quartz2之入门示例
2011-07-07 17:12 79312环境:XP+Myeclipse6.5+JDK1.6 q ... -
Sprint之java.util.Time
2011-07-06 16:17 1713参考资料 1 在Spring中使用JDK Timer进行任务调 ...
相关推荐
在这个"ssh Struts2.2+Hibernate3.6+Spring3.1+oracle 分页示例.zip"压缩包中,开发者提供了一个使用这些技术实现的分页功能示例。下面将详细介绍SSH框架以及Oracle数据库的分页技术。 **Struts2** 是一个基于MVC...
{3.6}StringBuilder}{76}{section.3.6} {3.7}StringBuilder与StringBuffer的缺点}{76}{section.3.7} {3.8}内部类}{77}{section.3.8} {4}Collection}{80}{chapter.4} {4.1}\ttfamily java.util.ArrayList}{80}{...
命令与征服1995,C&C95经典版本 游戏无法直接运行,打开“C&C”目录并执行Dosbox.exe即可。
文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!
内容概要:本文详细介绍了在Linux环境下进行C++开发所需掌握的内容,以一个Web多人聊天项目为例,涵盖从开发环境搭建到项目部署的全过程。首先推荐了一个项目地址,该项目支持HTTP请求、Websocket、多房间和多人聊天、MySQL用户信息存储、Redis缓存、json序列化等功能,并建议扩展功能如基于Reactor模型构建HTTP/Websocket服务、仿写MySQL/Redis连接池等。接着介绍了开发环境,包括Ubuntu 20.04、MySQL 8.0、Redis 6.0、gcc/g++ 10.5.0等,并提供了详细的部署步骤,如安装boost库、编译聊天室服务、配置MySQL和Redis等。最后分析了项目架构,包括数据存储(MySQL存储用户信息,Redis存储房间消息和用户cookie)、消息格式(HTTP请求消息和Websocket交互消息)、HTTP/Websocket数据处理流程等。; 适合人群:有一定Linux基础,想深入了解C++开发及网络编程的开发者,尤其是有志于从事Web开发或服务器端开发的技术人员。; 使用场景及目标:①掌握Linux C++开发环境的搭建,包括工具链的安装与配置;②理解并实践HTTP、Websocket等网络协议的应用;③熟悉MySQL、Redis等数据库的使用;④学习如何处理HTTP请求、Websocket交互消息及数据存储;⑤能够独立完成类似Web聊天室的项目开发。; 其他说明:本文不仅提供了理论指导,还给出了具体的实践操作步骤,如编译过程中可能遇到的问题及解决方案。对于初学者来说,可以按照文中提供的链接和教程逐步学习,同时鼓励读者根据自身需求对项目进行扩展和优化。
通信工程劳务分包框架合同版.docx
只需要将png图片或者包含png的文件夹拖拽到软件,即可实现批量压缩,方便有大量png图片需要压缩的需求
游戏亲测无毒可用,可在Win10、Win11等系统直接运行(执行ra95.exe,无需虚拟机) #初代经典红警,#红警95,#RTS,#电脑游戏,#怀旧游戏
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
内容概要:本文档是一份来自中国科学技术大学的《Matlab先进算法讲义》,主要介绍了数学建模中常用的四种算法:神经网络算法、遗传算法、模拟退火算法和模糊数学方法。每种算法均以应用为导向,简要讲解其原理、结构、分类及其在数学建模中的具体应用实例。对于神经网络,重点介绍了感知器和BP网络,展示了如何通过训练网络来解决分类问题;遗传算法则模拟生物进化过程,用于求解优化问题;模拟退火算法借鉴了物理退火过程,适用于组合优化问题;模糊数学方法通过隶属度的概念处理模糊决策问题。文中还提供了部分算法的Matlab和C语言程序代码,帮助读者更好地理解和应用这些算法。 适合人群:具备一定数学建模基础、对Matlab有一定了解的高校学生及科研人员。 使用场景及目标:①学习神经网络、遗传算法、模拟退火算法和模糊数学方法的原理及其应用场景;②掌握如何利用这些算法解决实际问题,如分类、优化、决策等;③能够编写和调试相关算法的程序代码,应用于数学建模竞赛或科研项目中。 其他说明:本文档侧重于算法的应用而非深入理论探讨,旨在帮助读者快速入门并应用于实际问题解决。读者应结合提供的程序代码进行实践,以加深理解。
过滤器实现单点登录
一、 数据集 1. 总计9280张火焰和烟雾图片,已打标签,格式:类别+目标矩形位置 类别:0 - fire;1 - smoke 位置:4个坐值 图片文件名与标签文件名一一对应,标签文件中多行表示图片中有多个检测目标,一行一个 2. 9280张属于中等规模数据集,黄金比例划分:70%训练集+15%验证集+15%测试集 训练集:6496张(70% train) 验证集:1392张(15% val) 测试集:1392张(15% test) 平衡了模型训练需求与评估可靠性,避免小数据集划分导致的过拟合风险 火焰和烟雾的实例数量各1000多,基本持平,防止模型在训练过程中偏向于更频繁标注的类别 二、 目录结构 fire_smoke_images ├── data.yaml ├── images/ │ ├── train/ │ │ ├── 0001.jpg │ │ ├── 0002.jpg │ │ ├── 0003.jpg │ │ ... │ ├── val/ │ │ ├── 7001.jpg │ │ ... │ ├── test/ │ │ ├── 9001.jpg │ │ ... └── labels/ ├── train/ │ ├── 0001.txt │ ├── 0002.txt │ ├── 0003.txt │ ... └── val/ ├── 7001.txt ... 三、目标检测 演示:http://ofdweb.cn:28501/ 
本书《智能医疗系统设计中的移动技术》旨在探讨如何利用移动技术,特别是无线网络技术,来设计和实现智能医疗保健系统。书中首先介绍了移动技术在医疗领域的应用背景、挑战以及本书的组织结构。随后,作者详细阐述了如何使用商品级WiFi进行非接触式活动识别,并设计了基于信道状态信息(CSI)的活动识别系统。此外,书中还探讨了如何利用现有的WiFi基础设施来设计个性化的健身助手系统,以及如何通过毫米波(mmWave)技术提升智能医疗系统的分辨率和准确性。书中还研究了饮食习惯监测系统的设计,以及如何将移动设备(如智能手机和智能手表)用于智能医疗保健,例如通过内置的光电容积描记法(PPG)传感器实现手势识别、手语解释和持续的用户认证。本书为智能医疗保健系统的研发提供了一套全面的分析和前沿的设计方案。
【文章/演示视频链接:https://archie.blog.csdn.net/article/details/147283872?spm=1001.2014.3001.5502】1.本系统有一个主机,两个从机。2.一主多从的LORA组网通信,主机和两个从机都配备了STM32F103单片机与 LoRa 模块,主机作为中心设备及WIFI网关,负责接收和发送数据到远程物联网平台和手机APP,两个从机则负责采集数据并通过各自的 LoRa组网将数据发送给主机。3.两个LORA从机,功能一样,组网分别实现对温度、湿度、粉尘PM2.5、PM10、CO2和NH3进行实时采集,并在OLED显示屏显示,系统采用锂电池供电。从机所用主要硬件:STM32F103C8T6最小系统板、多合一环境检测模组、0.96寸OLED显示屏、MQ-135传感器、正点原子LORA模块ATK-LORA-01、18650锂电池。4.主机LORA,组网实现接收两个从机采集过来的数据,通过主机WIFI模块网关将两个从机的数据远程传输到物联网云服务器和手机APP。主机所用主要硬件:STM32F103C8T6最小系统板、ESP8266模块、正点原子LORA模块ATK-LORA-01、18650锂电池。 资料包,包含本项目所有的程序源码和原理图 1.程序源码文件如下所示: “0.机智云MCU代码生成”是机智云平台生成的代码 “1.主机-未移入机智云”是没有移植机智云的代码(方便更改为你的机智云) “1.主机-移入机智云-此程序可接入机智云”是本项目的主机网关程序 “2.从机1-本地数据采集与显示”是本项目的从机1程序 “3.从机2-本地数据采集与显示”是本项目的从机2程序 【物联网】基于LORA组网的远程环境监测系统设计(资料包)
世邦魏理仕:2023年中国房地产市场展望
第十一章:链表和共用体的个别例子,第十一章:链表和共用体的个别例子,第十一章:链表和共用体的个别例子
移动通信端到端加密安全方案设计研究论文.docx
typesripe截图脚本 使用ts-node即可截取网页图片
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。