2012-10-22 3 views
0

현재 저는 제대로 작동하는 응용 프로그램을 가지고 있지만 더 나은 해결책이 있어야한다고 생각하기 때문에 몇 가지 조언을 듣고 싶습니다. 내가 만들고있는 사이트의 기능 중 하나는 사용자가 검색 할 때 동영상을 표시하는 기능입니다. 검색은 "View All Dreamweaver Tutorials"과 같은 링크를 클릭하여 수행 할 수 있습니다. 검색의 각 페이지에는 최대 12 개의 비디오가 있으며 검색 결과가 더 많으면 다른 페이지로 이동하는 링크를 클릭 할 수 있습니다. 다시 말하지만, 모든 것이 정상적으로 작동하지만 내 논리의 팬이 아니며 매우 일반적인 작업에 더 나은 솔루션을 제공하는 사람이 있다면 듣고 싶습니다. 여기 더 나은 솔루션을 찾고 나서 배열 목록을 찾으십시오

sub는 하위 범주입니다 tag이 메인 카테고리가

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

... 사용자가 링크를 클릭 할 때 내가 보낼 수 있습니다 매개 변수의 예, 그리고 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 스 니펫이며 마지막 두 개의 물음표는 나의 시작과 멈춤이됩니다.

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

그래서 문제는 그 페이지 클래스는 문이 페이지를 예측하고 그 결과를 반환하는 경우를 많이 필요로합니다. 다른 사람이 이것을 할 수있는 더 좋은 방법을 생각할 수 있습니까? 아마 일반적인 알고리즘일까요? 많은 웹 사이트에서이 기능을 활용하므로이 문제를 해결할 수있는 더 깨끗한 방법이 있어야합니다. 그것은 솔직히 내 마음 속으로 뛰어든 첫 번째 일이었습니다. 읽어 주셔서 대단히 감사합니다! 댓글과 답변은 크게 감사하겠습니다!

+0

'page = Integer.parseInt (request.getParameter ("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

관련 문제