Where The Streets Have No Name

[JSP] 문서간의 이동 관련 스크립트 정리 본문

Developement/Java

[JSP] 문서간의 이동 관련 스크립트 정리

highheat 2006. 5. 8. 21:29

<!--StartFragment-->[ 문서간의 이동 ]


1. 자바 스크립트 document.location.href

  --------------------------------------------
  <%
  response.setHeader ( "Pragma", "No-cache" ); //http1.0
  response.setDateHeader ( "Expires", 0 );
  response.setHeader ( "Cache-Control", "no-cache" ); //http1.1
  %>
 
  <script language="JavaScript">
  document.location.href="/test.jsp";
  </script>
  --------------------------------------------
  refresh가 강제로 안되므로(캐쉬가 잔존) 위와같이 해준다.


2. response.sendRedirect ( )

  --------------------------------------------
  <% response.sendRedirect ( "http://127.0.0.1/test.jsp" ); %>
  --------------------------------------------
  현재문서를 종료하지 않은채 지정문서로 이동한다.(세션을 유지한다.)
  url은 웹서버마다 다르므로 완전한 경로가 안전하다.
  이전의 out 출력이나 스크립트 내용이 안먹는다.


3. response.setHeader ( )

  --------------------------------------------
  response.setHeader ( "Refresh", "0; URL=http://okjsp.pe.kr/" );
  또는
  response.setStatus ( HttpServletResponse.SC_MOVED_PERMANENTLY );
  response.setHeader ( "Location", "/newpath/index.html" );
  --------------------------------------------
  캐쉬를 지우고 이동하는 것으로 생각된다.


4. 액션 forward

  --------------------------------------------
  <jsp:forward page="/test.jsp" />
  또는
  RequestDispatcher rd = getServletContext ( ).getRequestDispatcher ( "/A.jsp" );
  rd.forward ( request, response );
  --------------------------------------------
  현재문서를 종료하고 지정문서로 이동한다.
  이전의 out 출력이나 스크립트 내용이 안먹는다.


5. html 메타테그

  --------------------------------------------
  <meta http-equiv="refresh" content="0;url=/test.jsp">
  --------------------------------------------


6. 문서 포함 include

  --------------------------------------------
  //지시자 include. 컴파일시에 포함
  <%@ include file = "/test.jsp" %>
 
  //액션 include. 실행시에 포함
  <jsp:include page="/test.jsp" flush="true"/>
  --------------------------------------------



7. Servlet/JSP base 경로 사용상의 문제

 

관련 질답
--------------------------------------------
> {forward 질문}
> {윤돈경(guest), dkyoun@lgeds.lg.co.kr}
>
> 문제는 [ 아래경로는 최상위 경로 (~/www)의 하위 경로입니다. ]
>  * 경로구조
>    www/web      <--- JSP 파일
>       /servlet  <--- 서블릿 경로
>
>  1. A.JSP(/web/a.jsp)에서 요청처리를
>  2. B_Servlet(/servlet/xx.xxx.xxx.B_Servlet) 에서 받아서 처리하고
>  3. 위 2의 처리결과를 req에 담아서 다시 A.JSP에 forward
>
> 합니다. 문제는 포워딩 결과로 해당 A.JSP 나오는데...
>
> 1. URL이 B_Servlet의 경로(/servlet/xx.xxx.xxx.B_Servlet)가 나오면서
> 2. A.JSP에서 불러들이는 이미지도 못찾고, 근데 jsp include는 잘 찾네요..
> 3. A.JSP에서 다시 B_Servlet을 요청하면 경로가
>      /servlet/servlet/xx.xxx.xxx.B_Servlet으로 되어서 서블릿이
>      없다고 나옵니다.
>
> 뭐가 문제일까요???
>
> 위와 같이 처리하는 이유는 자료 검색시 검색결과가 나오면서 재검색
> 가능하도록 하기 위함입니다.
> 물론 모든 로직을 JSP 하나로 할 수도 있지만, 사이트 구축전에
> 여러 아키텍쳐를 테스트하기로 해서 이러한 코드를 작성해야 합니다.
>
> 코드 fragment는 다음과 같습니다.
>
>   try {
>     printJspPage(request, response , strJspPage);
>   }
>   catch { }
>   finally { }
>
>
>   // printJspPage() 메쏘드는 아래와 같습니다.
>   // strJspPage는 당근 "A.jsp"로 설정했고,
>   // A.jsp는 WebSphere에서 페이지 기본경로로 잡은 ~/www/web 바로
>   // 하위에 있습니다.
>
> /**
>  * 처리결과를 보일 JSP에 Forwad한다.
>  * @return 없슴
>  */
> public void printJspPage (javax.servlet.http.HttpServletRequest req,
>                           javax.servlet.http.HttpServletResponse res, String filename)
> {
> try{
> javax.servlet.RequestDispatcher lcls_Rd =
>                         getServletContext().getRequestDispatcher(filename);
> lcls_Rd.forward(req, res);
> }
> catch (Exception ex)
> {
> System.out.println("method printJspPage");
> System.err.println(ex.getMessage());
> }
> }
>
>  고견을 바랍니다...


서블렛(/servlet/MyServlet) --(forward)--> JSP (My.jsp)구조에서 결과 My.jsp 가
최종적으로 양산(?)되는 URL은   "/servlet/My.jsp" 가 됩니다.
결국, 각종 이미지나 css 파일들을 절대경로(/web/image/my.gif) 로 사용치 않고,
JSP 내에서 상대경로(<img src="my.gif">) 설정할 경우, 브라우져는 현재 base URL
"/servlet/" 하부에서 my.gif 를 찾게 되므로 "/servlet/my.gif" 를 찾으려 시도하게
됩니다.

따라서, Servlet --> JSP forward 구조에서는 JSP에서 사용하는 image, css, js 파일들의
URL 경로가 반드시 절대 경로 이어야 합니다. (갑갑하죠?)

그런데, 아래의 경우는 좀 다르군요.

> 3. A.JSP에서 다시 B_Servlet을 요청하면 경로가
>      /servlet/servlet/xx.xxx.xxx.B_Servlet으로 되어서 서블릿이
>      없다고 나옵니다.

혹, A.jsp 에서 B_Servlet 를 부를 때, 다음처럼 상대경로로 되어 있는 것 아닌가요?

<form name=x action="servlet/B_Servlet">
...

이렇게 되어 있다면, 현재 base URL이 "/servlet/" 이니까 결국,
"/servlet/servlet/B_Servlet" 이 되겠지요... 이 경우 외엔 없을 듯 한데....

JSP include 는 얘기가 달라요, A_Servlet 에서  forward 할 때, 틀림없이
"/web/A.jsp" 라고 불렀으니, A.jsp 에서 include 되는 JSP나 파일들은 베이스가
"/web/" 이 되는 거죠....( 이미지는 일단 브라우져까지 왔다가 다시 요청하는 거니까
이것과는 얘기가 다르죠)


NOTE: 현재는 WebApp 의 Context 경로가 "/" 로 마추어져 있으니 잘 인식하지 못하실
수 있는데, 예를 들어 examples 라는 WebApp 가 있고,

서블렛은 "/examples/servlet/A_Servlet",
JSP 들은 "/examples/A.jsp"

라고 한다면, A_Servlet 에서 RequestDispatcher를 통해 A.jsp 로 forward() 하실 때,
그 A.jsp 의 URL는 다음과 같아야 합니다.

1) 잘못사용된 예
   javax.servlet.RequestDispatcher rd =
       getServletContext().getRequestDispatcher("/examples/A.jsp");
   rd.forward(req, res);

2) 잘못사용된 예
   javax.servlet.RequestDispatcher rd =
       getServletContext().getRequestDispatcher("A.jsp");
   rd.forward(req, res);

3) 제대로 사용된 예
  javax.servlet.RequestDispatcher rd =
       getServletContext().getRequestDispatcher("/A.jsp");
   rd.forward(req, res);

즉, Context 경로를 생략한 경로를 주어야 한다는 것이지요.

================================================
자바서비스넷 이원영
E-mail: javaservice@hanmail.net
PCS:011-898-7904
================================================

--------------------------------------------
1. sendRedirect() 와 RequestDispatcher() 와의 차이점

sendRedirect()는 일단 브라우저에 redirection하고자 하는 url을 download한 후에
browser가 http header를 분석하여 해당 url로 접속하게 하는 방법입니다.

RequestDispatcher()는 해당 서버의 resource를 memory에 직접 load하여 바로 client에
해당 url의 내용을 download시킵니다. request나 response를 재활용하고자 할때 사용되는
방법입니다.
--------------------------------------------