我有一个春季项目,一切正常。
我的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>
答案 0 :(得分:1)
如何修复:还原您的更改。您已经依赖javax.servlet
。
javax.servlet:javax.servlet-api:3.0.1
是org.springframework:spring-web:4.1.2.RELEASE
的依赖项(请参阅“取决于”部分),因此您可以将其作为传递依赖项使用。
为什么你有这个:你有两个相同jar的冲突依赖(Servlet API 3.0中的HttpServletRequest
确实有getDispatcherType()
方法,而在API 2.5中它没有)。来自Gradle User Guide:
应检测同一jar的冲突版本 解决或导致异常。如果您不使用传递依赖 管理,版本冲突未被发现且经常是偶然的 类路径的顺序将决定依赖项的版本 会胜利的。在许多开发人员改变的大型项目上 依赖关系,成功的构建将是少之又少的 依赖顺序可能直接影响构建是否成功或 失败(或者是否出现错误或在生产中消失)。
答案 1 :(得分:0)
“显然它将jsp视为.java文件。”。
没有。它将JSP转换为Java,然后编译它。如果您的JSP包含错误,那么这些错误很可能会导致Java代码中出现编译错误。
您需要做的是查看生成的JSP源代码,并找出Java编译错误所说的内容。然后找出JSP中的相应错误,并解决问题。
在这种情况下,您的JSP似乎试图在request
对象上调用不存在的方法。编译器是正确的。 getDispatcherType()
API中没有名为HttpServletRequest
的方法,因此您尝试调用它的JSP代码不正确。