【问题标题】:IntelliJ Struts 2 application startup problemsIntelliJ Struts 2 应用程序启动问题
【发布时间】:2015-10-21 05:39:00
【问题描述】:

我正在尝试创建一个 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 文件夹:

【问题讨论】:

  • 显示你的 web.xml 和你的 lib 文件夹
  • 我已经添加了您要求的内容
  • 您是否尝试在web.xml 中隐藏XSSFilter 配置?
  • 很多库不是来自 Struts。如果您正在使用 Struts 并且遇到问题,请确保您拥有所有必需的依赖项。 不要将服务器库复制到应用程序,而是将运行时范围用于服务器依赖项。
  • 请发布文字,而不是图片。

标签: java jsp tomcat jdbc struts2


【解决方案1】:

正如this answer 中所说,Tomcat JDBC 池已在 Tomcat 7.0.19 中引入。

由于你没有指定你使用的Tomcat版本,那么

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

  • 如果 Tomcat &gt;= 7.0.19,该 jar 已经在服务器上,并且您将收到 NoClassDefFoundError 因为您将其放入 ear/war 而 Tomcat 不知道哪个一个选择(在服务器一和包一之间)。

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

在 Maven 中,您可以通过将 &lt;scope&gt;provided&lt;/scope&gt; 添加到服务器上已经存在的依赖项来实现。

【讨论】:

  • 还记得在您的问题中粘贴代码(不是图片),并考虑升级到 2.3.24 而不是继续使用 2.3.16.2。越新越好。
【解决方案2】:

Babel 是对的...... xssF​​ilter 有一些我忘记添加的依赖项,并且在构造函数运行时启动时它无法创建类。日志有点误导,但我想通了!谢谢大家

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多