代码规范案例(ssh分页)

1.首先我们先新建立一个接口MemberDao.java,把所需要用到的方法列出来:

package cn.zbvc.dao;
import java.util.List;
import cn.zbvc.bean.User;
public interface MemberDao {
/**
 * 分页查询
 * @param hql  查询条件
 * @param offset  开始记录
 * @param length  一次查询几条记录
 * @return 查询的记录集合
 */
public List<User> queryForPage(final String hql,final int offset,final int length);
/**
 * 查询所有的记录数
 * @param hql 查询条件
 * @return 总记录数
 */
public int getAllRowCount(String hql);
}

2.然后我们创建其实现类:MemberDaoImpl.java

package cn.zbvc.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.zbvc.bean.User;
import cn.zbvc.dao.MemberDao;
public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao {
/**
 * 查询所有的记录数
 * @param hql 查询条件
 * @return 总记录数
 */
public int getAllRowCount(String hql) {
return this.getHibernateTemplate().find(hql).size();
}
/**
 * 分页查询
 * @param hql  查询条件
 * @param offset  开始记录
 * @param length  一次查询几条记录
 * @return 查询的记录集合
 */
@SuppressWarnings("unchecked")
public List<User> queryForPage(final String hql, final int offset, final int length) {
Session session = this.getSession();
Query q = session.createQuery(hql);
q.setFirstResult(offset);
q.setMaxResults(length);
List<User> list = q.list();
System.out.println(list.size());
session.close();
return list;
}

大家可以看到,我们一共定义了两个方法,第一个方式是获取数据库表的总记录数,第二个方法是获取我们想要获取的某一页的数据集合,传递的三个参数分别是:查询条件、开始的记录、结束的记录。

细心的读者会发现,这个类继承了HibernateDaoSupport类,HibernateDaoSupport是Spring提供的对Hibernate支持的类,在其参数内,我们能像原生的Hibernate一样调用query.setFirstResult(offset)和query.setMaxResults(length)来实现分页查询功能。

3.然后我们需要建立一个获取分页信息的pageBean.java:

package cn.zbvc.util;
import java.util.List;
import cn.zbvc.bean.User;
public class PageBean {
private List<User> list;  //要返回的某一页的记录列表
private int allRow; //总记录数
private int totalPage;  //总页数
private int currentPage;  //当前页
private int pageSize;  //每页的记录数
private boolean isFirstPage;  //是否为当前第一页
private boolean isLastPage;  //是否为最后一页
private boolean hasPreviousPage;  //是否有前一页
private boolean hasNextPage;  //是否有下一页
Set and get方法
PageBean中的具体方法:
/**
 * 初始化分页信息
 */
public void init(){
this.isFirstPage = isFirstPage;
this.isLastPage = isLastPage;
this.hasPreviousPage = hasPreviousPage;
this.hasNextPage = hasNextPage;
}
/**
 * 计算总页数  静态方法
 * @param pageSize  每页的记录数
 * @param allRow  总记录数
 * @return 总页数
 */
public static int countTatalPage(final int pageSize,final int allRow){
int toalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize + 1;
return toalPage;
}
/**
 * 计算当前页开始的记录
 * @param pageSize 每页记录数
 * @param currentPage 当前第几页
 * @return 当前页开始记录号
 */
public static int countOffset(final int pageSize,final int currentPage){
final int offset = pageSize * (currentPage - 1);
return offset;
}
/**
 * 计算当前页,若为0或者请求的URL中没有“?page = ”则用1代替
 * @param page 传入的参数(可能为空,即0  则返回1)
 * @return
 */
public static int countCurrentPage(int page){
final int curpage = (page == 0 ? 1 : page);
return curpage;
}    }

4.业务逻辑层的实现:我们现在就只操作User,现在我们在UserService中定义一个方法:

/**
 * 分页查询  
 * @param pageSize  每页显示多少记录
 * @param currentPage 当前页
 * @return 封装了分页信息的bean
 */
public PageBean queryForPage(int pageSize,int page);

5.使用UserServiceImpl实现这个具体方法:

/**
 * 分页查询  
 * @param pageSize  每页显示多少记录
 * @param currentPage 当前页
 * @return 封装了分页信息的bean
 */
public PageBean queryForPage(int pageSize, int page) {
final String hql = "from User user order by user.id"; //查询语句
int allRow = memberDao.getAllRowCount(hql);  //总记录数
int totalPage = PageBean.countTatalPage(pageSize, allRow); //总页数
final int offset = PageBean.countOffset(pageSize, page); //当前页开始记录
final int length = pageSize; // 每页记录数
final int currentPage = PageBean.countCurrentPage(page); // 当前页
List list = memberDao.queryForPage(hql, offset, length); //
//把分页信息保存到Bean当中
PageBean pageBean  = new PageBean();
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
pageBean.setAllRow(allRow);
pageBean.setTotalPage(totalPage);
pageBean.setList(list);
pageBean.init();
return pageBean;
}

6.然后我们为了不影响上一个例子,我们新创建一个ListUserAction2.java:

package cn.zbvc.action.user;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import cn.zbvc.bean.User;
import cn.zbvc.service.UserService;
import cn.zbvc.util.PageBean;
public class ListUserAction2 extends ActionSupport {
private UserService service;//通过Spring创建业务层对象  使用set方法依赖注入
private PageBean pageBean; //封装了分页信息和数据内容的pageBean
private List<User> listUser;//用于储存pageBean当中被封装的User信息
private int page = 1; //表示从网页中返回的当前页的值  默认为1 表示默认显示第一页内容
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public List<User> getListUser() {
return listUser;
}
public void setListUser(List<User> listUser) {
this.listUser = listUser;
}
public PageBean getPageBean() {
return pageBean;
}
public void setPageBean(PageBean pageBean) {
this.pageBean = pageBean;
}
public void setService(UserService service) {
this.service = service;
}
public String execute()throws Exception{
this.pageBean = service.queryForPage(5, page);//获取封装了分页信息和数据的pageBean
this.listUser = this.pageBean.getList(); //获取数据
return SUCCESS;
}
}

7.配置applicationContext.xml和struts.xml的相关信息,这里省略了。

8.在listUser2.jsp页面中添加分页内容:

<s:iterator value="pageBean">
        <tr>
         <td colspan="6" align="center" bgcolor="#5BA8DE">
         共<s:property value="allRow"/>条记录    
         共<s:property value="totalPage"/>页    
         当前第<s:property value="currentPage"/>页<br>
    
         <s:if test="%{currentPage == 1}">
           第一页  上一页
         </s:if>
         <!-- currentPage为当前页 -->
         <s:else>
           <a href="listUser2.action?page=1">第一页</a>
           <a href="listUser2.action?page=<s:property value="%{currentPage-1}"/>">上一页</a>
         </s:else>
    
         <s:if test="%{currentPage != totalPage}">
         <a href="listUser2.action?page=<s:property value="%{currentPage+1}"/>">下一页</a>
         <a href="listUser2.action?page=<s:property value="totalPage"/>">最后一页</a>
            </s:if>
    
         <s:else>
         下一页  最后一页
         </s:else>
         </td>
        </tr>
</s:iterator>

9.查看效果:

10.思考总结

关于分页功能实现,应该是有有很多种解决方法,我介绍的这种解决方案是为了给大家一个

范例,让大家明白分页功能实现的原理,其中,大部分的内容借鉴了之前提到的网址。接下来的时间,我会继续学习关于分页功能的其它实现方式,然后分享给大家,另外,还会继续的整理SSH的整合。

时间: 2024-10-05 17:50:09

代码规范案例(ssh分页)的相关文章

Python PEP8代码规范_20180614

PEP8 代码风格指南 知识点 代码排版 字符串引号 表达式和语句中的空格 注释 版本注记 命名约定 公共和内部接口 程序编写建议 1. 介绍 这份文档给出的代码约定适用于主要的 Python 发行版所有标准库中的 Python 代码.请参阅相似的 PEP 信息,其用于描述实现 Python 的 C 代码规范[1]. 这份文档和 PEP 257(文档字符串约定) 改编自 Guido 的 Python 风格指南原文,从 Barry 的风格指南里添加了一些东西[2]. 随着时间的推移,这份额外约定的

这篇文章不错——代码规范

该文章来自于阿里巴巴技术协会(ATA)精选文章. 个人经历 对我代码质量影响最大的是在一家外资企业,在这家公司我觉得有以下几个方面做的很不错. 团队编码风格统一 统一到什么程度? 不看代码作者,你很难区分代码是谁写的(在目前公司一些团队也能达到这个标准). 个人观点: 这样做有什么好处?团队中每个人阅读代码都很容易,减少很多沟通,维护成本( 代码阅读的次数远远大于变更的次数),并且心情非常愉悦.有人肯定觉得愉悦有点夸张,举个栗子: 有一些代码,如果不是由于与工作内容有关联,你是否有种这辈子都不情

Hibernate事务代码规范写法

----------------siwuxie095 事务相关概念 1.什么是事务 逻辑上的一组操作,构成这组操作的各个单元,要么一起成功, 要么一起失败 2.事务的四个特性 1)原子性 2)一致性 3)隔离性 4)持久性 3.不考虑隔离性,产生的问题 1)脏读 2)不可重复读 3)幻读(也称 虚读) 4.设置事务隔离级别,即可解决不考虑隔离性所产生的问题 「MySQL 默认的隔离级别:Repeatable Read(可重复读)」 5.Hibernate 也可以在核心配置文件中配置事务隔离级别

Web 前端代码规范

Web 前端代码规范 最后更新时间:2017-06-25 原始文章链接:https://github.com/bxm0927/web-code-standards 此项目用于记录规范的.高可维护性的前端代码,这是通过分析 Github 众多前端代码库,总结出来的前端代码书写规范. 目录 前端普适性规范 HTML 规范 CSS 规范 JS 规范 License public domain, Just take it. Thanks @Ruan YiFeng: https://github.com/

前端代码规范1.0

意义:该规范旨在统一前端代码书写,规范前端代码标准,为共同协作打下良好基础,提高工作效率. 文件夹/文件命名 图片文件夹:image,images,img Js代码文件夹:js Css文件夹:css 首页:index. 其他页面根据具体情况来定,可以是中文名,英文名,拼音等,以方面认识为主. 页面框架布局 样式名称 样式名称的规则为根据对应位置的英文来命名.如: 头部:header 导航:nav 页尾:footer 消息:news,message 分页:page, 下拉:select 复选框:c

(二)代码规范

良好的代码规范是一个程序猿的基本素质,如果写的代码不规范,那么你写再多的代码也算不上一个合格的程序猿.下面就简单介绍一些最基本的规范. 命名规范: 变量:全部小写,变量命名要符合Snake case.也就是说写法像蛇一样,变量名由多个单词组成时,单词之间用_连接起来.如一个变量命名为car_price. 常量:全部大写,如CAR_PRICE=100000. 类:首字母大写,多个单词符合驼峰命名规范,每个单词首字母大写,如Student,CollegeSutdent. 模块:命名规范和类名一样,也

解读阿里官方代码规范

2017年开春,阿里对外公布了「阿里巴巴Java开发手册」.作为一个13年经验的码农,从头到尾浏览了一遍这份手册之后,感觉很棒.虽然其中的某些观点笔者不能苟同,但大部分的规范还是值得绝大多数程序员学习和遵守的. 笔者将对这份代码规范中的一些细节做一些解读,包含笔者的观点和想法,可以作为这份代码规范的扩展阅读.对于规范中某些「显而易见」的条款,将不在解读范围之列(换言之,这都不懂,就说明你天赋不够,乘早别做程序员了). 当然,笔者在日常的编程过程中属于「代码洁癖偏执狂」,所以文中的某些观点仅代表个

代码规范中常见问题举例说明

1.背景说明 虽然不止一次说明代码规范的问题,但是在协同作战的时候,代码规范这问题总是被遗忘,希望大家能够引以为戒.协同作战的时候,如果不能遵守代码规范,很容易出现各种问题,而且不知道从何处入手解决,消耗时间成本. 实际上,对于代码规范这种问题,应该有人专门来审核代码的,但是公司小,项目也不大,参与的人员也不多的情况下,绝大多数公司都没有这种机制,尤其是在移动端编程上面 ,这就需要开发人员自我监督,避免出现不必要的麻烦. 本文就举例说明,在近期笔者所带领的团队协作中,出现的一些问题. 2.命名

PHP 代码规范、流程规范、git规范

代码规范.git规范.teambition规范.yii规范 1. 命名规范 (1).变量命名规范 1.变量使用驼峰命名法 禁止使用拼音或者拼音加数字 2.变量也应具有描述性,杜绝一切拼音.或拼音英文混杂的命名方式 3.变量包数字.字母和下划线字符,不允许使用其他字符,变量命名最好使用项目 中有据可查的英文缩写方式, 尽可以要使用一目了然容易理解的形式: 4.变量以字母开头,如果变量包多个单词,首字母小写,当包多个单词时,后面 的每个单词的首字母大写. 例如 :$itSports 5.变量使用有效