본문 바로가기

Information Technology

[taglib] c:url 사용 시 주의 사항 (image, js, css 경로)


참고: http://www.ibm.com/developerworks/kr/library/j-jstl0318/#N10528

[image, js, css의 경로 이슈]

 

일반적으로 웹 리소스에 대한 경로를 기재할 경우

context 명이 개발 시점이 아닌 배포 시점에 재정의 가능하다는 점을 감안하여

동적으로 결정되도록 하는 방법이 사용된다.

 

그 중 하나가 c:url 태그인데

url 태그는 context 명을 동적으로 가져올 뿐만 아니라

session tracking을 위한 정보도 동적으로 생성한다.

 

그래서 session tracking이 필요한 경우 (cookie에 session 정보가 없을 때)

아래와 같은 현상이 발생한다.

 

[소스 코드]

<c:url value="/content/search.jsp">
  <c:param name="keyword" value="${searchTerm}"/>
  <c:param name="month" value="02/2003"/>
</c:url>

 

[session 정보가 cookie에 있는 경우]

/blog/content/search.jsp?keyword=foo+bar&month=02%2F2003

[session 정보가 cookie에 없는 경우]

/blog/content/search.jsp;jsessionid=233379C7CD2D0ED2E9F3963906DB4290
  ?keyword=foo+bar&month=02%2F2003

 

의도한 내용이었다면 문제가 없지만 image나 js, css의 경로로 이 태그를 사용하고

web server로 하여금 이들 파일을 핸들링하게 할 경우,

뒤에 달라붙는 jsessionid를 파일명의 일부로 간주하여 not found가 나온다.

 

 

EL로 대체하기

 

이를 해결할 여러가지 방법이 있겠지만

'context명을 동적으로 가져와야한다'라는 목적에 집중한다면

EL 사용을 고려할 수 있다.

 

${pageContext.serveltContext.contextPath}

${pageContext.request.contextPath}

 

뭘로 해도 동일한 값을 얻을 수 있다.

 

 

정규 표현식으로 치환하기

대략 아래와 같은 패턴이면 c:url을 사용한 것을 EL로 교체할 수 있다.

가정하고 있는 것은 이미지 경로 및 파일명에 사용되는 문자열은

알파벳 대소문자, 숫자와

파일 경로 구분자로 /, \,

그리고 파일 확장자 앞에 붙는 구분자 .를 패턴으로 잡았다.

 

 

Image 검색 패턴

src="<c:url value='([a-zA-Z0-9\.\/\\\-\_]*).gif'\s*\/>"

 

Image 치환 패턴

src="\$\{pageContext.request.contextPath\}$1.gif"

 

CSS 검색 패턴

href="<c:url value='([a-zA-Z0-9\.\/\\\-\_]*).css'\s*\/>"

 

CSS 치환 패턴

href="\$\{pageContext.request.contextPath\}$1.css"

 

JavaScript 검색 패턴

src="<c:url value='([a-zA-Z0-9\\\/\.\-\_]*).js'\s*\/>"

 

JavaScript 치환 패턴
src="\$\{pageContext.request.contextPath\}$1.js"

 

Eclipse의 search에서 정규 표현식 사용을 체크한 후, 치환하면 된다.

출처 : http://blog.naver.com/phrack/80105009259