web-dev-qa-db-ja.com

ページネーションロジックの書き方は?

誰かが私が取り組んでいる検索ページのページネーションロジックを書くためのアイデア/ロジックを提供できますか?私が持っている情報は総ページ数その検索のために-1ページあたり10レコードまた、前と次の両方のページ番号が送信されます(ロジックの記述に問題はありません)私がする必要があるのは、その情報を取得して入力することです。また、現在のページの情報も取得しています。以下のように10ページしか表示できません。

<previous 1 |2 |3 | 4| 5 | 6 | 7 | 8 | 9 | 10 next>

合計ページ数が15で、ユーザーが[次へ]をクリックすると、次のように表示する必要があります。

<previous 2 |3 |4 |5 |6 |7 |8 |9 |10 |11 next>

いつでも、ページネーションに10ページを表示する必要があります。

 #set($start = 1)
 #set($end = $Integer.parseInt($searchTO.getPagination().getNumberofPages()))
 #set($range = [$start..$end])

#set($iter = 1)
            #foreach($i in $range)
              #foreach($link in $searchTO.getPagination().getDirectPageLinks())
                    #if($i == $iter)
                        #if ($Integer.parseInt($searchTO.getPagination().getPageNumber())==$iter)
                            <a class="search_current" href="/?_page=SEARCH&_action=SEARCH$link">$i &nbsp|</a>
                        #else
                            <a href="/?_page=SEARCH&_action=SEARCH$link">$i &nbsp|</a>
                        #end
                        #set($iter = 1)
                        #break
                    #else
                        #set($iter=$iter+1)
                    #end

                 #end

            #end
7
pushya

これが私がそれを実装する方法です:データをフィルタリングし、ページネーション関連の情報を含むFilterクラスを作成することは一般的に良い考えです。私はこのようなものを使用します:

_public abstract class Filter{

     /** Member identifier for the current page number */
     private int currentPageNo;

     /** Member identifier for the current start page number in the page navigation */
     private int currentStartPageNo;

     /** Member identifier for the current end page number in the page navigation */
     private int currentEndPageNo;

     /** Member identifier for the number of elements on a page */
     private int elementsPerPage;

     /** Member identifier for the number of pages you have in the navigation (i.e 2 to  11 or 3 to 12 etc.) */      
     private int pageNumberInNavigation;

     public abstract Query createCountQuery();

     public abstract Query createQuery();

     public void setCurrentPageNo(){
         //Your code here
         //Validation, variable setup
     }

     public Long getAllElementsCount(){
          //Now this depends on the presistence framework you use, this code is
          //just for guidance and has Hibernate-like syntax
          Query query = createCountQuery();
          List list = query.list();
          return !list.isEmpty() && list.get(0) != null ? query.list().get(0) : 0;
     }

     public List getElements(){
          //Now this depends on the presistence framework you use, this code is
          //just for guidance and has Hibernate-like syntax
         Query query = createQuery();
         int from = ((currentPageNo - 1) * elementsPerPage);
         query.setFirstResult(from);
         query.setMaxResults(elementsPerPage);
         //If you use Hibernate, you don't need to worry for null check since if there are no results then an empty collection is returned
         return query.list();
     }

     public List getAllElements(){
         Query query = createQuery();
         return query.list();
     }

     public void refresh(){
         //Your code here
     }

     public List next(){
         //Move to the next page if exists
         setCurrentPageNo(getCurrentPageNo() + 1);
         getElements();
     }

     public List previoius(){
         //Move to the previous page if exists
         setCurrentPageNo(getCurrentPageNo() - 1);
         getElements();
     }

}
_

フィルタの特別なサブクラス(取得するものに応じて)を持つことができ、各サブクラスはそれをcreateCountQuery()およびcreateQuery()に実装します。

次に、FilterVelocityコンテキストに配置すると、このクラスから必要なすべての情報を取得できます。

コースの現在のページを設定すると、必要な他のすべての情報(つまり、currentStartPageNo、currentEndPageNo)が更新されます。

フィルタを初期状態に戻すためのrefresh()メソッドを使用することもできます。

そしてもちろん、ユーザーがFilterが属する検索ページをナビゲートしている間、セッションで同じフィルターのインスタンスを保持する必要があります(つまり、Struts、TurbineなどのWebフレームワーク)。

これは単なるガイドラインであり、アイデアであり、完全に記述された実行可能コードではなく、ある方向に進むための単なる例です。

また、ページネーションをサポートする jqGrid というjQueryプラグイン(データを取得するにはバックアップが必要です)と、さらに多くの優れた機能をお勧めします。これを使用して、データをグリッドに表示できます。 Velocityと一緒に使っても問題ありません。フィルタツールバー、編集可能なセル、JSONXMLでのデータ転送など、非常に便利で便利な機能がたくさんあります。正直なところ、必要なページ付けがあるかどうかはわかりません(Iナビゲーションに表示されるページが1つだけで使用し、ページをクリックすることはできません。次の前のボタンを使用してナビゲートするだけです)が、サポートされている場合があります。

10
Atticus

サーバー側のページ付けすべてのデータを1ページに表示するには、ユーザーの注意を引くために部分に分割します。私は display-tag を使用しています(これを使用するには、POJOクラスの1つのフィールドを維持して、すべてのレコードデータを監視します)

<form:form commandName="empdto" action="" method="post"> 
    <h2 align="center">Employee List</h2>                       
    <display:table id="row_id" export="false"  name="empdto.empList" requestURI="/list.form" pagesize="15" cellpadding="2px;" cellspacing="2px;"  >  <!-- class="its" -->
        <display:column property="id" title="ID" sortable="false"  style="border:1;"  />
        <display:column property="name" title="Name" sortable="true" style="border:1;"   /> <!-- sortProperty="name.firstname" -->
        <display:column property="age" title="Age" sortable="true"  style="border:1;" />
        <display:column property="salary" title="Salary" sortable="true"  style="border:1;" />
        <display:column property="address" title="Address" sortable="true" style="border:1;"  />  <!-- style="width:100px" -->

        <display:column title="Edit">        
            <c:set var="clm_id" value="${row_id.id}" />
            <a href="${pageContext.request.contextPath}/editemp.form?id=${clm_id}" >Edit</a> 
        </display:column>
        <display:column title="Delete">        
            <c:set var="clm_id" value="${row_id.id}" />
            <a href="${pageContext.request.contextPath}/deleteEmp.form?id=${clm_id}" onclick="selectobjID(${clm_id})">Delete </a> 
        </display:column>    
    </display:table>                
</form:form>
<%@taglib uri="http://displaytag.sf.net" prefix="display" %>
2
Yash

この既存の質問を参照してください:Javaでのページ付け

JPanelを使用した別のページ付け、コードに従ってこれを変更します。

ページネーションの概念はすべての言語で同じであり、コードの実装には言語に基づいて少し変更を加える必要があります。

Javaページネーション

詳細については、もう1つの既存の質問を参照してください。

Javaでのページ付け?

その他の外部サイトのURL:-

1
Siva Charan