서버단 언어이든 클라이언트 단 언어이든 어떤 특정 파일을 사용하기 위해서 경로를 알고 있어야 하는 경우가 있다
여기서 경로를 잘못 입력하게 되면 404 에러가 떠버린다...
그렇기 때문에 경로 설정을 잘 이해할 필요가 있다.
자 그럼 보자
일반적인 이클립스에서 다이나믹 프로젝트를 만들시 생기는 풀더 구조이다.
여기서 웹의 최상위 경로는 WebContent 인것을 알수 있다.
이 점을 유의 해야 한다.
자 그럼 여기서 viw.jsp 에서 (a,b,c).jsp 를 찾아가기 위한 경로를 한번 생각해보자 ( 이미지에는 b c 가없는데 a와 같은디렉토리에 있다고 하자)
if("A".equals(code)){ viewPageURI = request.getContextPath()+"/chap07/view/a.jsp"; // 이 부분에서 404 에러 왜? 서버단의 최상위 경로는 WebContent이기 때문이다. }else if("B".equals(code)){ viewPageURI = "/view/b.jsp"; // 여기서 / 는 웹컨텐트를 나타내므로 WebContent/view/... 로 가게되어 올바르지 않은 경로가 된다. }else if("C".equals(code)){ viewPageURI = "/chap07/view/c.jsp"; }
자 위의 경로에서 A 와 B는 잘못 됬지만 C는 잘 되어져있다.
하나씩 살펴보자
A는 어느 부분이 잘못 된걸까?
눈썰미가 있다면 바로 알겠지만 request.getContextPath() 이 부분이 없어야만 한다. 여기서 request.getContextPath()의 값은 /test 이다.
그렇다면 /test/chap07/view/a.jsp 로 가게되므 올바른 경로 아닌가라고 생각 할 수있다. 허나 실행 해보면 404 에러가 뜬다...
에러 페이지의 메세지는 /test/test/chap07/view/a.jsp 라고 뜬다... ?!
왜일까?
위 코드를 해석한 서블릿 컨테이너는 자신의 웹컨텐츠 최상위 경로부터 시작해 그대로 검색하게 됩니다. .
/{최상위 경로}/{contextPath}/chap07/view/b.jsp
그리고 앞서 말했다 싶이 웹의 최상위 경로는 WebContent 이다. 즉
WebContent/{contextPath}/chap07/view/b.jsp 로 해석 되어진다. 그럼 여기서 또 의문이 든다. 왜 에러 메세지는 저렇게 경로가 안뜨고 /test/test/chap07/view/a.jsp
라고 뜨는 것이지? 라는 의문이 들수 있다.
이건 저 경로를 검색하고 에러페이지를 뱉어낸것이 그렇게 짜여진 서블릿 컨테이너 이기 때문입니다.
구조 자체가 현재 내 컨텍스트 패스내의 웹 최상위 경로에서 /ch07-10/chap07/view/a.jsp 를 훌어보도록 되어있고, 에러메시지도 저렇게 뱉도록 되어있습니다.
에러 메시지의 목적이 잘못된 요청임을 알려주고 올바른 경로로 요청하도록 돕기 위함인데 자동으로 검색되는 WebContent를 넣어주면 혼란만 초래하지요.
너가 http://localhost:8080/test/test/chap07/view/a.jsp 로 요청을 보내서 에러가 났으니
http://localhost:8080/test/chap07/view/a.jsp로 다시 요청을 해봐라 라고 유도할 수 있습니다.
서버입장에서 브라우저가 위 URL로 요청을 보내면 알아서 WebContent부터 검색을 해주는데 쓸데없이 에러메시지에 WebContent라는 경로를 노출할 이유가 없습니다.
그리고 여기서 중요한 점! 서버는 ContextPath 값을 알고 있고 애초에 구조적으로 여기서 부터 검색하게 되어있기 때문에 request.getContextPath()로 설정하면 중복이되어 에러가 된다는 것이다. ( server.xml 의 Context docbase 를 확인해보자!!!!)
자! 그렇다면
<form action="<%=request.getContextPath()%>/chap07/view.jsp">
이 부분을 보자 ! 이것은 어떠한가? 이것도 잘못 된것인가?
답은 아니다!
이는 html 태그로 브라우저측 즉 서버가 아닌 클라이언트 입장에서 보여지는 것이다.. 즉 ! 클라이언트 입장이므로 서버의 path는 알지 못한다. 따라서 파일경로의 검색을
자동적으로 시작하는 부분이 없으므로 풀 경로를 적어주야 절대경로로 찾을 수있다 따라서 반드시 저런식으로 ContextPath를 명시 해주어야 한다.
자 그럼 두번째 경우의 잘못 된점을 보자
viewPageURI = "/view/b.jsp";
이제 아것은 바로 느낌이 올것이
웹컨테이너는 이를 어떻게 해석할까요?
WebContent/view/b.js 이렇게 해석 할 것이다. 그럼? 이 경로를 한번 찾아보자 찾아지는가? ... 찾을 수 없다 그래서 에러가 난다.
결론
서버 측에서 최상위 경로는 WebContent 로 보고 여기서 부터 검색을 시작 따라서 ContextPath를 줄 필요는 없다 하지만
브라우저측(클라이언트) 측 에서는 최상위가 경로가 무엇인지도 모르고 알 수 없기 때문에 반드시 ContextPath값을 줘서 여기서부터 경로를 이어가야 한다.그리고 ContextPath는 기본적으로 /프로젝트명(위 그림의 경우 test) 이 된다. (http://localhost:9090/test/xxxxx/xxxxxx.jsp) 이럭식으로 포트/경로 에 첫 경로 부분 )
이 점을 반드시 유의 하자!
JSP 공부 <2> - JSTL , EL 연습 (0) | 2018.09.07 |
---|---|
WAS(Web Application Server) 와 WEB SERVER 그리고 CGI (0) | 2018.09.06 |
서버 전송 방식 - Get & Post Method (0) | 2018.09.06 |
JSP 공부 <1> - 기초 ~ JSTL 까지 요약 정리 (0) | 2018.09.04 |
Server Side 개발 언어 - JSP , ASP , PHP (0) | 2018.07.30 |