struts+hibernate的通用分页程序

本文介绍了一种结合Struts和Hibernate实现的通用分页程序。该程序通过定义一个Dao类并让其他数据库的Dao类继承,实现了数据的分页查询及页脚显示。文章详细介绍了Dao类的实现细节,包括如何获取数据总数、如何实现分页逻辑等。
struts+hibernate的通用分页程序
2007-06-27 14:18
Jpage分页—struts+hibernate的通用分页程序
本文源自昨夜风网站( www.zuoyefeng.com )
名 声显赫而招摇的数据持久层框架Hibernate,通过query.setFirstResult和query.setMaxResult来实现了对数据 的分页,这个分页的实质在SqlServer中是TOP N的方法,Oracle是rownum<n方法。即直接通过SQL语句,来得到当前页所需的数据。

但是,Hibernate分页,并不能得到页脚,所以尚不通用。承接Jpage分页的方便性,写了这版分页,以方便已与群众。

下面,就是在Hibernate下的通用分页,属于Jpage分页的第三项功能。思路是定义一个Dao类,让其它数据库的dao都继承这个Dao类。


Dao类源文件:

 


 

package com.xdf.dao;

import java.io.*;
import java.sql.*;
import java.util.*;
import javax.servlet.http.*;
import org.hibernate.*;
import org.hibernate.criterion.Projections;

import com.xdf.hibernate.HibernateSessionFactory;

public class Dao {

HttpServletRequest request;

HttpServletResponse response;

Session session;

//定义List集合
private List list;

public int intCountic;

public int PageSize;

public int intPageCount;

public int intPage;

public String nowPage;

public String HttpFile;


//取得网址是的参数
String PageParameter;

public Dao(HttpServletRequest request, HttpServletResponse response) {

    this.request = request;
    this.response = response;
}

/*
    *******得到Session**********
    */
public Session getSession() {
    session = HibernateSessionFactory.getSession();
    return session;

}

//添加数据
public void add(Object obj) {
}

//修改数据
public void mod(Object obj) {
}

//普通查询
public List list() {
    return null;
}



public List jlist(Object query, String countsql)
{

  
    Query q=null;
    Criteria cri=null;
    List li=null;
    

    boolean bool=false;;
  
    //得到记录总数
          if(query instanceof Query) {
           q=(Query)query;
           bool=true;
     intCountic = getCountJsql(countsql);
   
    }
        
          else if(query instanceof Criteria) {
          
           cri=(Criteria)query;
           li=cri.list();
         
       
           if(li.size()==0)
            intCountic=0;
           else
            intCountic=li.size();
       
    }
          else
          {
         
           System.out.println("出错提示:参数不正确");
           return null;
          }
        
     
        
    try
    {
    //每页记录数
        if (PageSize == 0)
     PageSize = 20;

    //获得url,如 /user/china.jsp
    HttpFile = request.getRequestURI();

    //获得当前页数
    nowPage = request.getParameter("pages");

    //取得网址是的参数
    PageParameter = this.urlPath(request);

    //如果没有pages参数,则让页数为1
    if (nowPage == null) {
     intPage = 1;
    }

    else {
     intPage = Integer.parseInt(nowPage);
     if (intPage < 1) {
      intPage = 1;
     }
    }

 

    //得到分页总数
    intPageCount = ((intCountic + PageSize) - 1) / PageSize;

    if (intPage > intPageCount) {
     intPage = intPageCount;
    }
    
//    得到list集合
   
     if(bool)
     list = q.setFirstResult((intPage - 1) * PageSize).setMaxResults(PageSize).list();    
     else
        list =cri.setFirstResult((intPage - 1) * PageSize).setMaxResults(PageSize).list();
   

   
    }
    catch(Exception ex)
    {
     ex.printStackTrace();
    }
    finally
    {
     
    }
  
    //将分页和页脚传到request中
          request.setAttribute("list", list);
          request.setAttribute("foot", PageFooter());
    return list;
}






public List jlist(Query query)
{
  
      String[] str = query.getQueryString().split("from");  
      String countsql ="select count(*) from "+str[1].trim();   
      return jlist(query,countsql);  
  
}

public List jlist(Criteria query)
{
  
    return jlist(query,"");
   
  
}


//汇总语句,得到记录总数
public int getCountJsql(String countsql) {
    Query q = getSession().createQuery(countsql);

    List cc = q.list();
    Integer a = (Integer) cc.get(0);
    return a.intValue();
  

}

//页脚显示
/**
    * 显示分页内容
    * @return
    */
public String PageFooter() {


    if (list.size() <= 0) {
         return "<span style=\"color:#FF3300;font-size:14px;\">对不起,暂无记录!</span>";
          }
  
    String style = "<style> \n";
    style += ".page {color: #333333; background-color: #F3F3F3; height: 18px;width: 36px;";
    style += "border: 1px solid #333333;margin-right: 1px; margin-left: 1px;} \n";
    style += " .fytd {font-size: 12px; color: #333333;}\n";
    style += ".fy:link {color: #333333;text-decoration: underline;font-size: 12px;} \n";
    style += ".fy:visited {color: #333333;text-decoration: underline;font-size: 12px;} \n";
    style += ".fy:hover{color: #000000;text-decoration: none;border: 1px solid #999999;";
    style += "background-position: center center;font-size: 12px; background-color: #FFFFFF;} \n";
    style += ".fy:active {color: #000000;text-decoration: none;border: 1px solid #999999;";
    style += "background-position: center center;padding: 1px 1px 0px;font-size: 12px;background-color: #FFFFFF;} \n";
    style += "</style> \n";

    String str = "";
    int prev = intPage - 1;
    int next = intPage + 1;
    str = str
      + "<table width=100% border=0 cellspacing=0 cellpadding=1 class=fytd>";
    str = str + "<tr><td width=45%>共计:<font color=#FF3300>[" + intCountic
      + "]</font>条 <font color=#FF3300> [" + intPageCount
      + "]</font>页";
    str = str + " 第<font color=#FF3300>[" + getIntPage()
      + "]</font>页</td><td width=55%>";
    str = str
      + "<table width=275 border=0 align=right cellpadding=0 cellspacing=0 class=fytd>";
    //*******
    String pstr = HttpFile + "?" + PageParameter.replace("&pages=", "");
    pstr = pstr.replace("?pages=", "");
    str = str + "<form action=" + pstr
      + " name=formin method=post><tr><td width=195>";
    if (intPage > 1) {
     str = str + " <A href=../../../" + HttpFile + "?" + PageParameter + "1"
       + " class=fy>[首页]</A> ";
    } else {
     str = str + " [首页] ";
    }
    if (intPage > 1) {
     str = str + " <A href=../../../" + HttpFile + "?" + PageParameter + prev
       + " class=fy>[上一页]</A> ";
    } else {
     str = str + " [上一页] ";
    }
    if (intPage < intPageCount) {
     str = str + " <A href=../../../" + HttpFile + "?" + PageParameter + next
       + " class=fy>[下一页]</A> ";
    } else {
     str = str + " [下一页] ";
    }
    if (intPageCount > 1 && intPage != intPageCount) {
     str = str + " <A href=../../../" + HttpFile + "?" + PageParameter
       + intPageCount + " class=fy>[尾页]</A>";
    } else {
     str = str + " [尾页]";
    }
    str = str
      + "</td><td width=80 align=right><input name=pages type=text class=page value="
      + intPage
      + " size=3 maxlength=5 onkeyup=javascript:value=value.replace(/[^\\d]/g,'')>";
    str = str
      + "<input name=Submit2 type=submit class=page value=转到></td></tr></form></table>";
    str+="</td></tr></table>";
    return style + str;
}

/**
    * 对有参数的网址进行改造。。
    * 如 index.jsp?id=23&class=23
    */

public String urlPath(HttpServletRequest request) {
    String path = "";
    String pagepath = "pages=";
    String url = request.getQueryString();

    //如果无参数
    if (url == null || url.equals("")) {
     return pagepath;
    }

    List lista = new ArrayList();
    StringTokenizer ss = new StringTokenizer(url, "&");

    while (ss.hasMoreTokens()) {
     String s = ss.nextToken();
     if (s.indexOf("pages") == -1)
      lista.add(s);
    }

    for (int i = 0; i < lista.size(); i++) {
     String param = "";
     try {
      param = new String(lista.get(i).toString().getBytes(
        "iso-8859-1"), "gb2312");
     } catch (UnsupportedEncodingException e) {

      e.printStackTrace();
     }
     path += param + "&";
    }

    return path + pagepath;

}

public int getIntCountic() {
    return intCountic;
}

public void setIntCountic(int intCountic) {
    this.intCountic = intCountic;
}

public int getIntPage() {
    return intPage;
}

public void setIntPage(int intPage) {
    this.intPage = intPage;
}

public int getIntPageCount() {
    return intPageCount;
}

public void setIntPageCount(int intPageCount) {
    this.intPageCount = intPageCount;
}

public String getNowPage() {
    return nowPage;
}

public void setNowPage(String nowPage) {
    this.nowPage = nowPage;
}

public int getPageSize() {
    return PageSize;
}

public void setPageSize(int pageSize) {
    PageSize = pageSize;
}
}

/**
* 注意事项:
* 1、可传递Query或Critera参数
* 2、传递Query对象时,不能使用包括?号的HQL语句。
* 3、使用Critera时,是将所有数据读到List中,从而获得记录数,经测试5万条记录内,差别不明显
    *
*/


产品dao类(具体dao):

 


 

 

package com.xdf.dao;
import java.util.List;
import javax.servlet.http.*;
import org.hibernate.*;
import org.hibernate.Transaction;
import com.xdf.bean.PInfo;
import com.xdf.hibernate.HibernateSessionFactory;
import com.xdf.struts.form.*;
import javax.servlet.http.*;


public class PinfoDao extends Dao {

public PinfoDao(HttpServletRequest request,HttpServletResponse response)
{
    super(request,response);
}


//添加产品   
public void add(Object po) { }
//修改产品   
public void mod(Object po) { }

  //分页查询
    public List list() {  
    Query query =getSession().createQuery("from PInfo");

    //想使用分页,将Query作为参数,传给jlist方法就可以了,这时就可以得到列表和页脚。
    //HQL查询、条件查询都返回Query对象,所以都可以。
     List li=jlist(query);
     //或者 List li=jlist(query,PInfo);
    return li;  
    }


//汇总查询
public List count()
{
return null;
}

   
}



3、Struts的Action调用dao:


public ActionForward execute(ActionMapping mapping, ActionForm form,
     HttpServletRequest request, HttpServletResponse response) {
    System.out.println("aabbcc");
PinfoDao dao = new PinfoDao(request,response);
    dao.list();
    return mapping.findForward("list");
  
}



4、在JSP中显示:这里采用的是DIV布局


    <ul>
     <li>产品名称</li>
     <li>产品类别</li>
     <li>产品价格</li>
     <li>操      作</li>
     </ul>
   
  
     <logic:iterate id="da" name="list">
      <ul>
     <li><bean:write name="da" property="PName" /></li>
     <li><bean:write name="da" property="PType" /></li>
     <li><bean:write name="da" property="PPrice" /></li>
     <li><a href="prod.do id=<bean:write name="da" property="PId" />">删除</a></li>
     </ul>
     </logic:iterate>
   
     <ul>
     <li>
     <bean:write name="foot" filter="false"></bean:write>
     </li>
     </ul>
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
【集群划分】基于kmeans的电压调节的集群划分【IEEE33节点】内容概要:本文围绕基于KMeans算法的电压调节集群划分展开,以IEEE33节点配电网为研究对象,探讨含分布式光伏的配电网中电压协调控制问题。通过KMeans聚类算法将网络节点划分为若干电压调控集群,旨在降低电压越限风险、提升配电网运行稳定性。文中结合Matlab代码实现,详细展示了集群划分过程、聚类结果可视化及后续电压协调控制策略的设计思路,适用于电力系统中分布式能源接入带来的电压管理挑战。该方法有助于实现分区治理、优化资源配置,并为后续的分布式控制提供结构基础。; 适合人群:具备电力系统基础知识,熟悉Matlab编程,从事配电网优化、分布式能源管理或智能电网相关研究的研究生及科研人员;有一定机器学习背景的工程技术人员。; 使用场景及目标:①应用于含高渗透率光伏发电的配电网电压调控研究;②用于复现IEEE33节点系统中的集群划分与电压协调控制模型;③支撑科研论文复现、课题开发与算法验证,推动智能配电网的分区协同控制技术发展; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点关注KMeans在电网拓扑数据上的特征选取与距离度量方式,理解聚类结果对电压控制性能的影响,并可进一步拓展至动态聚类或多目标优化集成。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值