【问题标题】:Spring can't compile jsp with javax.servletSpring无法用javax.servlet编译jsp
【发布时间】:2014-12-04 02:12:33
【问题描述】:

我有一个春季项目,一切正常。

我的 gradle 依赖项编译有以下内容

compile 'org.springframework:spring-core:4.1.2.RELEASE',
        'org.springframework:spring-web:4.1.2.RELEASE',
        'org.springframework:spring-webmvc:4.1.2.RELEASE',
        'org.springframework:spring-orm:4.1.2.RELEASE',
        'org.springframework:spring-context:4.1.2.RELEASE',
        'org.springframework:spring-tx:4.1.2.RELEASE',
        'commons-dbcp:commons-dbcp:1.4',
        'mysql:mysql-connector-java:5.1.6',
        'org.hibernate:hibernate-core:4.3.7.Final'

而我的 web.xml 是

<web-app
    id="WebApp_ID"
    version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Test Restful Application</display-name>

    <servlet>
        <servlet-name>test-servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>test-servlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/test-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>/WEB-INF/view/default.jsp</welcome-file>
    </welcome-file-list>

    <error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/view/default.jsp</location>
    </error-page>

</web-app>

豆子是

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.example" />

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        id="dataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url"
            value="jdbc:mysql://localhost:3306/test" />
        <property name="username" value="root" />
        <property name="password" value="password" />
    </bean>

    <bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
        id="sessionFactory">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    </bean>

    <tx:annotation-driven />
    <bean class="org.springframework.orm.hibernate4.HibernateTransactionManager"
        id="transactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean class="com.example.dao.TestDAO" id="testDAO">
        <constructor-arg ref="sessionFactory" />
    </bean>

</beans>

一切都非常好。

但是我想看看我是否可以获取访问者的IP地址。

所以我查找并发现我需要使用HttpServletRequest 并使用我需要javax.servlet 所以我修改了gradle.build 并添加了 'javax.servlet:servlet-api:2.5'。除了build.gradle我没有修改任何一行代码,现在我得到HTTP Status 500 - Unable to compile class for JSP:org.apache.jasper.JasperException: Unable to compile class for JSP:

谁能解释我为什么以及如何得到这个,是什么原因导致它以及我该如何解决它?添加单个库如何导致所有内容停止工作对我来说没有意义。

感谢任何人的帮助,我正在失去理智而无法找到解决方案。

编辑:

这是堆栈跟踪

Stacktrace:] with root cause
 org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: [42] in the generated java file: [system\tomcat\Tomcat_(1)_web\work\Catalina\localhost\ROOT\org\apache\jsp\WEB_002dINF\view\default_jsp.java]
The method getDispatcherType() is undefined for the type HttpServletRequest

Stacktrace:
    at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
    at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:199)
    at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:450)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:361)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

显然它将 jsp 视为 .java 文件。

EDIT2:

这是我的jsp文件

<html>
<head>
    <title>Error</title>
</head>
<body>
<h3>Wrong page</h3>
</body>
</html>

【问题讨论】:

  • 请显示堆栈跟踪的其余部分
  • 你应该可以在日志文件中找到真正的JSP编译错误。

标签: java spring jsp servlets gradle


【解决方案1】:

如何解决:还原您的更改。你已经依赖于javax.servlet

javax.servlet:javax.servlet-api:3.0.1org.springframework:spring-web:4.1.2.RELEASE 的依赖项(请查看“依赖于”部分),因此它可以作为传递依赖项提供给您。

为什么会这样:同一个 jar 有两个相互冲突的依赖项(Servlet API 3.0 中的 HttpServletRequest 确实有 getDispatcherType() 方法,而在 API 2.5 中则没有)。来自Gradle User Guide

应检测到同一 jar 的冲突版本,并且 已解决或导致异常。如果你不使用传递依赖 管理,版本冲突未被发现并且经常是偶然的 类路径的顺序将确定依赖项的版本 会赢。在一个有许多开发人员变化的大型项目中 依赖关系,成功的构建将很少,因为 依赖顺序可能直接影响构建是否成功或 失败(或者错误是否在生产中出现或消失)。

【讨论】:

    【解决方案2】:

    “显然它将 jsp 视为 .java 文件。”

    没有。它将 JSP 翻译成 Java,然后对其进行编译。如果您的 JSP 包含错误,那么这些错误很可能会导致 Java 代码中出现编译错误。

    您需要做的是查看为 JSP 生成的源代码,并找出 Java 编译错误的含义。然后找出你的 JSP 中对应的错误,然后修复那里的问题。

    在这种情况下,您的 JSP 似乎试图在 request 对象上调用一个不存在的方法。编译器是正确的。 HttpServletRequest API 中没有名为 getDispatcherType() 的方法,因此尝试调用它的 JSP 代码不正确。

    【讨论】:

    • 我编辑了问题并添加了我的 jsp 文件。真的有什么我在做错的事吗?
    • 您确定您拥有正确的 JSP 文件吗?它与编译器正在讨论的default_jsp.java 文件有什么相似之处吗?
    • 是的,我的 default.jsp 会显示错误页面。这就是为什么我将它映射到我的 web.xml 中的错误页面 404。这就是我感到困惑的原因。我拥有的代码根本没有那么复杂,这就是为什么我对它为什么不起作用感到困惑。
    • 一个例子是我在github.com/CarefreeCoding/Gradle-Spring-Hibernate-example 下的一个项目,它运行良好,第二次我尝试添加'javax.servlet:servlet-api:2.5' 它也停止工作
    • 好吧,你通常不应该将 servlet-api JAR 文件添加到 servlet 的运行时类路径中。 Web 容器应该已经在类路径中包含所有这些 API ...并且它将使用最适合 Web 容器的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2017-05-12
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多