java - IntelliJ Struts 2 应用启动问题

标签 java jsp tomcat jdbc struts2

我正在尝试创建一个 struts2 应用程序。我已经设置了 spring、struts 和 web xml 文件。当我省略过滤器“StrutsPrepareAndExecuteFilter”时,它会部署到 tomcat 服务器,但是当我转到 jsp 时,其中包含任何类型的 struts 标记,我会收到以下错误。

这是堆栈跟踪:

Servlet.service() for servlet [jsp] in context with path [] threw exception [An

exception occurred processing JSP page /index.jsp at line 259



Stacktrace:] with root cause
The Struts dispatcher cannot be found.  This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag. - [unknown location]
    at org.apache.struts2.views.jsp.TagUtils.getStack(TagUtils.java:60)
    at org.apache.struts2.views.jsp.StrutsBodyTagSupport.getStack(StrutsBodyTagSupport.java:44)
    at org.apache.struts2.views.jsp.ComponentTagSupport.doStartTag(ComponentTagSupport.java:48)
    at org.apache.jsp.index_jsp._jspx_meth_s_005furl_005f0(index_jsp.java:638)
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:320)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run

然后,当我将过滤器放回我的 web.xml 文件中时,服务器甚至没有部署。当我用过滤器重新启动服务器时,我得到这个:

Connected to server
[2015-07-29 07:55:21,077] Artifact Admin:war exploded: Artifact is being deployed, please wait...
log4j:WARN No appenders could be found for logger (com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Jul 29, 2015 7:55:27 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error filterStart
Jul 29, 2015 7:55:27 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [] startup failed due to previous errors
Jul 29, 2015 7:55:27 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
[2015-07-29 07:55:27,837] Artifact Admin:war exploded: Error during artifact deployment. See server log for details.
Jul 29, 2015 7:55:30 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /java/apache-tomcat-7.0.47/webapps/manager
Jul 29, 2015 7:55:31 PM org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.  Could not load org.apache.tomcat.jdbc.pool.FairBlockingQueue$FairIterator.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1588)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
    at org.apache.tomcat.jdbc.pool.FairBlockingQueue.iterator(FairBlockingQueue.java:233)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.checkIdle(ConnectionPool.java:989)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.checkIdle(ConnectionPool.java:981)
    at org.apache.tomcat.jdbc.pool.ConnectionPool$PoolCleaner.run(ConnectionPool.java:1348)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

Exception in thread "PoolCleaner[2142566374:1438221326908]" java.lang.NoClassDefFoundError: org/apache/tomcat/jdbc/pool/FairBlockingQueue$FairIterator
    at org.apache.tomcat.jdbc.pool.FairBlockingQueue.iterator(FairBlockingQueue.java:233)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.checkIdle(ConnectionPool.java:989)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.checkIdle(ConnectionPool.java:981)
    at org.apache.tomcat.jdbc.pool.ConnectionPool$PoolCleaner.run(ConnectionPool.java:1348)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.jdbc.pool.FairBlockingQueue$FairIterator
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
    ... 6 more

这是我的 web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

  <!--Spring Configuration -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring.xml,</param-value>
  </context-param>

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

  <listener>
    <listener-class>com.howe.listener.InitContextListener</listener-class>
  </listener>

  <filter>
    <filter-name>xssFilter</filter-name>
    <filter-class>com.howe.Filter.XssFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>xssFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>xssFilter</filter-name>
    <url-pattern>*.do</url-pattern>
  </filter-mapping>

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
      <param-name>actionPackages</param-name>
      <param-value>com.howe.Action</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>

  <error-page>
    <error-code>400</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>503</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>504</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error.jsp</location>
  </error-page>

</web-app>

有人可以帮我吗?会不会是我项目中的 jar 版本?

这是我的 lib 文件夹:

HERE IS PART OF MY LIB FOLDER

PART 2 OF MY LIB FOLDER

PART 3 OF MY LIB FOLDER

最佳答案

this answer 中所述, Tomcat JDBC池在Tomcat 7.0.19中引入。

既然你没有指定你使用的是哪个Tomcat版本,那么

  • 如果 Tomcat < 7.0.19 :你需要把tomcat-jdbc.jar在 Tomcat 中共享 /lib文件夹,而不是像你正在做的那样在你的 ear/war lib 文件夹中;

  • 如果 Tomcat >= 7.0.19 ,这个 jar 已经在服务器上了,你得到了 NoClassDefFoundError 因为你把它放在 ear/war 中并且 Tomcat 不知道选择哪一个(在服务器一和包一之间)。

在这两种情况下,您都需要将其从包裹中移除

在 Maven 中,您可以通过添加 <scope>provided</scope> 来完成它到服务器上已有的依赖项。

关于java - IntelliJ Struts 2 应用启动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31714026/

相关文章:

java - 操作哈希表键不起作用

java.lang.NoClassDefFoundError : Could not initialize class com. hp.hpl.jena.query.Query

java - 如何在 SOLR (mini) 中存储关系数据

java - Tomcat & Spring Web - 找不到类异常 org.springframework.web.context.ContextLoaderListener

java - Tomcat 配置文件 ../context.xml 似乎已损坏。请确保它是可解析的和有效的。有关详细信息,请参阅服务器日志

java - 如何在 Java 中将字体样式转换为字体粗细?

java - elasticsearch 将对象插入索引

java - 子类可以强制调用父类方法是编译器错误吗?

java - 浏览器显示来自 Servlet 的 HTML 代码

java - 重定向代码后仍然从上一页执行