2012-10-22 84 views
0

目前我有一個工作的應用程序,但我想一些建議,因爲我覺得必須有更好的解決方案。我正在構建的網站上的一項功能是向用戶顯示搜索時的視頻。搜索將通過點擊如"View All Dreamweaver Tutorials"這樣的鏈接完成。搜索中的每個頁面最多有12個視頻,如果搜索更多,則可以單擊鏈接轉到其他頁面。再說一遍,所有的工作都很好,但我不是我的邏輯迷,並且想聽聽有沒有人有更好的解決方案來完成一項非常常見的任務。尋找一個更好的解決方案然後一個數組列表

下面是當用戶點擊一個鏈接,我可能送的參數的例子...

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

哪裏tag是主要的類別,sub是子類,page是當前頁面,他們希望查看。如果用戶給出超出界限的頁面,則它們被導向到特殊屏幕。所以,如果小服務器看到

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

'page = Integer.parseInt(request.getParameter(「page」));'如果'page'丟失,會拋出異常。你可能想要默認第一頁或者什麼,所以也許:'page = Integer.parseInt(request.getParameter(「page」)!= null?request.getParameter(「page」):「0」);' – Windle

+0

如果頁面丟失,他們永遠不會進入代碼的那一部分。上面執行錯誤檢查。 – gmustudent

回答

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 }); 
} 

事實上,這就是所謂的分頁。

+0

+1你在數學上打敗我! :( – Arham

+0

如果頁面是其他東西然後1這不起作用。如果它是2開始將是12 * 2所以24.正確的答案應該是11. – gmustudent

+0

啊,好吧,我認爲你會開始在第0頁:)。如果你的頁面從1開始,你可以使用'ITEMS_PER_PAGE *(page - 1)'和'(ITEMS_PER_PAGE - 1)+(ITEMS_PER_PAGE *(page - 1))'。 – mthmulders

0

有沒有必要硬編碼您的網頁開始停止索引在數組中。想想當你決定在頁面上顯示更多元素時會發生什麼。

使用firstResultmaxResults其中firstResult是您的頁碼和maxResults是單頁上的項目的最大數量。那麼你可以做firstResult * maxResults。例如,參見http://examples.javacodegeeks.com/enterprise-java/hibernate/pagination-in-hibernate-with-criteria-api

+0

你能解釋一下,我沒有完全理解這種傷害。謝謝。 – gmustudent

+0

如果您的代碼編號在您的代碼中進行了硬編碼,那麼您每次需要更改在一個頁面上顯示的元素數量時,都需要對其進行更改。 –

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 
    } 

} 
+0

如果頁面爲2,則不起作用。 – gmustudent

+0

爲什麼起始將是(2 * 12 -12)= 12並且停止將是(2 * 12)= 24 – Abubakkar

相關問題