寻找更好的解决方案然后一个数组列表

时间:2012-10-22 13:33:16

标签: java servlets dao

目前我有一个有效的应用程序,但我想要一些建议,因为我觉得必须有一个更好的解决方案。我正在构建的网站上的一项功能是在用户搜索视频时向其显示视频。搜索将通过单击"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语句来预测页面并返回结果。任何人都可以想到更好的方法来做到这一点。也许一个常见的算法?这么多网站都使用这个功能,所以我知道必须有一个更清洁的方法来解决这个问题。老实说,这是第一件跳入我脑海的事情。非常感谢您的阅读!评论和答案将不胜感激!

3 个答案:

答案 0 :(得分: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 });
}

事实上,这称为分页。

答案 1 :(得分:0)

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

使用firstResultmaxResults,其中firstResult是您的页码,maxResults是单个页面上的最大项目数。然后你可以firstResult * maxResults

例如,请参阅http://examples.javacodegeeks.com/enterprise-java/hibernate/pagination-in-hibernate-with-criteria-api

答案 2 :(得分: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
    }

}