<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.SQLServerDialect
</property>
<property name="connection.url">
jdbc:microsoft:sqlserver://localhost:1433;databasename=shirdrn
</property>
<property name="connection.username">sa</property>
<property name="connection.password">111111</property>
<property name="connection.driver_class">
com.microsoft.jdbc.sqlserver.SQLServerDriver
</property>
<property name="myeclipse.connection.profile">MSSQL</property>
<property name="show_sql">true</property>
<mapping resource="org/shirdrn/spring/entity/MyUser.hbm.xml" />
</session-factory>
</hibernate-configuration>
實現Hibernate映射文件MyUser.hbm.xml,及其對應的POJO:
這個非常容易,就省略了。
(2) Spring集成Hibernate
在/WEB-INF/目錄下面,新建一個action-servlet.xml的Spring配置文件,因為后面要和Struts集成,所以根據格式<SERVLETNAME>-servlet.xml,應該使用Struts的Servlet映射名稱。
Spring集成Hibernate,在action-servlet.xml中配置如下:
<bean id="mySessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
(3) 頁面實體及分頁邏輯實現
Page是一個頁面實體類,如下:
package org.shirdrn.spring.util;
import java.util.List;
public class Page {
private int pageSize;
private int totalPage;
private int rowCount;
private int currentPage;
private int prePage;
private int nextPage;
private boolean hasNextPage; // 是否有下一頁
private boolean hasPreviousPage; // 是否有前一頁
private List list;
public Page(){
this.pageSize = 10;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getNextPage() {
return nextPage;
}
public void setNextPage(int nextPage) {
this.nextPage = nextPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPrePage() {
return prePage;
}
public void setPrePage(int prePage) {
this.prePage = prePage;
}
public int getRowCount() {
return rowCount;
}
public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public boolean isHasNextPage() {
return hasNextPage;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public boolean isHasPreviousPage() {
return hasPreviousPage;
}
public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
}
PageUtil類是一個分頁邏輯的抽象,需要分頁的話,只需要繼承自它便可以方便地實現分頁,可見,PageUtil可以重用,如下所示:
package org.shirdrn.spring.util;
import org.shirdrn.spring.pages.MyUserPage;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class PageUtil extends HibernateDaoSupport {
public Page page;
public int start;
public PageUtil(){
}
public void setPreOrNextBoolean(){
if(page.getCurrentPage()<=1){
page.setHasPreviousPage(false);
}
else{
page.setHasPreviousPage(true);
}
if(page.getCurrentPage()>=page.getTotalPage()){
page.setHasNextPage(false);
}
else{
page.setHasNextPage(true);
}
}
public void setCurrentPage(){
if(start<1){
page.setCurrentPage(1);
}
if(start>page.getTotalPage()){
page.setCurrentPage(page.getTotalPage());
}
page.setCurrentPage(start);
}
public void setPrePage(){
page.setPrePage(page.getCurrentPage()-1);
}
public void setNextPage(){
page.setNextPage(page.getCurrentPage()+1);
}
public void setTotalPage(){
int rowCount = getRowCount();
int pageSize = page.getPageSize();
if(rowCount>pageSize){
if(rowCount%pageSize == 0){
page.setTotalPage(rowCount/pageSize);
}
else{
page.setTotalPage(1+(rowCount/pageSize));
}
}
else{
page.setTotalPage(1);
}
}
public void setRowCount(){
page.setRowCount(getRowCount());
}
public int getRowCount(){
return 0;
}
public int getStartIndex(){
int startIndex = 0;
if(start<0){
startIndex = 0;
}
else{
if(start>page.getTotalPage()){
startIndex = page.getPageSize()*(page.getTotalPage()-1);
}
else{
startIndex = page.getPageSize()*(start-1);
}
}
return startIndex;
}
public Page getPage(){
return page;
}
}
(4) 具體的業務對象分頁實現
這里,MyUser類是一個POJO,查詢出結果需要分頁顯示。
MyUser的分頁實現類為MyUserPage類,它應該繼承PageUtil類。因為PageUtil類繼承了HibernateDaoSupport類,所以需要注入一個SessionFactory,在action-servlet.xml中配置如下所示:
<bean id="myUserPage" abstract="false"
class="org.shirdrn.spring.pages.MyUserPage"
lazy-init="default" autowire="default" dependency-check="default">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>
</beans>
具體地,MyUserPage類實現如下所示:
package org.shirdrn.spring.pages;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.shirdrn.spring.util.Page;
import org.shirdrn.spring.util.PageUtil;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate3.HibernateCallback;
public class MyUserPage extends PageUtil {
private String hql;
public void init(int start,String hql){ // 通過init方法實現一個頁面的初始化
page = new Page();
this.hql = hql;
this.start = start;
setRowCount();
setTotalPage();
setCurrentPage();
setPrePage();
setNextPage();
setPreOrNextBoolean();
}
@Override
public int getRowCount(){
List list = getHibernateTemplate().find(hql);
if(list.isEmpty()){
return 0;
}
return list.size();
}
@Override
public Page getPage(){
List list = (List)getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery(hql);
query.setFirstResult(getStartIndex());
query.setMaxResults(page.getPageSize());
return query.list();
}
});
page.setList(list);
return page;
}
}
上面實現,使用了HQL檢索方式實現查詢數據庫記錄。
在MyUserPage中可以使用帶參數的構造方法實現頁面的初始化,但是在使用構造方法注入的時候,很容易出錯,而且不直觀,所以直接通過調用實現的一個init方法來初始化。
(6) Spring集成Struts
需要在Struts的配置文件struts-config.xml中配置一個插件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "
<struts-config>
<data-sources />
<form-beans />
<global-exceptions />
<global-forwards />
<action-mappings >
<action path="/listMyUsers" type="org.shirdrn.struts.action.ListMyUsersAction">
<forward
name="listmyusers"
path="/listmyusers.jsp"
redirect="true" />
</action>
</action-mappings>
<message-resources parameter="org.shirdrn.struts.ApplicationResources" />
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/action-servlet.xml"/>
</plug-in>
</struts-config>
只要這樣配置好,Struts才能初始化Spring的IoC容器,否則Action無法工作。
(7) Action的實現
SpringAction繼承了Spring的ActionSupport,我們將用它來替代所有繼承自Struts的Action類的Action。SpringAction的實現如下所示:
package org.shirdrn.spring.action;
import org.shirdrn.spring.pages.MyUserPage;
import org.springframework.web.struts.ActionSupport;
public class SpringAction extends ActionSupport {
public MyUserPage getMyUserPage(){
return (MyUserPage)getWebApplicationContext().getBean("myUserPage");
}
}
這里,SpringAction就實現了獲取一個MyUserPage的實例的功能,從而通過這個實例實現分頁。
然后,實現一個ListMyUsersAction類,它繼承自SpringAction,能夠啟動Spring的IoC容器,并且獲取一個MyUserPage的實例。ListMyUsersAction類的實現如下所示:
package org.shirdrn.struts.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.shirdrn.spring.action.SpringAction;
import org.shirdrn.spring.pages.MyUserPage;
import org.shirdrn.spring.util.Page;
public class ListMyUsersAction extends SpringAction {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
int pno = (new Integer(request.getParameter("pno"))).intValue();
String hql = "from MyUser";
MyUserPage myUserPage = getMyUserPage();
myUserPage.init(pno, hql);
Page myUserOnePage = myUserPage.getPage();
List myUserList = myUserPage.getPage().getList();
HttpSession session = request.getSession();
session.setAttribute("myUserOnePage", myUserOnePage);
session.setAttribute("myUserList", myUserList);
return mapping.findForward("listmyusers");
}
}
(8) 視圖的實現
JSP頁面,使用Struts標簽實現分頁頁面的顯示。
JSP頁面listmyusers.jsp如下所示:
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html:html locale="true">
<head>
<base href="<%=basePath%>">
<title>查詢記錄列表</title>
<style type="text/css">
body{
background:#000000;
font-size:12px;
color:yellow;
}
a:link{
color:yellow;
text-decoration:none;
}
a:hover{
color:red;
text-decoration:none;
}
a:visited{
color:yellow;
text-decoration:none;
}
</style>
</head>
<body>
<table width="60%" align="center" bgcolor="green" border="1">
<tr>
<th colspan="10">MyUser查詢列表</th>
</tr>
<tr align="center">
<td width="20%"><b>ID</b></td>
<td width="20%"><b>姓名</b></td>
<td width="20%"><b>性別</b></td>
<td width="20%"><b>年齡</b></td>
<td width="20%"><b>住址</b></td>
</tr>
<logic:present name="myUserList">
<logic:iterate id="myUser" name="myUserList" type="org.shirdrn.spring.entity.MyUser">
<logic:present name="myUser">
<tr align="center">
<td width="20%" height="10"><bean:write name="myUser" property="id"/></td>
<td width="20%" height="10"><bean:write name="myUser" property="userName"/></td>
<td width="20%" height="10"><bean:write name="myUser" property="gender"/></td>
<td width="20%" height="10"><bean:write name="myUser" property="age"/></td>
<td width="20%" height="10"><bean:write name="myUser" property="addr"/></td>
</tr>
</logic:present>
</logic:iterate>
</logic:present>
</table>
<table align="center" width="60%" bgcolor="green" border="1">
<tr>
<td align="center" colspan="10">
<logic:present name="myUserOnePage">
<html:link page="/listMyUsers.do?pno=1">首頁</html:link>
<logic:equal name="myUserOnePage" property="hasPreviousPage" value="false">上一頁</logic:equal>
<logic:equal name="myUserOnePage" property="hasPreviousPage" value="true">
<a href="<%=path%>/listMyUsers.do?pno=<bean:write name="myUserOnePage" property="prePage"/>">上一頁</a>
</logic:equal>
每頁<bean:write name="myUserOnePage" property="pageSize"/>條記錄
共<bean:write name="myUserOnePage" property="rowCount"/>條記錄
當前第(<bean:write name="myUserOnePage" property="currentPage"/>/<bean:write name="myUserOnePage" property="totalPage"/>)頁
<logic:equal name="myUserOnePage" property="hasNextPage" value="false">下一頁</logic:equal>
<logic:equal name="myUserOnePage" property="hasNextPage" value="true">
<a href="<%=path%>/listMyUsers.do?pno=<bean:write name="myUserOnePage" property="nextPage"/>">下一頁</a>
</logic:equal>
<a href="<%=path%>/listMyUsers.do?pno=<bean:write name='myUserOnePage' property='totalPage'/>">末頁</a>
</logic:present>
</td>
</tr>
</table>
</body>
</html:html>
(9) 部署Web應用
配置web.xml文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://localhost:8080/SpringHibernateStrutsPage/listMyUsers.do?pno=1
就可以看到數據的分頁顯示,效果如圖所示:
OK,就這么容易。