복붙노트

[SPRING] JSTL을 사용하여 Spring Controller에서 JSP로 Map에 액세스 할 때 오류 발생

SPRING

JSTL을 사용하여 Spring Controller에서 JSP로 Map에 액세스 할 때 오류 발생

나는 "모델"이라는 맵을 리턴하는 스프링 컨트롤러를 가지고있다. 모델에는 몇 가지 값 집합이 있지만 중요한 것은 ArrayList도 포함됩니다. 이제 내 JSP에서 JSTL을 사용하여 ArrayList를 가져 오면 오류가 발생하지만이 맵을 내 JSP로 반환합니다.

<c:forEach items="${model.result}" var="data" varStatus="status"> <!-- result is my ArrayList -->
    <c:out value="${data.url}" /> <!-- here url is data inside my result arraylist -->
</c:forEach> 

생성 된 오류는 다음과 같습니다.

root cause 

java.lang.NoSuchMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext;
    at javax.servlet.jsp.jstl.core.LoopTagSupport.unExposeVariables(LoopTagSupport.java:587)
    at javax.servlet.jsp.jstl.core.LoopTagSupport.doFinally(LoopTagSupport.java:323)
    at jsp_servlet._jsp.__searchsuccess._jsp__tag3(__searchsuccess.java:294)
    at jsp_servlet._jsp.__searchsuccess._jspService(__searchsuccess.java:137)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)

Tomcat Server에서 잘 작동하지만 Weblogic (9.2) 서버에 배포하면 오류가 발생합니다. 내 classpath 항목은 다음과 같습니다.

<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-fileupload-1.1.1.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-io-1.2.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/commons-logging-1.1.1.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/hibernate-validator-4.0.2.GA.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/log4j-1.2.14.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/slf4j-api-1.5.6.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/slf4j-log4j12-1.5.6.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-asm-3.0.3.RELEASE.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-beans-3.0.3.RELEASE.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-context-3.0.3.RELEASE.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-core-3.0.3.RELEASE.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-expression-3.0.3.RELEASE.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-web-3.0.3.RELEASE.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/spring-webmvc-3.0.3.RELEASE.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/validation-api-1.0.0.GA.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/log4j-1.2.9.jar"/>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/servlet-2.3.jar"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre6">
        <attributes>
            <attribute name="owner.project.facets" value="jst.java"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="lib" path="WebContent/WEB-INF/lib/jstl-1.2.jar"/>
    <classpathentry kind="output" path="WebContent/WEB-INF/classes"/>

업데이트 : jstl-1.2.jar을 제거했지만 컴파일 오류가 발생합니다.

searchsuccess.jsp:1:5: No tag library could be found with this URI. Possible causes could be that the URI is incorrect, or that there were errors during pa
rsing of the .tld file.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    ^----^
searchsuccess.jsp:1:5: No tag library could be found with this URI. Possible causes could be that the URI is incorrect, or that there were errors during pa
rsing of the .tld file.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    ^----^

        at weblogic.servlet.jsp.JavelinxJSPStub.compilePage(JavelinxJSPStub.java:298)
        at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:200)
        at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:164)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:235)
        at weblogic.servlet.internal.ServletStubImpl.onAddToMapException(ServletStubImpl.java:394)

해결법

  1. ==============================

    1.stacktrace에 따라,

    stacktrace에 따라,

    java.lang.NoSuchMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext;
        at javax.servlet.jsp.jstl.core.LoopTagSupport.unExposeVariables(LoopTagSupport.java:587)
    

    JSTL 태그는 PageContext # getELContext () 메소드를 기다리고 있습니다. 이 방법은 JSP 2.1에서 소개되었습니다. 이 예외는 따라서 컨테이너가 JSP 2.1을 지원하지 않거나 JSP 2.1을 지원하지 않는 컨테이너의 servletcontainer 특정 JSP 라이브러리로 런타임 클래스 경로를 어지럽 혔을 때 JSTL 1.2를 사용하고 있음을 나타냅니다. 런타임 클래스 경로는 webapp의 / WEB-INF / lib 폴더와 Java의 JRE / lib 및 JRE / lib / ext 폴더를 포함합니다.

    jsp-api.jar, servlet-api.jar, el-api.jar, j2ee.jar, javaee.jar 등등과 같은 servletcontainer 특정 라이브러리를이 폴더에두면 안됩니다. servletcontainer 자체의 in / lib 폴더를보십시오. 예 : Tomcat / lib. 웹 애플리케이션이 대상 서블릿 컨테이너로 이동할 수 없게 만듭니다. 이 웹 애플리케이션을 실행중인 대상 servletcontainer에는 이미 해당 라이브러리가 있습니다. JSP / Servlet 패키지에서 컴파일 오류를 극복하기 위해이 작업을 수행했다면이를 다르게 해결해야합니다. 또한 Eclipse 프로젝트에서 javax.servlet API를 어떻게 가져 옵니까?를 참조하십시오.

    업데이트 : 귀하의 업데이트에 따라 Servlet 2.4 / JSP 2.0 컨테이너 인 Weblogic 9.2를 사용하고 있습니다. JSP 2.1 / JSTL 1.2는 전혀 지원하지 않습니다. JSTL 1.2 라이브러리를 제거해야합니다. 내가 잘못 본 것이 아니라면, Weblogic은 이미 JSTL 1.1을 가지고있다. 그렇지 않으면 클래스 경로 (/ WEB-INF / lib 폴더)에 직접 포함시켜야합니다. JSTL wiki 페이지에서 JSTL 1.1 다운로드 링크를 찾을 수 있습니다.

  2. ==============================

    2.웹 응용 프로그램에 el-api.jar가 있습니까?

    웹 응용 프로그램에 el-api.jar가 있습니까?

    다음 게시물을 참조하십시오.

    http://www.coderanch.com/t/526731/JSP/java/java-lang-NoSuchMethodError-javax-servlet

    - 예. :)

  3. from https://stackoverflow.com/questions/7274675/getting-error-while-accessing-the-map-from-spring-controller-to-jsp-using-jstl by cc-by-sa and MIT license