天天看点

org.apache.openejb.OpenEJBException: Unable to load servlet filter class: org.apache.struts2.dispatc

关于使用Intellij IDEA 创建Struts2程序出现

Caused by: org.apache.openejb.OpenEJBException: Unable to load servlet filter class: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    at org.apache.openejb.config.AnnotationDeployer$ProcessAnnotatedBeans.deploy(AnnotationDeployer.java:)
    at org.apache.openejb.config.AnnotationDeployer$ProcessAnnotatedBeans.deploy(AnnotationDeployer.java:)
    at org.apache.openejb.config.AnnotationDeployer.deploy(AnnotationDeployer.java:)
    at org.apache.openejb.config.ConfigurationFactory$Chain.deploy(ConfigurationFactory.java:)
    at org.apache.openejb.config.ConfigurationFactory.configureApplication(ConfigurationFactory.java:)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:)
    at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.deployWar(TomcatWebAppBuilder.java:)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.deployWebApps(TomcatWebAppBuilder.java:)
    at org.apache.tomee.catalina.deployment.TomcatWebappDeployer.deploy(TomcatWebappDeployer.java:)
    ...  more

Caused by: java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    at org.apache.openejb.core.TempClassLoader.loadClass(TempClassLoader.java:)
    at org.apache.openejb.core.TempClassLoader.loadClass(TempClassLoader.java:)
    at org.apache.openejb.config.AnnotationDeployer$ProcessAnnotatedBeans.deploy(AnnotationDeployer.java:)
    ...  more
           

错误的解决办法;

错误提示找不到 不能加载 Filter class,但是jar包都是intellij idea自动下载的,按Ctrl点击StrutsPrepareAndExecuteFilter又可以找到StrutsPrepareAndExecuteFilter类。

org.apache.openejb.OpenEJBException: Unable to load servlet filter class: org.apache.struts2.dispatc

于是检查一下文件目录结构

org.apache.openejb.OpenEJBException: Unable to load servlet filter class: org.apache.struts2.dispatc

发现lib文件夹在工程目录下面,尝试将其拖到web下的WEB-INF下,

org.apache.openejb.OpenEJBException: Unable to load servlet filter class: org.apache.struts2.dispatc

然后选中所有的jar文件右键Add as Library…

org.apache.openejb.OpenEJBException: Unable to load servlet filter class: org.apache.struts2.dispatc

至此还有个小问题就是Struts.xml文件中的struts-default会报红,

找到file->priogect Settings->facets

org.apache.openejb.OpenEJBException: Unable to load servlet filter class: org.apache.struts2.dispatc

在File Sets下重新编辑一下Default File Set 中的Struts-default.xml文件的路径便可。

重启服务器,问题解决;

WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。

如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。

/WEB-INF/web.xml : Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。

/WEB-INF/classes/ : 包含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中。

/WEB-INF/lib/ : 存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件。

页面放在WEB-INF目录下面,这样可以限制访问,提高安全性.如JSP,html

web所以web应用的jar文件应该放在WEB-INF文件夹下,否则会访问不到。

至于intellij idea为什么把lib文件夹放到工程的根目录下,我也不知道为啥。