웹 개발2018. 9. 4. 13:13

Tomcat 4.1, JDK 4인 환경에서 기능 추가하려니 맞는 라이브러리 찾기가 무척 힘듭니다.


jakarta-taglibs-standard-1.0.6.zip


JSTL을 쓰려고 해도 해당 환경에서 돌리려고 해도 계속 에러가 나와서 JSTL 1.0까지 떨어트리니 작동했습니다.


또 Servlet 버전에 따라 jsp에 적는 taglib uri를 다르게 해야 합니다. ( web.xml의 web-app version 참조 )



버전 2.3 : <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

버전 2.4 : <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


Tomcat 4.1는 Servlet version 2.3이기에 EL 언어를 사용하기 위해 아래와 같이 isELIgnored="false"를 추가하면 될 것 같은데,


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>

실제로 돌려보면 해당 속성을 지원하지 않는다는 에러가 발생합니다.


org.apache.jasper.JasperException:  Page directive has invalid attribute: isELIgnored


좀 더 조사해 보니 isELIgnored 속성은 JSP 2.0부터 지원하고, Tomcat 4.1은 JSP 1.2까지만 지원해서 EL 언어를 바로 사용하지 못하게 되어있습니다.


EL 언어를 직접 쓰지 못하기 때문에 EL 언어를 사용하려면 JSTL 안에서 사용해야 정상작동합니다.


${attribute} : (X)

<c:out val="${attribute}" /> : (O)


참고로 Tomcat 버전에 따른 최소 Java 버전이나 JSP, Servlet 버전 등이 정리된 표가 있어서 덧붙입니다.


Servlet SpecJSP SpecEL SpecWebSocket SpecJASPIC SpecApache Tomcat VersionLatest Released VersionSupported Java Versions
4.02.33.01.11.19.0.x9.0.118 and later
3.12.33.01.11.18.5.x8.5.337 and later
3.12.33.01.1N/A8.0.x (superseded)8.0.53 (superseded)7 and later
3.02.22.21.1N/A7.0.x7.0.906 and later
(7 and later for WebSocket)
2.52.12.1N/AN/A6.0.x (archived)6.0.53 (archived)5 and later
2.42.0N/AN/AN/A5.5.x (archived)5.5.36 (archived)1.4 and later
2.31.2N/AN/AN/A4.1.x (archived)4.1.40 (archived)1.3 and later
2.21.1N/AN/AN/A3.3.x (archived)3.3.2 (archived)1.1 and later


 ( 해당 표 출처 : http://tomcat.apache.org/whichversion.html )

'웹 개발' 카테고리의 다른 글

CVS commit시 sticky tag 에러, Eclipse에서 해결하기.  (0) 2018.09.03
context path 구하기  (0) 2018.02.22
Malformed fileattr.xml  (0) 2013.02.04
SCRIPT5009: 'JSON' is undefined  (0) 2013.02.01
prototype과 jquery 함께 사용하기.  (0) 2012.02.06
Posted by net4all
웹 개발2018. 9. 3. 16:58

이클립스 사용중 CVS의 commit을 하면 아래와 같은 에러를 만나는 경우가 가끔 있습니다.



cvs commit: sticky tag `1.1' for file `filename' is not a branch


이에 대한 해결책으로 override and update 해서 버전을 맞춘 뒤 백업해 놓은 변경분을 적용해 다시 커밋을 시도하거나 Enries 파일의 Tag 부분을 지운 뒤 작업을 진행하는 등 여러가지가 있지만 번거로운 절차를 거쳐야 했습니다.


가장 매뉴얼에 따른 절차로는 아래와 같이 -A 옵션으로 업데이트한 뒤 작업하는 것이지만 이것도 불편한 건 매한가지입니다.


cvs update -A filename


무엇보다 이클립스를 이용해서 편하게 사용하려고 하는데 위와 같은 명령을 직접내리는 것은 마음에 들지 않는 점입니다.


그래서 에러 메시지를 유심히 보던 중 '... not a branch'라는 메시지가 눈에 띄였습니다.

위 메시지대로면 브랜치만 맞춰주면 정상적으로 작동하겠다는 생각이 들어서 해당 명령어를 찾아봤습니다.


에러난 파일명에서 오른쪽 마우스 클릭 후 'Team' 명령어로 들어가면 나오는 

Switch to Another Branch or Version.. 명령어를 선택 후 


Select the tag from the following list에서 Matching tags:의 HEAD를 선택하면 해당 sticky tag가 사라집니다.

( update -A와 동일한 효과가 적용되는 거죠^^* )


에러난 파일들을 위 명령어로 tag를 다 바뀌어주고 난 뒤 oommit 명령어를 선택하면 정상적으로 작업을 진행할 수 있습니다. ( 이 방법은 백업 뒤 업데이트 작업 후 변경분 추가하는 번거로운 작업없이 현상태에서 tag만 바꾸고 바로 작업이 진행되기에 더욱 편합니다^^ )




'웹 개발' 카테고리의 다른 글

Tomcat 4.1, Java 1.4에서 JSTL 사용하기.  (0) 2018.09.04
context path 구하기  (0) 2018.02.22
Malformed fileattr.xml  (0) 2013.02.04
SCRIPT5009: 'JSON' is undefined  (0) 2013.02.01
prototype과 jquery 함께 사용하기.  (0) 2012.02.06
Posted by net4all
웹 개발2018. 2. 22. 13:58


context path가 소스내에 하드코딩 되어 있으면, context path 변경시 모든 파일에서 다 찾아서 변경해야 합니다. 

요즘은 에디터가 잘 되어있어서 쉽게 찾을 수 있지만 잘못된 문구가 치환되지 않기 위해 주의를 기울여야 하는 것도 번거럽기도 하고, 하드코딩은 가능한 피햐해 하죠.


소스 내에 자바스크립트를 사용할 수 있는 곳은 아래 함수를 이용하면 됩니다.


javascript:

function getContextPath() {

var hostIndex = location.href.indexOf( location.host ) + location.host.length;

return location.href.substring( hostIndex, location.href.indexOf('/', hostIndex + 1) );

}




이미지 경로 설정과 같은 경로를 직접 써야 할 경우 아래 표현식을 써주면 좋습니다.


jsp : EL(Expression Language) 사용


servlet 2.4 이상 ${pageContext.request.contextPath}

servlet 2.3 이하 <c:out value='${pageContext.request.contextPath}' />

위 방식을 사용하기 위해선 JSTL 1.2 라이브러리가 필요합니다.

예) <img src="${pageContext.request.contextPath}/images/logo.png" />

<img src="<c:out value='${pageContext.request.contextPath}' />/images/logo.png" />




그런데 자바스크립트를 사용 못하는 css 파일 내 경로의 경우 톰캣에서 컨텍스트 주소를 별도로 잡아서 적어주는 방법이 있습니다.


톰캣의 server.xml

<Context docBase="CTX" path="/ctx" reloadable="true" source="org.eclipse.jst.j2ee.server:CTX"/>

    <Context docBase="CTX/images" path="/ctxImg" reloadable="true" source="org.eclipse.jst.j2ee.server:CTX"/>

위에서와 같이 이미지 경로를 포함하는 주소를 docBase에 설정하고 path를 잡아주면 됩니다. 일반적인 경우는 인터넷에 많이 나와 있어서 이클립스에서 잡은 예를 들었습니다.


예) 

AS-IS : .pattern { background:url(/ctx/images/common/pattern.gif) repeat; }

TO-BE : .pattern { background:url(/ctxImg/common/pattern.gif) repeat; }

사실 톰캣에서 주소를 새로 설정해주었으면 모든 이미지 주소에 새로 설정한 값을 사용하는 것이 편할 수 있습니다. context path와 image path는 별개로 움직이니까요.




참고로 자바에서 컨텍스트 패스를 잡는 경우는 아래와 같이 하면 됩니다.


java : HttpServletRequest request

request.getContextPath()

Posted by net4all