使用JSTL从Spring Controller到JSP访问Map时出错 [英] Getting error while accessing the Map from Spring Controller to JSP using JSTL

查看:66
本文介绍了使用JSTL从Spring Controller到JSP访问Map时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个spring控制器,在其中我将返回一个名为"model"的Map;模型包含一组值,但重要的是还包含ArrayList.现在,我将这个Map返回给我的JSP,同时在我的JSP中使用JSTL来获取ArrayList它会引发错误.

I have a spring controller in which I am returning a Map named "model"; model contains some set of values but importantly also contains an ArrayList. Now I am returning this Map to my JSP, while using JSTL in my JSP to fetch the ArrayList it throws error.

<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服务器上工作正常,但是当我在Weblogic(9.2)服务器上部署它时,会出现错误.我的类路径条目是:

It works fine on Tomcat Server but when I deploy it on Weblogic(9.2) server it gives the error. My classpath entries are:

<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,现在出现编译错误:


Update: I have removed the jstl-1.2.jar and now I get a compilation error:

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)

推荐答案

根据堆栈跟踪,

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

JSTL <c:forEach>标记期望使用方法 PageContext#getELContext() .此方法在JSP 2.1中引入.因此,此异常表明您正在使用JSTL 1.2,而您的容器不支持JSP 2.1,或者您已使用不支持JSP 2.1的容器的servlet容器特定的JSP库乱扔了运行时类路径.运行时类路径包括Webapp的/WEB-INF/lib文件夹以及Java的JRE/libJRE/lib/ext文件夹.

the JSTL <c:forEach> tag is expecting the method PageContext#getELContext(). This method was introduced in JSP 2.1. This exception thus suggests that you are using JSTL 1.2, while your container doesn't support JSP 2.1 or that you have littered your runtime classpath with servletcontainer specific JSP libraries of a container which doesn't support JSP 2.1. The runtime classpath covers among others the webapp's /WEB-INF/lib folder and Java's JRE/lib and JRE/lib/ext folders .

您应该从不将servlet容器特定的库放在这些文件夹中,例如jsp-api.jarservlet-api.jarel-api.jarj2ee.jarjavaee.jar等.等等.通常在servlet容器本身的/lib文件夹中看到的文件.例如. Tomcat/lib.它使您的Web应用无法移植到目标servlet容器.您正在运行此Web应用程序的目标servlet容器已经已经这些库.如果您这样做是为了克服JSP/Servlet包上的编译错误,那么您应该以不同的方式解决它.另请参见如何导入javax我的Eclipse项目中的.servlet API?

You should never put servletcontainer specific libraries in those folders, such as jsp-api.jar, servlet-api.jar, el-api.jar, j2ee.jar, javaee.jar, etc..etc.. Those files which you usually see in /lib folder of the servletcontainer itself. E.g. Tomcat/lib. It makes your webapp unportable to the target servletcontainer. The target servletcontainer where you're running this webapp has those libraries already. If you did this to overcome compilation errors on JSP/Servlet packages, then you should have solved it differently. See also How do I import the javax.servlet API in my Eclipse project?

更新:根据更新,您使用的是Weblogic 9.2,它是Servlet 2.4/JSP 2.0容器.它根本不支持JSP 2.1/JSTL 1.2.您需要删除JSTL 1.2库.如果我没记错的话,Weblogic已经附带了JSTL 1.1.否则,您需要自己将其包括在类路径(/WEB-INF/lib文件夹)中.您可以在我们的JSTL Wiki页面中找到JSTL 1.1下载链接.

Update: as per your update, you're using Weblogic 9.2 which is a Servlet 2.4 / JSP 2.0 container. It does not support JSP 2.1 / JSTL 1.2 at all. You need to remove the JSTL 1.2 library. If I am not mistaken, Weblogic ships with JSTL 1.1 already. Otherwise you need to include it in the classpath (the /WEB-INF/lib folder) yourself. You can find a JSTL 1.1 download link in our JSTL wiki page.

这篇关于使用JSTL从Spring Controller到JSP访问Map时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆