当前位置:文档之家› struts2+spring+hibernate分页显示完整代码

struts2+spring+hibernate分页显示完整代码

struts2+spring+hibernate分页显示完整代码
struts2+spring+hibernate分页显示完整代码

分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。

1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法:

publicinterface MemberDao {

@SuppressWarnings("unchecked")

/**

* 分页查询

* @param hql 查询的条件

* @param offset 开始记录

* @param length 一次查询几条记录

* @return

*/

public List queryForPage(final String hql,finalint

offset,finalint length);

/**

* 查询所有记录数

* @param hql 查询的条件

* @param offset 开始记录

* @return总记录数

*/

publicint getAllRowCount(String hql);

}

2、DAO层实现类MemberDaoImpl对上面两个方法的实现如下:

publicclass MemberDaoImpl extends HibernateDaoSupport implements MemberDao {

/**

* 查询所有记录数

* @return总记录数

*/

publicint getAllRowCount(String hql) {

return getHibernateTemplate().find(hql).size();

}

/**

* 分页查询

* @param hql 查询的条件

* @param offset 开始记录

* @param length 一次查询几条记录

* @return

*/

@SuppressWarnings("unchecked")

public List queryForPage(final String hql, finalint offset, finalint length) {

List list = getHibernateTemplate().executeFind(new HibernateCallback(){

public Object doInHibernate(Session session)

throws HibernateException, SQLException {

Query query = session.createQuery(hql);

query.setFirstResult(offset);

query.setMaxResults(length);

List list = query.list();

return list;

}

});

return list;

}

}

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

3、下面我们来新建一个保存分页信息的类PageBean,具体代码如下:

publicclass PageBean {

@SuppressWarnings("unchecked")

private List list; //要返回的某一页的记录列表

privateint allRow; //总记录数

privateint totalPage; //总页数

privateint currentPage; //当前页

privateint pageSize; //每页记录数

@SuppressWarnings("unused")

privateboolean isFirstPage; //是否为第一页

@SuppressWarnings("unused")

privateboolean isLastPage; //是否为最后一页

@SuppressWarnings("unused")

privateboolean hasPreviousPage; //是否有前一页

@SuppressWarnings("unused")

privateboolean hasNextPage; //是否有下一页

@SuppressWarnings("unchecked")

public List getList() {

return list;

}

@SuppressWarnings("unchecked")

publicvoid setList(List list) {

this.list = list;

}

publicint getAllRow() {

return allRow;

}

publicvoid setAllRow(int allRow) {

this.allRow = allRow;

}

publicint getTotalPage() {

return totalPage;

}

publicvoid setTotalPage(int totalPage) {

this.totalPage = totalPage;

}

publicint getCurrentPage() {

return currentPage;

}

publicvoid setCurrentPage(int currentPage) {

this.currentPage = currentPage;

}

publicint getPageSize() {

return pageSize;

}

publicvoid setPageSize(int pageSize) {

this.pageSize = pageSize;

}

publicvoid setFirstPage(boolean isFirstPage) { this.isFirstPage = isFirstPage;

}

publicvoid setLastPage(boolean isLastPage) {

this.isLastPage = isLastPage;

}

publicvoid setHasPreviousPage(boolean hasPreviousPage) { this.hasPreviousPage = hasPreviousPage;

}

publicvoid setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage;

}

//初始化分页信息

publicvoid init(){

this.isFirstPage = isFirstPage();

this.isLastPage = isLastPage();

this.hasPreviousPage = isHasPreviousPage();

this.hasNextPage = isHasNextPage();

}

//部分set方法

publicboolean isFirstPage() {

return currentPage == 1; // 如是当前页是第1页

}

publicboolean isLastPage() {

return currentPage == totalPage; //如果当前页是最后一页}

publicboolean isHasPreviousPage() {

return currentPage!=1; //只要当前页不是第1页

}

publicboolean isHasNextPage() {

return currentPage != totalPage; //只要当前页不是最后1页}

/**

* 计算总页数,静态方法,供外部直接通过类名调用

* @param pageSize 每页记录数

* @param allRow 总记录数

* @return总页数

*/

publicstaticint countTotalPage(finalint pageSize,finalint allRow){

int totalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize+1;

return totalPage;

}

/**

* 计算当前页开始记录

* @param pageSize 每页记录数

* @param currentPage 当前第几页

* @return当前页开始记录号

*/

publicstaticint countOffset(finalint pageSize,finalint currentPage){

finalint offset = pageSize * (currentPage-1);

return offset;

}

/**

* 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替

* @param page 传入的参数(可能为空,即0,则返回1)

* @return当前页

*/

publicstaticint countCurrentPage(int page){

finalint curPage = (page==0?1:page);

return curPage;

}

}

4、Service层接口的设计:

publicinterface MemberService {

/**

* 分页查询

* @param pageSize 每页大小

* @param currentPage 当前第几页

* @return封闭了分页信息(包括记录集list)的Bean

*/

public PageBean queryForPage(int pageSize,int currentPage); }

5、Service层实现类的部分内码如下:

publicclass MemberServiceImpl implements MemberService{

private MemberDao memberDao;

public MemberDao getMemberDao() {

return memberDao;

}

publicvoid setMemberDao(MemberDao memberDao) {

this.memberDao = memberDao;

}

/**

* 分页查询

* @param currentPage 当前第几页

* @param pageSize 每页大小

* @return封闭了分页信息(包括记录集list)的Bean

*/

@SuppressWarnings("unchecked")

public PageBean queryForPage(int pageSize, int currentPage) { final String hql = "from User"; //查询语句

int allRow = memberDao.getAllRowCount(hql); //总记录数

int totalPage = PageBean.countTotalPage(pageSize, allRow); //总页数

finalint offset = PageBean.countOffset(pageSize,

currentPage); //当前页开始记录

finalint length = pageSize; //每页记录数

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、在Struts2中调用queryForPageMemberService层的queryForPage()方法即可return 一个包含分页信息、符合条件的结果集list,代码如下:

publicclass ListMemberAction extends ActionSupport { private MemberService memberService;

privateint page = 1; //第几页

private PageBean pageBean; //包含分布信息的bean

public MemberService getMemberService() {

return memberService;

}

publicvoid setMemberService(MemberService memberService) { this.memberService = memberService;

}

publicint getPage() {

return page;

}

publicvoid setPage(int page) {

this.page = page;

}

public PageBean getPageBean() {

return pageBean;

}

publicvoid setPageBean(PageBean pageBean) {

this.pageBean = pageBean;

}

@Override

public String execute() throws Exception {

//分页的pageBean,参数pageSize表示每页显示记录数,page为当前页

this.pageBean = memberService.queryForPage(2, page);

return"success";

}

}

7、最后在listMember.jsp页面中,用到了Struts2标签:

">modify

" onclick="return askDel()"/>delete

条记录

当前第

第一页上一页

第一页

">上一页

">下一页

">最后一页

下一页最后一页

到这里,Hibernate+Spring+Struts2整合开发中的分页问题就已经解决了,

配置文件:

8、Struts:配置文件

"-//Apache Software Foundation//DTD Struts Configuration

2.1//EN"

"https://www.doczj.com/doc/0e15566868.html,/dtds/struts-config_2_1.dtd">

/show/listMember.jsp

9、Hibernate配置文件,映射文件和实体类代码省略。

10、Spring配置文件:

11、Web.xml文件配置:

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPr epareAndExecuteFilter

struts2

/*

hibernatesession

org.springframework.orm.hibernate3.support.Op enSessionInViewFilter

hibernatesession

/*

org.springframework.web.context.ContextLoad erListener

contextConfigLocation

classpath:spring.xml

网页设计试题及html代码

2.2.3 字型设置标记 功能:设置文字的风格,如黑体、斜体、带下划线等,这是一组标记,它们可以单独使用,也可以混合使用产生复合修饰效果。常用的标记有以下一些: :文字以粗体显示。 :文字显示为斜体。 :显示下划线。 :删除线。 :使文字大小相对于前面的文字增大一级。 :使文字大小相对于前面的文字减小一级。 :使文字成为前一个字符的上标。 :使文字成为前一个字符的下标。 :使文字显示为闪烁效果。 :以等宽体显示西文字符。 :输出引用方式的字体,通常是斜体。 :强调文字,通常用斜体加黑体。 :特别强调的文字,通常也是斜体加黑体。 注:有些标记的效果必须在动态环境下才能显示,例如 标记。 【例2-4】字型设置标记的应用。 例如单标记


表示在文档当前位置画一条水平线,一般是从窗口中当前行的最左端一直画到最右端,它可以带这么一些属性:
。 功能:设置网页中普通文字的显示效果。 格式:文字。 格式:标题内容。 属性:n 表示标题字号的级别,可以是1~6之间的任意整数,数字越小,字号越大。 段落标记 功能:设置文章段落的开始和结束。浏览器在解释HTML文档时,会自动忽略文档中的回车、空格以及其他一些符号,所以在文档中输入回车,并不意味着在浏览器内将看到一个不同的段落,当需要在网页中插入新的段落时,可以使用段落标记,它可以将标记后面的内容另起一段。格式:

。 强制换行标记 功能:另起一行显示文字。 格式:
插入水平线标记 功能:在页面上画横线,可用于页面上内容的分割。 格式:
1.无序列表 功能:设置无序列表。 格式: