본문

IT로그/프로그래밍

web.xml 파일에 TLD 내용 추가했을때 모든 페이지가 404에러 나는 경우

‘최범균의 JSP 2.3 웹 프로그래밍 기초부터 중급까지’ 라는 교재로 공부를 하던중 간간히 생기는 에러(주로 경로문제나 오타)들은 간단히 해결했었으나
이번엔 도저히 해결을 할 수 없는 에러가 발생해버렸다.
표현언어(EL, Expression Language)를 공부하던 중 TLD파일을 이용하는 예제에서 web.xml에 TLD명시를 적기만 하면 해당 루트의 모든 페이지들이 404에러를 띄워버리는 것..
교재와 코드를 수없이 비교하며 오타난 부분도 고치고 이리저리 해보았지만 404님은 떠나갈 줄을 모른다.


에러가 발생하는 경우의 코드


<!--viewNumber.jsp-->
 
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="elfunc" uri="/tlds/el-functions.tld"%>
<%
    request.setAttribute("price", 12345);
%>
 
<html>
 
<head><title>EL 함수 호출</title></head>
 
<body>
    가격은 <b>${elfunc:formatNumber(price,'#,##0')}</b>원 입니다.
 
 
</body>
 
</html>

<!--el-functions.tld-->
 
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
 
<description>EL에서 함수실행</description>
<tlib-version>1.0</tlib-version>
<short-name>ELfunctions</short-name>
 
<function>
    <description>숫자 포맷팅</description>
    <name>formatNumber</name> <!-- EL에서 사용할 함수 이름 정의 -->
    <function-class>util.FormatUtil</function-class> <!-- 함수기능을 제공할 클래스의 완전한 이름 -->
    <function-signature>java.lang.String number(long, java.lang.String)</function-signature>
</function> 
<!-- 함수기능을 실행할 메소드. 리턴타입과 파라미터 타입은 완전한 클래스 이름을 사용. 파라미터의 경우 타입만 적는다. -->
</taglib>


<!--web.xml-->
 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/SMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">
 
    <error-page>
        <error-code>404</error-code>
        <location>/error/error404.jsp</location>
    </error-page>
 
    <error-page>/
        <error-code>500</error-code>
        <location>/error/viewErrorMessage.jsp</location>
    </error-page>
 
    <jsp-config>
        <jsp-property-group>
            <url-pattern>/view/*</url-pattern>
            <include-prelude>/common/variable.jspf</include-prelude>
            <include-coda>/common/footer.jspf</include-coda>
        </jsp-property-group>
    </jsp-config>
 
    <jsp-config>
        <taglib>
            <taglib-uri>/tlds/el-functions.tld</taglib-uri>
            <taglib-location>/WEB-INF/tlds/el-functions.tld</taglib-location>
        </taglib>
    </jsp-config>
    
</web-app>

에러 해결 과정


1. web.xml에서 TLD 명시부분 삭제하기



위와같은 현상에 대해 구글링결과 다음과 같은 답변을 찾을 수 있었다.


파일상 실제 이름 및 경로가 일치 하더라도 servlet 2.4 spec 이상의 경우(리스너 사용 또한 같습니다.) tld를 명시할 필요가 없는게 맞지만
web.xml에서 validation 오류를 내는 경우가 있습니다.(ex : <taglib>을 <web-app>의 child element로 넣은 경우)
다 맞게 설정해주셔도 안되신다면 Tomcat -> Clean -> Restart 또는 재설치를 하셔서 하는 경우도 작동이 되십니다.
(출처:표준프레임워크 오픈커뮤니티)


해당 답변을 보면 서블릿 스펙 2.4이상에서는 web.xml에서 TLD에 대한 명시를 굳이 따로 안해주어도 된다는 얘기.
그렇다면 계속 에러만 내뿜고 있는 해당 부분을 그냥 없애버리기로 결정.
web.xml에 TLD 명시부분을 삭제하고 TLD 파일을 사용하는 JSP에서 직접 파일 위치를 명시하여 사용하는 방법으로 수정하니 에러가 잡혔다.



수정된 코드


<!--viewNumber.jsp--> <%@ page contentType="text/html; charset=utf-8" %> <%@ page trimDirectiveWhitespaces="true" %>

<!-- <%@ taglib prefix="elfunc"  uri="/tlds/el-functions.tld"%> --> <%@ taglib prefix="elfunc"  uri="/WEB-INF/tlds/el-functions.tld"%>

<% request.setAttribute("price", 12345); %> <html> <head><title>EL 함수 호출</title></head> <body> 가격은 <b>${elfunc:formatNumber(price,'#,##0')}</b>원 입니다. </body> </html>



<!--web.xml--> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/SMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <error-page> <error-code>404</error-code> <location>/error/error404.jsp</location> </error-page> <error-page>/ <error-code>500</error-code> <location>/error/viewErrorMessage.jsp</location> </error-page> <jsp-config> <jsp-property-group> <url-pattern>/view/*</url-pattern> <include-prelude>/common/variable.jspf</include-prelude> <include-coda>/common/footer.jspf</include-coda> </jsp-property-group> </jsp-config>

<!-- <jsp-config> <taglib> <taglib-uri>/tlds/el-functions.tld</taglib-uri> <taglib-location>/WEB-INF/tlds/el-functions.tld</taglib-location> </taglib> </jsp-config> -->

</web-app>


2. 2개의 jsp-config 태그를 하나로 합쳐보기



1번의 방법으로 에러를 해결한 뒤 서블릿 스펙 2.4이상부터라면 교재의 버전인 3.1버전과 현재 세팅된 버전인 4.0버전 모두 2.4버전 이상인데 왜 교재에서는 문제가 없고 본인의 예제 코드에서만 문제가 되는것인지 찜찜함을 지우지 못하고 다른방법을 찾아보았다.
위의 참고답변에서 <taglib><web-app>의 child element로 넣은 경우에 에러를 낼 수 있다는 내용에 혹시나 하고 2개로 나뉘어진

<jsp-config> 태그 부분을 하나로 합친 후 jsp파일의 uri 부분을 taglib-uri에 맞게 수정하여 실행해 보니 에러가 잡혔다. 

그리고 구글링결과 다음과 같은 한 줄을 찾을 수 있었다…


there can be only one jsp-config element in the deployment descriptor.


결국은 <jsp-config> 태그가 두개 사용돼서 생긴 에러였던 모양이다.(몇시간의 고생이…)
교재와는 다르게 파일관리를 해오면서 기존 챕터의 내용들을 유지해왔는데 이런 문제가 생길줄이야...
어쨌든 다음과 같이 수정.


수정된 코드


<!--viewNumber.jsp--> <%@ page contentType="text/html; charset=utf-8" %> <%@ page trimDirectiveWhitespaces="true" %>

<%@ taglib prefix="elfunc"  uri="/tlds/el-functions.tld"%> <!-- <%@ taglib prefix="elfunc"  uri="/WEB-INF/tlds/el-functions.tld"%> -->

<% request.setAttribute("price", 12345); %> <html> <head><title>EL 함수 호출</title></head> <body> 가격은 <b>${elfunc:formatNumber(price,'#,##0')}</b>원 입니다. </body> </html>


<!--web.xml--> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/SMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <error-page> <error-code>404</error-code> <location>/error/error404.jsp</location> </error-page> <error-page>/ <error-code>500</error-code> <location>/error/viewErrorMessage.jsp</location> </error-page> <jsp-config> <jsp-property-group> <url-pattern>/view/*</url-pattern> <include-prelude>/common/variable.jspf</include-prelude> <include-coda>/common/footer.jspf</include-coda> </jsp-property-group>


<taglib> <taglib-uri>/tlds/el-functions.tld</taglib-uri> <taglib-location>/WEB-INF/tlds/el-functions.tld</taglib-location> </taglib>

</jsp-config>

</web-app>


마무리


이렇게 한번씩 에러와 씨름하고 나면 어떤때엔 굉장히 사소한 문제(알파벳 오타, .빼먹음 등등)에 허탈하기도 하지만
오늘처럼 원인을 하나하나 찾아가면서 해결하는 과정에서 새로 배우는 부분이 굉장히 많다.
그리고 변태같지만 그 에러가 해결되는 순간의 그 기분도 너무 좋은것 같다.
뭔가 레벨업 되는 느낌..




댓글 0

티스토리 툴바