Tag Archives: servlet

Spring MVC jsp에서 원래 요청된 url 확인

http;//www.xxx.com/test/test.do 호출시 request.getRequestURL()로 읽는 경우 servlet에서는 /test/test.do를 반환하지만, forward된 jsp페이지에서는 해당 jsp페이지의 경로를 반환한다.

내가 원하는건 jsp에서도 /test/test.do로 원래 호출된 URL인데…..
검색을 좀 해보니 servlet spec 정의시 forward되는 경우 “javax.servlet.forward.request_uri”로 setAttribute() 된 후에 jsp로 넘어가니 jsp에서 아래와 같이 읽으면 원래 url 조회 가능.

(String) request.getAttribute(“javax.servlet.forward.request_uri”)

HttpServletResponse 객체에서 PrintWriter 객체를 얻어서, 직접 출력시 contentType 처리.

다음과 같이 HttpServletResponse 객체에서 PrintWriter객체를 얻어서, 직접 텍스트를 출력할 경우 의도와 달리 브라우저 레벨에서는 해당 컨텐츠를 일반 텍스트로 인식하여, html파싱을 수행하지 않고, 코드를 그대로 화면에 출력하는 현상이 발생하는 경우가 있다.
(사실 현재 투입된 프로젝트의 소스를 분석하다 보니 그렇게 되어 있더라는…….  운영기에서 사용하는 WAS에서는 친절하게 알아서 헤더를 세팅해주는지 문제가 없는듯 하나, 개발환경의 WAS는 좀 더 엄격히 처리되는 다른 제품을 사용하다 보니 아래의 문제가 발생해서…..해결책을 찾아봄………..  )

public ModelAndView testWrite(HttpServletRequest request, HttpServletResponse response) throws Exception {
    PrintWriter out = response.getWriter();
    out.println("<HTML><HEAD><TITLE>TEST</TITLE>");
    out.println("<SCRIPT LANGUAGE=\"JAVASCRIPT\">");
    out.println(" function fnForward() {");
    out.println(" document.family.submit(); ");
    out.println(" }");
    out.println("</script></head>");
    out.println("<body onload=\"fnForward();\">");
    out.println(" <form name=\"family\" action=\"http://xxx.com\" method=\"post\">");
    out.println(" <input name=\"login_id\" type=\"hidden\" value=\"test\">");
    out.println(" <input name=\"password\" type=\"hidden\" value=\"test\">");
    out.println(" </form>");
    out.println("</body>");
    out.println("</HTML>");
}

JSP페이지라면 <@page contentType=”text/html;”> 형태로 페이지 상단에 해당 페이지가 html컨텐츠라는 정보를 명시하고 있기 때문에, WAS에서 JSP페이지를 실행한 결과를 반환할때 html컨텐츠라는 정보를 헤더에 포함해서 전달하고, 브라우저에서 정상적으로 파싱하여 표시가 되지만, Controller레벨에서 위의 코드와 같이 임의로 PrintWriter객체를 얻어서 출력하는 경우에는 헤더에 컨텐츠 종류가 어떤 것인지 명시되지 않아서, 브라우저가 일반텍스트로 인식하여 실행이 안되는 경우가 발생한다.

위의 현상을 해결하기 위해서 HttpServletResponse 객체에 setHeader() 메소드를 이용하여 강제로 아래와 같이 contentType을 지정해 봤으나……안되는;;;;;

response.setHeader("contentType", "text/html");

검색을 조금 더 해보니……response객체에는 setHeader말고…….아래와 같은 녀석이 있더라는……

response.setContentType("text/html");

위와같은 방법으로 response 객체에 컨텐츠 유형을 강제로 할당하고, PrintWriter 객체를 얻어서 출력할 경우 임의로 지정한 컨텐츠로 인식시킬 수 있다.
response 객체에는 setContentType() 이외에 setCharacterEncoding() 이나 setLocale() 등도 있으니… setHeader()를 이용하기 전에 이미 정의된 헤더값들을 처리하는 녀석이 있는지는 한번쯤 봐야할듯………(그런게 몇개 안됨;;;)

근데 Controller 레벨에서 직접 PrintWriter객체를 얻어서 출력하는건…….올바른 방법은 아닌듯……JSP페이지 하나 더 만드는게 그렇게 귀찮았나….;;;;;