1、定义通用分页model
package cn.com.bank.mmpf.model;
package cn.com.bank.mmpf.model;
import cn.com.bank.mmpf.util.Constants;
public class PageControl implements java.io.Serializable{
private int pageno=1; //当前页码
private int pagesize=Constants.PAGE_SIZE_DEFALUT; //每页行数
private int rowcount; //总行数
private int pagecount; //总页数
private boolean useprevious;//前一页是否能用
private boolean usebehind;//后一页是否能用
private boolean usepage=true;//是否分页
public int getPageno() {
return pageno;
}
public void setPageno(int pageno) {
this.pageno = pageno;
}
this.pageno = pageno;
}
public int getPagesize() {
return pagesize;
}
return pagesize;
}
public void setPagesize(int pagesize) {
if (pagesize==0){//0-->不分页
usepage=false;
pagecount=1;
pageno=1;
useprevious=false;
usebehind=false;
}
this.pagesize = pagesize;
}
if (pagesize==0){//0-->不分页
usepage=false;
pagecount=1;
pageno=1;
useprevious=false;
usebehind=false;
}
this.pagesize = pagesize;
}
public int getRowcount() {
return rowcount;
}
return rowcount;
}
public void setRowcount(int rowcount) {
this.rowcount = rowcount;
if(usepage){
pagecount=
this.rowcount = rowcount;
if(usepage){
pagecount=
(rowcount % pagesize ==0 )?(rowcount /pagesize ) : ( rowcount /pagesize +1);
useprevious=pageno==1?false:true;
usebehind=pageno==pagecount?false:true;
}
}
useprevious=pageno==1?false:true;
usebehind=pageno==pagecount?false:true;
}
}
public int getPagecount() {
return pagecount;
}
return pagecount;
}
public void setPagecount(int pagecount) {
this.pagecount = pagecount;
}
this.pagecount = pagecount;
}
public boolean isUseprevious() {
return useprevious;
}
return useprevious;
}
public void setUseprevious(boolean useprevious) {
this.useprevious = useprevious;
}
this.useprevious = useprevious;
}
public boolean isUsebehind() {
return usebehind;
}
return usebehind;
}
public void setUsebehind(boolean usebehind) {
this.usebehind = usebehind;
}
this.usebehind = usebehind;
}
public boolean isUsepage() {
return usepage;
}
return usepage;
}
public void setUsepage(boolean usepage) {
this.usepage = usepage;
}
this.usepage = usepage;
}
}
2、hibernate分页实现函数--〉放在底层类中
public class CommonServiceImpl extends HibernateDaoSupport implements CommonService{
。。。
//通用分页处理
public List getListForPage(final String hsql,PageControl pageControl) throws Exception
{
List pagelist=null;
Session session=getSession();
try {
pageControl.setRowcount(getTotalCount(session,hsql)); //更新pagecontrol的各种属性 important
if(pageControl.isUsepage()){ //是否分页
// sql=hsql+ " limit " + (pageNog-1)*page_size + "," +page_size;
// offices= getHibernateTemplate().find(sql);
//被屏蔽掉的是原来的处理
//以下是改过的处理方法
Query query=null;
query=session.createQuery(hsql);
int start=(pageControl.getPageno()-1)*pageControl.getPagesize();
int rowNum=pageControl.getPagesize();
query.setFirstResult(start);
query.setMaxResults(rowNum);
pagelist = query.list();
}else{
pagelist=session.find(hsql);
}
} finally {
session.close();
}
return pagelist;
}
public class CommonServiceImpl extends HibernateDaoSupport implements CommonService{
。。。
//通用分页处理
public List getListForPage(final String hsql,PageControl pageControl) throws Exception
{
List pagelist=null;
Session session=getSession();
try {
pageControl.setRowcount(getTotalCount(session,hsql)); //更新pagecontrol的各种属性 important
if(pageControl.isUsepage()){ //是否分页
// sql=hsql+ " limit " + (pageNog-1)*page_size + "," +page_size;
// offices= getHibernateTemplate().find(sql);
//被屏蔽掉的是原来的处理
//以下是改过的处理方法
Query query=null;
query=session.createQuery(hsql);
int start=(pageControl.getPageno()-1)*pageControl.getPagesize();
int rowNum=pageControl.getPagesize();
query.setFirstResult(start);
query.setMaxResults(rowNum);
pagelist = query.list();
}else{
pagelist=session.find(hsql);
}
} finally {
session.close();
}
return pagelist;
}
//计算表的总行数
private int getTotalCount(Session session, String hql) throws Exception
{
Integer amount = new Integer(0);
int sql_from = hql.indexOf("from");
int sql_orderby=hql.indexOf("order by");//为了改进
String countStr="";
if(sql_orderby>0)
{
countStr="select count(*) "+hql.substring(sql_from,sql_orderby);
}
else
countStr = "select count(*) "+hql.substring(sql_from);
private int getTotalCount(Session session, String hql) throws Exception
{
Integer amount = new Integer(0);
int sql_from = hql.indexOf("from");
int sql_orderby=hql.indexOf("order by");//为了改进
String countStr="";
if(sql_orderby>0)
{
countStr="select count(*) "+hql.substring(sql_from,sql_orderby);
}
else
countStr = "select count(*) "+hql.substring(sql_from);
Query query = session.createQuery(countStr);
if(!query.list().isEmpty()){
amount = (Integer) query.list().get(0);
}
else
return 0;
return amount.intValue();
}
}
if(!query.list().isEmpty()){
amount = (Integer) query.list().get(0);
}
else
return 0;
return amount.intValue();
}
}
3、实际service对象继承commonserviceimpl
public class LogServiceImpl extends CommonServiceImpl implements LogService{
public List getLogByType(Integer logtype, PageControl pageControl) throws Exception{
String hql="from "+Systemlog.class.getName()+" as a where a.baselogtype.id="+logtype+" order by a.opertime desc";
return getListForPage(hql,pageControl);
}
}
public class LogServiceImpl extends CommonServiceImpl implements LogService{
public List getLogByType(Integer logtype, PageControl pageControl) throws Exception{
String hql="from "+Systemlog.class.getName()+" as a where a.baselogtype.id="+logtype+" order by a.opertime desc";
return getListForPage(hql,pageControl);
}
}
4、action实现
public class LogListAction extends BaseAction{
public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception
{
String forward =Constants.FORWORD_FIAL;
LogService service = (LogService) getWebApplicationContext().getBean(Constants.LOG_SERVICE);//获得service对象
Object obj=((DynaActionForm) actionForm).get(Constants.PAGE_CONTROL_MODEL);
Object obj1=((DynaActionForm) actionForm).get(Constants.PAGE_FILTER_ID);
Integer filterid=obj1==null?new Integer(1):(Integer)obj1;
PageControl pageControl=obj==null?new PageControl():(PageControl)obj;
try {
List mainlist=service.getLogByType(filterid,pageControl); //调用分页方法得到list
List filterlist=service.loadAll(Baselogtype.class);
((DynaActionForm) actionForm).set(Constants.PAGE_ENTITY_LIST, mainlist);
((DynaActionForm) actionForm).set(Constants.PAGE_FILTER_LIST, filterlist);
((DynaActionForm) actionForm).set(Constants.PAGE_FILTER_ID,filterid);
((DynaActionForm) actionForm).set(Constants.PAGE_CONTROL_MODEL,pageControl);
forward = Constants.FORWORD_SUCCESS;
} catch (Exception e) {
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError(Constants.ERROR_LIST,e.getMessage()));
saveErrors(request, errors);
}
return actionMapping.findForward(forward);
}
}
5、jsp页面
5.1、分页部分代码:
<logic:greaterThan value="0" name="LogListForm" property="pagecontrolmodel.rowcount">
<p align="right" style="font-size:12px">
共<bean:write name="LogListForm" property="pagecontrolmodel.rowcount"/>行
共<bean:write name="LogListForm" property="pagecontrolmodel.pagecount"/>页
每页行数
<html:select name="LogListForm" property="pagecontrolmodel.pagesize" styleClass="DropDownList" style="width:80px" οnchange="refresh()">
<html:option value="0">不分页</html:option>
<html:option value="10">10行</html:option>
<html:option value="20">20行</html:option>
<html:option value="30">30行</html:option>
<html:option value="50">50行</html:option>
<html:option value="100">100行</html:option>
</html:select>
<logic:equal value="true" name="LogListForm" property="pagecontrolmodel.usepage">
<logic:equal value="true" name="LogListForm" property="pagecontrolmodel.useprevious">
<a href="javascript:goto(1)">首页</a>
<a href="javascript:goto(<bean:write property="pagecontrolmodel.pageno" name="LogListForm"/>-1)">前一页</a>
</logic:equal>
<logic:equal value="false" name="LogListForm" property="pagecontrolmodel.useprevious">
首页
前一页
</logic:equal>
5.1、分页部分代码:
<logic:greaterThan value="0" name="LogListForm" property="pagecontrolmodel.rowcount">
<p align="right" style="font-size:12px">
共<bean:write name="LogListForm" property="pagecontrolmodel.rowcount"/>行
共<bean:write name="LogListForm" property="pagecontrolmodel.pagecount"/>页
每页行数
<html:select name="LogListForm" property="pagecontrolmodel.pagesize" styleClass="DropDownList" style="width:80px" οnchange="refresh()">
<html:option value="0">不分页</html:option>
<html:option value="10">10行</html:option>
<html:option value="20">20行</html:option>
<html:option value="30">30行</html:option>
<html:option value="50">50行</html:option>
<html:option value="100">100行</html:option>
</html:select>
<logic:equal value="true" name="LogListForm" property="pagecontrolmodel.usepage">
<logic:equal value="true" name="LogListForm" property="pagecontrolmodel.useprevious">
<a href="javascript:goto(1)">首页</a>
<a href="javascript:goto(<bean:write property="pagecontrolmodel.pageno" name="LogListForm"/>-1)">前一页</a>
</logic:equal>
<logic:equal value="false" name="LogListForm" property="pagecontrolmodel.useprevious">
首页
前一页
</logic:equal>
<logic:equal value="true" name="LogListForm" property="pagecontrolmodel.usebehind">
<a href="javascript:goto(<bean:write property="pagecontrolmodel.pageno" name="LogListForm"/>+1)">后一页</a>
<a href="javascript:goto(<bean:write property="pagecontrolmodel.pagecount" name="LogListForm"/>)">末页</a>
</logic:equal>
<a href="javascript:goto(<bean:write property="pagecontrolmodel.pageno" name="LogListForm"/>+1)">后一页</a>
<a href="javascript:goto(<bean:write property="pagecontrolmodel.pagecount" name="LogListForm"/>)">末页</a>
</logic:equal>
<logic:equal value="false" name="LogListForm" property="pagecontrolmodel.usebehind">
后一页
末页
</logic:equal>
跳至<html:text property="pagecontrolmodel.pageno" name="LogListForm" styleClass="TextBox" style="width:20px"/><input type="button" value="go" οnclick="check();">
</logic:equal>
</p>
</logic:greaterThan>
后一页
末页
</logic:equal>
跳至<html:text property="pagecontrolmodel.pageno" name="LogListForm" styleClass="TextBox" style="width:20px"/><input type="button" value="go" οnclick="check();">
</logic:equal>
</p>
</logic:greaterThan>
5.2、分页实现配套javascript
<script>
function refresh()
{
document.all("LogListForm").submit();
}
function check()
{
var pageno=document.all("pagecontrolmodel.pageno");
if(!isInt(pageno.value)){alert("非法页数");return;}
var ipageno=parseInt(pageno.value);
var imaxno=parseInt(document.all("pagecontrolmodel.pagecount").value);
if(ipageno<1 || ipageno>imaxno){
alert("页数不在允许的范围内!");return;
}
refresh();
}
{
var pageno=document.all("pagecontrolmodel.pageno");
if(!isInt(pageno.value)){alert("非法页数");return;}
var ipageno=parseInt(pageno.value);
var imaxno=parseInt(document.all("pagecontrolmodel.pagecount").value);
if(ipageno<1 || ipageno>imaxno){
alert("页数不在允许的范围内!");return;
}
refresh();
}
function goto(pageno){
document.all("pagecontrolmodel.pageno").value=pageno;
check();
}
</script>
document.all("pagecontrolmodel.pageno").value=pageno;
check();
}
</script>
2006/4/16
Tomcat Session 持久化
编辑 %TOMCAT_HOME%/CONF/SERVER.XML
<Host appBase="webapps" name="localhost">
<Context path="/store" docBase="store" debug="0" reloadable="true">
<Manager className="org.apache.catalina.session.PersistentManager" >
debug=0;
saveOnRestart="true"
maxActiveSessions="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1"
<Store className="org.apache.catalina.session.FileStore" directory="mydir" />
</Manager>
</Context>
</Host>
<Context path="/store" docBase="store" debug="0" reloadable="true">
<Manager className="org.apache.catalina.session.PersistentManager" >
debug=0;
saveOnRestart="true"
maxActiveSessions="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1"
<Store className="org.apache.catalina.session.FileStore" directory="mydir" />
</Manager>
</Context>
</Host>
配置Tomcat 数据源&连接池
方式一、全局数据库连接池
1、通过管理界面配置连接池,或者直接在tomcat/conf/server.xml的GlobalNamingResources中增加
<Resource name="jdbc/mydb" type="javax.sql.DataSource" password="mypwd" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver" maxIdle="2" maxWait="5000" validationQuery="select 1" username="sa" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb" maxActive="4"/>
2、在tomcat/webapps/myapp/META-INF/context.xml的Context中增加:
<ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/>
这样就可以了。
3、将jdbc驱动放入 %tomcat_home%/common/lib 中
方式二、全局数据库连接池
方式二、全局数据库连接池
1、同上
2、在tomcat/conf/context.xml的Context中增加:
<ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/>
3、同上
方式三、局部数据库连接池
只需在tomcat/webapps/myapps/META-INF/context.xml的Context中增加:
<Resource name="jdbc/mydb" type="javax.sql.DataSource" password="mypwd" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver" maxIdle="2" maxWait="5000" validationQuery="select 1" username="sa" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb" maxActive="4"/>
参数说明:
driveClassName:JDBC驱动类的完整的名称;
maxActive:同时能够从连接池中被分配的可用实例的最大数;
maxIdle:可以同时闲置在连接池中的连接的最大数;
maxWait:最大超时时间,以毫秒计;
password:用户密码;
url:到JDBC的URL连接;
user:用户名称;
validationQuery:用来查询池中空闲的连接。
///--------------------------------------------------------------------------//
一.在tomcat_home/common/lib下放入jdbc的驱动程序,额外说一下,如果是使用sql server的话,有至少两个驱动可以选择,一个是微软提供的,另一个是 jtds,比微软的要好很多,推荐使用
一.在tomcat_home/common/lib下放入jdbc的驱动程序,额外说一下,如果是使用sql server的话,有至少两个驱动可以选择,一个是微软提供的,另一个是 jtds,比微软的要好很多,推荐使用
二.配置文件,tomcat 不同的版本配置文件略有不同,下面以tomcat5..5.*为例。
三.如果配置不正确会出现javax.naming.NameNotFoundException: Name is not bound in this Context 错误
以上三种方式在tomcat 5.5.4下都可以。另外,sql server的jdbc driver是从微软网站上下载的sql server jdbc (sp3)。
以上三种方式在tomcat 5.5.4下都可以。另外,sql server的jdbc driver是从微软网站上下载的sql server jdbc (sp3)。
下面 分别举tomcat5.0 和tomcat 5.5 配置文件 的例子(将此配置文件置于Tomcat /conf/Catalina/localhost 下)
tomcat5.0
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/test">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<!-- Maximum number of dB connections in pool. Make sure you
configure your mysqld max_connections large enough to handle
all of your db connections. Set to 0 for no limit.
-->
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<!-- Maximum number of idle dB connections to retain in pool.
Set to 0 for no limit.
-->
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<!-- Maximum time to wait for a dB connection to become available
in ms, in this example 10 seconds. An Exception is thrown if
this timeout is exceeded. Set to -1 to wait indefinitely.
-->
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<!-- MySQL dB username and password for dB connections -->
<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value>test</value>
</parameter>
<!-- Class name for JDBC driver -->
<parameter>
<name>driverClassName</name>
<value>net.sourceforge.jtds.jdbc.Driver</value>
</parameter>
<!-- Autocommit setting. This setting is required to make
Hibernate work. Or you can remove calls to commit(). -->
<parameter>
<name>defaultAutoCommit</name>
<value>true</value>
</parameter>
<!-- The JDBC connection url for connecting to your MySQL dB.
The autoReconnect=true argument to the url makes sure that the
mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
connection. mysqld by default closes idle connections after 8 hours.
-->
<parameter>
<name>url</name>
<value>jdbc:jtds:sqlserver://url/filedb;charset=gb2312;autoReconnect=true</value>
</parameter>
<!-- Recover abandoned connections -->
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<!-- Set the number of seconds a dB connection has been idle
before it is considered abandoned.
-->
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>
<!-- Log a stack trace of the code which abandoned the dB
connection resources.
-->
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
</ResourceParams>
<ResourceParams name="jdbc/test">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<!-- Maximum number of dB connections in pool. Make sure you
configure your mysqld max_connections large enough to handle
all of your db connections. Set to 0 for no limit.
-->
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<!-- Maximum number of idle dB connections to retain in pool.
Set to 0 for no limit.
-->
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<!-- Maximum time to wait for a dB connection to become available
in ms, in this example 10 seconds. An Exception is thrown if
this timeout is exceeded. Set to -1 to wait indefinitely.
-->
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<!-- MySQL dB username and password for dB connections -->
<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value>test</value>
</parameter>
<!-- Class name for JDBC driver -->
<parameter>
<name>driverClassName</name>
<value>net.sourceforge.jtds.jdbc.Driver</value>
</parameter>
<!-- Autocommit setting. This setting is required to make
Hibernate work. Or you can remove calls to commit(). -->
<parameter>
<name>defaultAutoCommit</name>
<value>true</value>
</parameter>
<!-- The JDBC connection url for connecting to your MySQL dB.
The autoReconnect=true argument to the url makes sure that the
mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
connection. mysqld by default closes idle connections after 8 hours.
-->
<parameter>
<name>url</name>
<value>jdbc:jtds:sqlserver://url/filedb;charset=gb2312;autoReconnect=true</value>
</parameter>
<!-- Recover abandoned connections -->
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<!-- Set the number of seconds a dB connection has been idle
before it is considered abandoned.
-->
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>
<!-- Log a stack trace of the code which abandoned the dB
connection resources.
-->
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
</ResourceParams>
tomcat 5.5
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
driverClassName="oracle.jdbc.driver.OracleDriver"
username="test" password="test"
url="jdbc:oracle:thin:@url:1521:dcdb"
defaultAutoCommit="true" removeAbandoned="true"
removeAbandonedTimeout="60" logAbandoned="true"/>
maxActive="100" maxIdle="30" maxWait="10000"
driverClassName="oracle.jdbc.driver.OracleDriver"
username="test" password="test"
url="jdbc:oracle:thin:@url:1521:dcdb"
defaultAutoCommit="true" removeAbandoned="true"
removeAbandonedTimeout="60" logAbandoned="true"/>