0

目前我有一个有效的应用程序,但我想要一些建议,因为我觉得必须有一个更好的解决方案。我正在构建的网站上的一项功能是在用户搜索视频时向他们显示视频。搜索将通过单击链接完成,例如"View All Dreamweaver Tutorials"搜索中的每个页面最多有 12 个视频,如果搜索查询更多,则可以单击链接转到其他页面。同样,一切正常,但我不喜欢我的逻辑,想听听是否有人对非常常见的任务有更好的解决方案。

这是用户单击链接时我可能会发送的参数示例...

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

哪里tag是主类,sub是子类,page是他们想看的当前页面。如果用户给出的页面超出范围,他们会被引导到一个特殊的屏幕。所以如果 servlet 看到

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

它会重定向用户!

现在,这是我的一些 servlet,它抓取这些发送的参数......

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 的片段,最后两个问号成为我的开始和停止。

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

所以问题是 Page 类需要大量的 if 语句来预测页面并返回它们的结果。其他人能想出更好的方法来做到这一点。也许是一个常见的算法?很多网站都使用了这个功能,所以我知道必须有一种更简洁的方法来解决这个问题。老实说,这只是跳入我脑海的第一件事。非常感谢您的阅读!评论和答案将不胜感激!

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

无需在数组中硬编码您的页面开始停止索引。想想当您决定在页面上显示更多元素时会发生什么。

Use firstResultand maxResultswhere firstResultis your page number and maxResultsis the maximum number of items on a single page。然后你可以做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 回答