0

現在、動作しているアプリケーションがありますが、より良い解決策があるはずだと感じているので、アドバイスをお願いします。私が構築しているサイトの機能の1つは、ユーザーが検索したときにビデオを表示する機能です。検索は、次のようなリンクをクリックして実行されます。検索の"View All Dreamweaver Tutorials"各ページには最大12本の動画があり、検索でさらにクエリが実行された場合は、リンクをクリックして他のページに移動できます。繰り返しますが、すべて正常に動作しますが、私は私のロジックのファンではないので、非常に一般的なタスクに対してより良い解決策があるかどうかを聞きたいと思います。

これは、ユーザーがリンクをクリックしたときに送信する可能性のあるパラメーターの例です...

search?tag=Dreamweaver&sub=CSS&page=1

tagはメインカテゴリ、subはサブカテゴリ、はpage現在のページです。ユーザーが範囲外のページを表示すると、特別な画面が表示されます。したがって、サーブレットが見た場合

search?tag=Dreamweaver&sub=CSS&page=1000

ユーザーをリダイレクトします!

さて、これが送信されるこれらのパラメータを取得する私のサーブレットのビットです...

category = request.getParameter("tag");
subCategory = request.getParameter("sub");
page = Integer.parseInt(request.getParameter("page"));

ArrayList<Integer> startStop = Page.getPageStartStop(page);
int start = startStop.get(0);
int stop = startStop.get(1);

videoList = SearchDAO.getSearchResults(category, subCategory, start, stop);

これが私の論理が気に入らないところです。ご覧のとおり、最初にパラメーターを取得します。かなり正常です。しかし、次に、Pageクラスのメソッドを呼び出して、ページ番号パラメーターを送信します。したがって、この例では、数値1を送信します。次に、このメソッドの目的は、データベースが照会する必要のある開始点と停止点をifステートメントで把握することです。したがって、そのメソッドは次のようになります。

public static ArrayList<Integer> getPageStartStop(int page)
{
    ArrayList<Integer> startStop = new ArrayList<Integer>();

    if (page == 1)
    {
        startStop.add(0);
        startStop.add(12);
        return startStop;
    }
    else if (page == 2)
    {
        startStop.add(11);
        startStop.add(23);
        return startStop;
    }
        ......
}

したがって、たとえばページ1が送信される場合、メソッドは開始に0を返し、停止に12を返し、それらの値をDAOに送信して、クエリが開始場所と停止場所を認識できるようにします。以下は私のDAOの抜粋であり、最後の2つの疑問符が私の開始と終了になります。

preparedStatement = connection.prepareStatement("SELECT * FROM videos WHERE category = ? AND subCategory = ? LIMIT ?,?");

したがって、問題は、Pageクラスがページを予測してその結果を返すために多くのifステートメントを必要とすることです。他の誰かがこれを行うためのより良い方法を考えることができますか?多分一般的なアルゴリズム?非常に多くのWebサイトがこの機能を利用しているため、この問題を実行するためのよりクリーンな方法が必要であることを私は知っています。正直なところ、最初に頭に浮かんだのはそれだけでした。読んでくれてありがとう!コメントと回答をいただければ幸いです。

4

3 に答える 3

1

多分あなたはこのようなことをすることができます

private static int ITEMS_PER_PAGE = 10;

public static List<Integer> getPageStartStop(int page) {
    int start = ITEMS_PER_PAGE * (page-1); // will return 0 for page 1, 10 for page 2, etc...
    int stop = (ITEMS_PER_PAGE * page) + 1; // will return 11 for page 1, 21 for page 2, etc...

    return Arrays.asList(new Integer[] { start, stop });
}

そして確かに、これはページネーションと呼ばれます。

于 2012-10-22T13:43:15.067 に答える
0

ページの開始停止インデックスを配列にハードコーディングする必要はありません。ページにもっと多くの要素を表示することにしたときに何が起こるかを考えてください。

使用firstResultmaxResults場所firstResultはページ番号で、maxResultsは1ページのアイテムの最大数です。その後、あなたはすることができますfirstResult * maxResults

たとえば、http://examples.javacodegeeks.com/enterprise-java/hibernate/pagination-in-hibernate-with-criteria-apiを参照してください。

于 2012-10-22T13:46:35.047 に答える
0
public static ArrayList<Integer> getPageStartStop(int page)
{
    ArrayList<Integer> startStop = new ArrayList<Integer>();
    int NoOfItems = 12;
    if (page > 0 && page < 1000)
    {
        startStop.add(page*NoOfItems - NoOfItems);//will return 0 for page 1
        startStop.add(page*NoOfItems);//will return 12 for page 1
        return startStop;
    }else{
            //your logic if page number exceeds than your set limit or it is less than 1
    }

}
于 2012-10-22T13:47:08.920 に答える