我在做分页是遇到了问题, 没有查询条件时分页功能完全实现了,但是添加上查询条件时就不知道如何是好了! 假如我页面上一开始列出的是所有学生的资料,当我查询所有山东青岛的学生时一开始列出了第一页的结果,在点击下一页时如何处理参数传递才能使第二页显示的也是山东青岛的学生。用什么方式处理查询参数才能得到想要的结果集? 求各位大侠帮忙,小弟感激不尽!!

解决方案 »

  1.   


    我用的是strut2中的<s:subset>在list中取出某页的相应数据。
      

  2.   

    你可以当点击下一页按钮的时候用 & 连接符在另加一个参数 i ,这个参数表示的是你要访问第几页,当然你第一次进入的时候,这个参数 i 是没有值的,因为它是你提交下一页的按钮时带的,你需要处理一下,就是如果这个 i 是 null值的话,把它设置为 1,即第一次进入时访问第一页,如果没有设置会俄抛异常的。
      

  3.   

    当然在数目比较多时,你也可以做下拉列表,跳转到你指定的第几页,原理一样,同时加一个  i 参数,
    如果用的是mysql数据库,你可以考虑用limit来逐页的提取,减少数据库的压力,提高查询速度
      

  4.   

    你先把查询的结果封装在一个list中。
    比如说你的list中总共有N条记录,每页显示5条记录,那么就可以先算出需要多少页,通过 i 参数来计算转到第几页, 比如说你开始进入的是第一页,则 i=1,在页面中显示1至1*5条记录,当你通过下一页或者是下拉列表传过来的 i为 4时,则显示4*5到(4+1)*5,即list封装列表中的第20条到25条记录,显示可用get(int i)方法来实现,你试试吧,我的以前就是这么做的
      

  5.   

    简单理解就是得到一个结果集list.然后传到页面。分页代码肯定要接收一个集合去分页的吧。.
      

  6.   

    可以把查询条件存到session中,在action中你以前是从页面得到查询条件,改成先从页面取,取不到再从页面取。取得放到session中.
    我以前就这样做的
      

  7.   

    每一次点击下一页时,同时把查询的条件(String tiaojian)requse存取就可以了,
    后面用判断
    if(tiaojian==null){
     //无条件代码
    }else{
    //条件代码
    }
    其他应该和没条件差不多了
      

  8.   

    一般分页有3种:1数据库分页2jsp标签分页3hibernate
    1:数据库分页比较老套,不建议使用
    2:jsp标签分页,<c:foreach>
    3:hibernate分页很方便建议你去看一下
      

  9.   

    分页
    <%
    BookBean bs = new BookBean();
    List books=bs.getAllBook();
    BookBean rs=null;
    int pageNo = 0;   //将被显示的页面页码
      int pageSize = 6;  //每页显示的记录条数
      int i = 0;   //将被显示的记录行号
      int totalPage = (books.size()-1)/pageSize;  //总页数
      if(request.getParameter("pageNo")!=null)  
          pageNo = Integer.parseInt(request.getParameter("pageNo"));
      if(pageNo!=0) 
          i = pageNo*pageSize;    

    for(int j=0;i<books.size()&&j<pageSize;i++,j++){
    rs =(BookBean) books.get(i);
    String ISBN = rs.getID();
    %>
    <% if(pageNo!=0){ %>
        <a href="booklist.jsp?pageNo=0">首   页</a>
        <a href="booklist.jsp?pageNo=<%=pageNo-1%>">上一页</a>      
    <% }
         if(pageNo!=totalPage){
     %>
        <a href="booklist.jsp?pageNo=<%=pageNo+1%>">下一页</a>
        <a href="booklist.jsp?pageNo=<%=totalPage%>">末   页</a>
      <% } %>
    代码
      

  10.   

    lz 可以自己写个jsp页面专门处理分页(或者自己定义一个tag标签)
    有条件和没有条件有什么区别吗? 没有条件不就是条件为空么,比如
    where id like '%%' where id like '%XXX%'
      

  11.   

    不是有session吗
    你已经取得结果集了,那只是显示的问题了也就是分页
      

  12.   

    我用的hibernate自帶的標簽進行分頁,用起來不錯
      

  13.   

    先将查询结果放到session里面,在每一次将跳转到的页面的页面好通过request转递给ACTION处理,然后将得到的分页数据送到JSP显示
      

  14.   

    对,将数据放到session里,然后再分页处理。。具体可以看16楼的!
      

  15.   

    MySql:select * from student where address='青岛' limit ?,?;
    //第1个?:本页从第几条符合要求的数据开始输出结果
    //第2个?: 本页显示多少条数据Oracle: select B.rn,B.* from (select rownum rn,A.* from (select * from student where address='青岛') A where rownum<=?) where b.rn>?;
    //第1个?:本页要显示的符合要求的最后一条数据行号
    //第2个?: 本页要显示的符合要求的第一条数据行号Hibernate:
     session.setFirstResult(a);//第一条记录号
     session.setMaxResult(b);//本页显示最大记录数
      

  16.   

    Oracle: select B.rn,B.* from (select rownum rn,A.* from (select * from student where address='青岛') A where rownum <=?) B  where b.rn>?; 丢了个'B'
      

  17.   

    Oracle: select B.rn,B.* from (select rownum rn,A.* from (select * from student where address='青岛') A where rownum <=?) B  where b.rn>?; 丢了个'B'
      

  18.   

    /**
     * 查询记录总数
     */
    public int recordCount ;
    /**
     * 
     * @param page
     *  当前页
     * @param pageSize
     *  每页显示的记录数
     * @return
     */

    public List<CommonUser> search(int page,int pageSize)
    {
    List<CommonUser> list = new ArrayList<CommonUser>();
    String sql = "select * from "+
            "(select top "+page*pageSize+" * from commomuser   order by id) as aa"+
            " where id  not in"+
          "( select top "+((page-1)*pageSize)+" id from commomuser "+
             "  order by id)";         ......
            }
      

  19.   

    我是将查询条件放入隐藏表单,当是查询时,表单不为空;全部显示时,表单为空。具体到service中判断,sql加上相应的参数就行了。一点问题都没有。
      

  20.   

    SQL分页的话 在你获得总记录数和分页查询的时候的条件必须一致
      

  21.   

    我通常都会将查询的参数放到一个URL里 做些判断 然后将该参数跟在下一页或者哪一页的URL后面 这是最方便也是最合适的做法 如果LZ为了获得查询条件而把他放到SESSION中就不好了
      

  22.   

    建義的通過后臺的bean 的。這個可以是session 級的。
      

  23.   

    用Struts2+Hibernate,这个我也做过,但跟楼主一样,spring如果配置成prototype的话,如果有参数时,当点击下一页时就直接把数据库的所有结果记录总数,而不是满足条件的记录数,如果配置成session,这时要注意一下数据类型要正确,比如说当我现在点到第6页时,不往下点了,而是做其他工作,然后重新查询,结果这时候他显示的不是第一页而是第6页的信息。很是郁闷。
      

  24.   

    一种就是把查询的值给session,在链接地址处接收一种是把查询的值都提交一次,在链接地址处接收都是要把你查询的值传递给分页后的页面,分页的页面接收就好,具体可以用自己熟练的方式
      

  25.   

    jsp页面中插入代码:
    <%
    String pageString=request.getParameter("page");//获取当前页码字符串 System.out.println("pageString="+pageString);
            String uidString=request.getParameter("uid");
    if (pageString==null||pageString.length()==0)
    {
    pageString="1";
    }
    int currentpage=0;
    currentpage=Integer.parseInt(pageString); //将当前页码字符串转换为整型
    if (currentpage==0)
    {
    currentpage=1;
    }
    Manager manager=new Manager();
    if (uidString!=null)
    {
    System.out.println("uidstring="+uidString);
    Integer uid=Integer.valueOf(uidString);
    System.out.println("uid="+uid);
    manager.Delete(uid);
    uidString=null;
    }
    List hbList=manager.getHbbyPage(currentpage); //读取指定的数据库记录
    request.setAttribute("list", hbList);
    request.setAttribute("hbcount",new Integer(manager.GetHBCount()));
    request.setAttribute("pagecount",new Integer(manager.getTotalPage()));
    request.setAttribute("currentPage", new Integer(currentpage));// 保存当前页码
     %>         /**
     * 分页显示用户数据.
     * 
     * @param currentPage
     *            当前页码, 从 1 开始
     * @param pageSize
     *            每页显示数据量
     * @return 用户数据
     */
    public List getHbbyPage(int currentpage)
    {

    try 
    {
    if (currentpage==0)
    {
    currentpage=1;
    }
    String hqlString="from Hb";
    Query query =session.createQuery(hqlString);
    query.setFirstResult(pagesize*(currentpage-1));
    query.setMaxResults(pagesize);
    return query.list();

    catch (HibernateException e)
    {
    throw e;
    }
    }
      

  26.   

    补充:这里通过地址栏传值
    参考代码:
      第${currentPage}页/共${pagecount}页<br>
    <c:if test="${currentPage > 1}">
           [ <a href="${pageContext.request.contextPath}/show.jsp?page=${currentPage-currentPage}">首页</a> ] 
           [ <a href="${pageContext.request.contextPath}/show.jsp?page=${currentPage-1}">上一页</a> ] 
        </c:if>
        <c:if test="${currentPage <= 1}">
           [ 首页 ] 
           [ 上一页 ] 
        </c:if>
        <c:if test="${currentPage < pagecount}">
           [ <a href="${pageContext.request.contextPath}/show.jsp?page=${currentPage+1}">下一页</a> ]
           [ <a href="${pageContext.request.contextPath}/show.jsp?page=${pagecount}">尾页</a> ]
         </c:if>
        <c:if test="${currentPage >= pagecount}">
           [ 下一页 ] 
           [ 尾页 ] 
        </c:if>
      

  27.   

    SQL分页:  select top 1 * from tb_name where id not in (select top 11 id from tb_name)   现在这里你只要改变1和11这两个值就可以了。
      

  28.   

    我有个笨办法:
    当页面填好查询条件以后点查询的时候跳转到一个action
    进到后台之后根据条件查询(这时可以将查询条件设置到session中)当点击某一页的时候跳转到另一个action:
    1.如果之前没保存到session在跳转的时候把所有条件都组合好(写js用&组合)传到后台
    2.如果保存到session的话就不用组合了......两个action都跳转到同一个页面
      

  29.   

    默认进入该页的时候你查询所有的学生信息,在页面上方做一个下拉列表框。列表值就是所有归属地,你选择一个归属地后提交到本页面(也就是刷新该页),在该页刚进来的时候 你判断下归属地字段是否为空,如果选择了 那么就根据选择的归属地ID查询出该归属地相对应的学生列表(学生信息表中应该有个学生归属地字段,关联归属地表中的ID字段),如果为空则查询出全部学生信息。说白了就是两个SQL语句,用一个判断去分辨执行哪一句的问题。
      

  30.   

    把你所有的检索条件都用一个DTB来保存呀。
    到时候把这个DTB放到session中去。点击下一页的时候,可以重新检索一次数据库嘛!只是多加了点判断页数的代码而已。
      

  31.   

    ,kjnhgvf cf gb njm cl;
      

  32.   

    每次查询完后,保存查询条件就行了,至于怎么保存,方法不少,可以存在session中,request中等等
      

  33.   

    这样可以实现啊 比如 淘宝的分类    江苏   山东  然后 分别点击 山东 或者 江苏 则把下面的 城市调用出来 要实现这个得花  在江苏上面加个连接 如 <a href="cityList.jsp?ParentId=1">江苏</a>
    <a href="cityList.jsp?ParentId=2">山东</a> 架设点击了 江苏 那么 可以获取参数 ParentId的值,根据这个值 重新组合查询的sql语句, 你可以写一个 方法,把 request.getQuerString 作为这个方法的参数,然后 来自动 组合 查询语句的子条件比如 public String fieQuerySql(String queryStr){    //解析request.getQueryString
        String []strs= queryStr.split("&"){
        for(int i=0;i<strs.length;i++){
            String[] tempStrs= strs[i].split("=");
            String paraName=tempStrs[0];    //对应ParentId 
            String paraValue=tempStrs[0];  // 对应 2      
      
        }
        // 自己组合下 字符串 就可以出来 子查询语句    
        }    //希望对你有帮助 。。       }
      

  34.   

    如果参数条件很多的话用hibernate里面的方法,很好用的,很智能的,建议去看看吧!!
      

  35.   

    public void setList(List list) {
    allcount = list.size();
    allpage = (int)Math.ceil(1.0*allcount/pagesize);
    if(currpage>allpage)currpage = allpage;
    if(currpage == 0)currpage = 1;
    setCurrpage(currpage);
    int from = (currpage-1)*pagesize;
    int to = currpage*pagesize;
    if(to>allcount)to=allcount;
    this.list = list.subList(from, to);
    }
    list是查詢出的結果(是否有查詢條件都可以)
      

  36.   

    完整類﹕
    public class PageObj {
    private int pagesize = 50;//每頁條數
    private int currpage = 1;//默認第一頁
    private int ppage;//上一頁
    private int npage;//下一頁
    private int allcount;//總記錄條數
    private int allpage;//總頁數

    private List list;
    public int getAllpage(){
    return allpage;
    }
    public int getAllcount(){
    return allcount;
    }
    public int getCurrpage() {
    return currpage;
    } public void setCurrpage(int currpage) {
    this.currpage = currpage;
    ppage = currpage -1;
    npage = currpage + 1;

    if(ppage <= 0)ppage = 1;
    if(npage >= allpage) npage = allpage;
    } public List getList() {
    return list;
    } public void setList(List list) {
    allcount = list.size();
    allpage = (int)Math.ceil(1.0*allcount/pagesize);
    if(currpage>allpage)currpage = allpage;
    if(currpage == 0)currpage = 1;
    setCurrpage(currpage);
    int from = (currpage-1)*pagesize;
    int to = currpage*pagesize;
    if(to>allcount)to=allcount;
    this.list = list.subList(from, to);
    } public int getNpage() {
    return npage;
    } public void setNpage(int npage) {
    this.npage = npage;
    } public int getPagesize() {
    return pagesize;
    } public void setPagesize(int pagesize) {
    this.pagesize = pagesize;
    } public int getPpage() {
    return ppage;
    } public void setPpage(int ppage) {
    this.ppage = ppage;
    }


    }
      

  37.   

    使用﹕
    String currpagestr  = Utils.getNotNull(request.getParameter("currpage")); if("".equals(currpagestr))currpagestr= "1";
    int currpage = Integer.valueOf(currpagestr);
    PageObj vo = new PageObj(); vo.setCurrpage(currpage); vo.setList(list);
    request.setAttribute("po", vo);
    JSP頁面﹕
    <c:forEach items="${po.list}" var="listName" varStatus="status">
      

  38.   

    smartpagination  开源的  或者类似的开源组件
      

  39.   

    查询条件放session中,request中,链接中,form中
    自己多选一吧。
      

  40.   

    我也遇到过这种情况
    把页面的参数(如 当前页 ,查询关键字等 用隐藏域)传到servlet
    然后在servlet中 request.setAttribute(当前页) setAttribute(关键字)...这里不能用session这样就能解决问题
      

  41.   

    分页的时候加上检索条件就行了,建议你参考一下这种分页:jsp分页源码
      

  42.   

    http://dl4.csdn.net/fd.php?i=41898830277024&s=6e00d89c17df927aedc2dee50d984585
      

  43.   

    用地址重写来传参.
    index.jsp?page=pb.currentPage+1&condition=条件
      

  44.   

    可以给让  form  表单包含这写 分页的按钮...    在表单中加隐式的传递参数  而且这样可以解决中文传参查询的问题   点按钮时提交例如:
    <form  action="????" method="post">
    <input name="name"  value="张三" type="hidden"/>
    <input name="sex" value="男"/>
    ....
    </form>java代码可以用Hibernate的Criteria让它为你拼接sql语句 进行不定参数的查询  及其方便 例如:
    public String query(){
        HttpServletRequest request = ServletActionContext.getRequest();
        
        List<Criterion> criterion = new ArrayList<Criterion>();        if(name != null && name.equals("")){
           criterion.add(Restrictions.eq("name", name));
        }
        ......and more    List<Student> stus = xxxService.findByCritera(criterion);    request.setAttribute("???", stus);
    .........}
    当然 你可以带分页的查  或者说 指定查多少条记录出来
      

  45.   

      很多人我看根本就没做过分页,人家问的是什么都没看清,我替楼主强调一下,人家不是不知道取第几页,每页几条数据这些基本的分页参数,人家问的是查询后分页的问题,如何记住查询条件.
      我做过两种版本的查询后分页,非ajax形式的,就是查询后,显示分页结果时把查询条件写到客户端,在每次"前一页"、"后一页"操作时都提交到后台组合查询条件,比较麻烦;ajax形式的简单多了,因为页面不刷新,查询后查询条件一直保持在客户端,不用传到服务器→服务器写回客户端这么来回折腾,只要每次提交就是了.
      

  46.   

    都所用displaytag的,自动分页,现在都不知道怎么些分页查询了。。