서블릿에서 제어권을 다른 페이지로 넘길때 RequiestDispatcher.forward(..) 메소드를 이용한다. dispatcher 인스턴스를 얻는 두가지 경로가 존재하는데 하나는 ServletRequest를 통해서, 그리고 다른 하나는 ServletContext를 통해서이다.

제어권을 넘겨받을 페이지의 uri 를 getRequestDispatcher(...) 메소드의 파라미터로 전달하는데 유의할 점이 있다.


http://www.xxxx.com/MyApp/chap03/index.jsp

    //ContextName

    assertEquals("/MyApp", servletConfig.getServletContext().getContextPath());
    //requestURI

    assertEquals("/MyApp/chap03/index.jsp", request.getRequestURI());

    ServletContext.getRequestDispatcher(param1);
    ServletRequest.getRequestDispatcher(param2);

ServletContext 인스턴스의 getRequestDispatcher 에 전달되는 param1 은 절대경로 "/" 으로 시작해야 함. 그렇지 않으면 IllegalArgumentException이 던져진다.

param2 는 param1과 같이 절대 경로로 시작할 수도 있고 상대 경로로 시작할 수도 있다.

현재의 페이지 index.jsp 가 chap03에 위치할 때

    assertEquals("/MyApp/chap03/index.jsp", request.getRequestURI());

같은 디렉토리 내의 /MyApp/chap03/result.jsp 로 이동을 하려면 다음의 세가지 방법이 가능하다.

    ServletContext.getRequestDispatcher("/chap03/result.jsp");
    ServletRequest.getRequestDispatcher("/chap03/result.jsp");
    ServletRequest.getRequestDispatcher("result.jsp"); // 상대 경로 OK!

* getRequiestDispatcher에 전달되는 uri는 contextPath 값이 빠지는 점에 유의.

만일 하위 경로에 있는 /MyApp/chap03/user/user.jsp 로 이동해야 한다면


    ServletContext.getRequestDispatcher("/chap03/user/user.jsp");
    ServletRequest.getRequestDispatcher("/chap03/user/user.jsp");
    ServletRequest.getRequestDispatcher("user/user.jsp");

이 가능하다.

현재 디렉토리(/MyApp/chap03 )에서 상위 디렉토리(/MyApp)로 이동한다면

    ServletContext.getRequestDispatcher("/MyApp");
    ServletRequest.getRequestDispatcher("/MyApp");
    ServletRequest.getRequestDispatcher("../");

으로 할 수 있다.

상대 경로를 줄 때 ../ 는 ServletContext가 나타내는 디렉토리까지만 이동이 가능하다. 만일 그 이상 상위의 디렉토리에까지 이르게 된다면 NullPointerException 이 던져진다.

'Dev' 카테고리의 다른 글

[ DBUnit ] How to reset auto incremental column  (0) 2007.12.24
JavaScript에서 this의 의미  (5) 2007.12.22
fairly considerable SWT articles  (0) 2007.12.22
Posted by yeori
,