簡體   English   中英

Spring無法使用javax.servlet編譯JSP

[英]Spring can't compile jsp with javax.servlet

我有一個春季項目,一切正常。

我的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>

解決方法:還原您的更改。 您已經依賴於javax.servlet

javax.servlet:javax.servlet-api:3.0.1org.springframework:spring-web:4.1.2.RELEASE的依賴org.springframework:spring-web:4.1.2.RELEASE (請org.springframework:spring-web:4.1.2.RELEASE “ Depends On”部分),因此可以作為傳遞性依賴項使用。

為什么要這樣做:您在同一個jar中有兩個相互沖突的依賴項(Servlet API 3.0中的HttpServletRequest確實具有getDispatcherType()方法,而在API 2.5中則沒有)。 Gradle用戶指南中

應該檢測到同一罐的版本沖突,或者解決該沖突或引起異常。 如果您不使用傳遞性依賴項管理,則不會檢測到版本沖突,並且類路徑的偶然順序通常會決定哪種版本的依賴項將獲勝。 在一個有許多開發人員更改依賴關系的大型項目中,成功的構建將很少而且相差甚遠,因為依賴關系的順序可能會直接影響構建是成功還是失敗(或者錯誤是否在生產中出現或消失)。

“顯然,它將jsp視為.java文件。”

否。它將JSP轉換為Java,然后進行編譯。 如果您的JSP包含錯誤,那么這些錯誤很可能會導致Java代碼中包含編譯錯誤。

您需要做的是查看為JSP生成的源代碼,並弄清楚Java編譯錯誤在說什么。 然后找出您的JSP中的相應錯誤,並在那里解決問題。

在這種情況下,您的JSP似乎試圖在request對象上調用不存在的方法。 編譯器是正確的。 HttpServletRequest API中沒有名為getDispatcherType()方法,因此您試圖調用它的JSP代碼不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM