프로그래밍/JSP/Servlet

JSP Forward시 유의할 점.

브리2 2016. 1. 27. 11:51

JSP 파일 자체 태그에 forward 하는 구문이 있다.

먼저 Forward부터 살펴보면, (여기저기 다른 블로그에 설명이 많기에 정말 간단하게 다들 알꺼라 생각하고 불친절히 설명하자면.)

해당 파일을 HTML로 파싱 하는 걸 멈추고, forward 한 새로운 페이지를 브라우저에 보여주게 된다.

JS에서 window.location.replace  정도로 생각하면 된다. 딱 한가지 특이점은. 웹브라우져에서 URL 창이 바뀌지 않는다는거.


그러니까, 서버 자체에서 페이지 정보를 forward에 넘긴 페이지를 보여준다고 보면 되겠다. 

일종의 fake지??.


구문은

<jsp:forward page="file_name.jsp">

    <jsp:param name="param_name" value="param_value" />

</jsp:forward>

문제는 내가 forward를 가져다가 쓰면서, 1시간정도 시간 날린 게 있는데, 그 때문에 근 2주? 3주 만에, 입사 후 처음으로 포스팅을 쓴다. (이거는 한 포스팅에 정리해 놓은게 없어서 여기저기 짜깁기해서 내가 여기다가 정리하려고 한다.)


우선!. JSP 에 대해 기본적인 것을 생각해보자.

JSP는 기본적으로 WAS에서, 서블릿으로 바꿔서 다시 저장한 후, 서블릿 클래스를 불러다가 사용하는 방식으로 동작한다.(적어도 톰캣에서는... 다른건 모르겠다.)

어찌됐던 이러한 방식 떄문에 서블릿에서 사용하는 forward를 그대로 사용하는게 JSP forward가 되겠는데, 아직 내가 jsp 처음 써보는 지라 처음 scriptlet에다가 if-else문으로, forward를 걸었었다.

그랬더니 나오는 코드는 너무 불편한 스파게티코드...

<% ~~~

if(~~){

}

else{%>

<jsp:forward page="file_name.jsp">

            <jsp:param name="param_name" value="param_value" />

</jsp:forward>

<%}%>

....


.........

심지어 파라미터도 안쓰려고 했는데 강제로 넣어줘야 잘 동작한다;;;.

그래서 어차피 서블릿으로 바뀔 꺼, 서블릿 함수 가져다가 쓰자! 고 했는데.

<% ~~~

if(~~){

}

else{

pageContext.forward("/~~~~.html");

}%>

이렇게 썻더니 페이지가 계속 outputStream illegalException??  났었다.


sendRedirect와 확실히 다른게. forward는 html파일로 파싱해서 outputStream으로 보내는거 실행 그대로 하고, 이후 서블릿 동작은 끝까지 수행한다.

그러니까... 저거 forward 생겼다고 멈추는게 아니라 아래쪽도 똑같이 계속 수행하게 된다는 의미.... 

아니나 다를까 위의 <jsp:forward>태그가 변환된 servlet.java 를 살펴보니. 


if(true){

_jspx_page_context.forward("???.html");

return;

)

요딴식으로 파싱해준다.


그래. 서블릿에서 아래 코드 실행되는거 막아주기 위해 return 박아준거지.....

나는 그거 건너뛴거고...


그래서 계속 익셉션이.. 났었다.


결국 자체적으로 return 박아서 해결.


뭐 이거 제대로 된 방식 맞나??


'프로그래밍 > JSP/Servlet' 카테고리의 다른 글

JSP 서블릿파일 in eclipse  (0) 2016.01.27