目前我有一个有效的应用程序,但我想要一些建议,因为我觉得必须有一个更好的解决方案。我正在构建的网站上的一项功能是在用户搜索视频时向其显示视频。搜索将通过单击"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语句来预测页面并返回结果。任何人都可以想到更好的方法来做到这一点。也许一个常见的算法?这么多网站都使用这个功能,所以我知道必须有一个更清洁的方法来解决这个问题。老实说,这是第一件跳入我脑海的事情。非常感谢您的阅读!评论和答案将不胜感激!
答案 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)
无需在数组中对页面启动停止索引进行硬编码。想想当您决定在页面上显示更多元素时会发生什么。
使用firstResult
和maxResults
,其中firstResult
是您的页码,maxResults
是单个页面上的最大项目数。然后你可以firstResult * maxResults
。
答案 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
}
}