Struts 绝对 uri:http://struts.apache.org/tags-bean 无法在 web.xml 或随此应用程序部署的 jar 文件中解析

Struts The absolute uri: http://struts.apache.org/tags-bean cannot be resolved in either web.xml or the jar files deployed with this application

使用 Servlet 3.0,Maven 4.0,JDK 8 符合 1.8。 我不知道问题是由于 eclipse 无法正确地针对库构建项目,还是 tomcat。这可能是一个权限问题,尽管我 运行 正在 tomcat 和 eclipse 作为 root,但谁知道呢。在这一点上,我开始 运行 没主意了。

Libs Imported

index.jsp

    <%@ page language="java" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type">
<title>Page d'Acceuil</title>
</head>
<body>
    <html:form action="/ajouter">
        <table border="1">
            <caption>Gestion des etudiants STRUTS 1</caption>
            <tr>
                <td>Nom:<input type="text" name="nom"/></td>
                <td>Prenom:<input type="text" name="prenom"/></td>
                <td>Cin:<input type="text" name="cin" /></td>
            </tr>
        <tr>
            <td><input type="submit" value="Recherche Etudiant" onclick="recherche()"/></td>
            <td><input type="submit" value="Ajouter Etudiant" onclick="ajout()"/></td>
            <td><input type="submit" value="Supprimer Etudiant" onclick="sup()"/></td>
        </tr>
    </table>
    </html:form>
</body>
        <script type="text/javascript">
            function ajout(){
                this.document.forms[0].action="ajouter.do";
                this.document.forms[0].submit();
            }
            function recherche(){
                this.document.forms[0].action="rechercher.do";
                this.document.forms[0].submit();
            }
            function sup(){
                this.document.forms[0].action="supprimer.do";
                this.document.forms[0].submit();
            }
        </script>
</html>

我的 index.jsp 请求导致了这个错误:

    Type Exception Report

Message The absolute uri: http://struts.apache.org/tags-bean cannot be resolved in either web.xml or the jar files deployed with this application

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.apache.jasper.JasperException: The absolute uri: http://struts.apache.org/tags-bean cannot be resolved in either web.xml or the jar files deployed with this application
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:55)
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:277)
    org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:75)
    org.apache.jasper.compiler.TagLibraryInfoImpl.generateTldResourcePath(TagLibraryInfoImpl.java:250)
    org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:125)
    org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:421)
    org.apache.jasper.compiler.Parser.parseDirective(Parser.java:479)
    org.apache.jasper.compiler.Parser.parseElements(Parser.java:1435)
    org.apache.jasper.compiler.Parser.parse(Parser.java:139)
    org.apache.jasper.compiler.ParserController.doParse(ParserController.java:227)
    org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:201)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:358)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:338)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:325)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:580)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:363)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

或者这个:

    Type Exception Report

Message java.lang.ClassNotFoundException: org.apache.jsp.index_jsp

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
    org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:176)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Root Cause

java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
    java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:131)
    org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:62)
    org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:171)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Note The full stack trace of the root cause is available in the server logs.

我的 web.xml 如下所示,如您所见,即使我认为我不应该在其中添加这些标签库,因为我使用的是 servlet 3.0,我仍然声明它们以防万一。

    <?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Etudiant</display-name>

  <!-- Servlet controleur de Struts -->
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!-- Mapping des url avec la servlet -->
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <!-- page d'accueil de l'application -->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <jsp-config>
  <taglib>
     <taglib-uri>
      http://struts.apache.org/tags-bean
     </taglib-uri>
     <taglib-location>
      /WEB-INF/struts-bean.tld
     </taglib-location>
</taglib>
<taglib>
     <taglib-uri>
      http://struts.apache.org/tags-html
     </taglib-uri>
     <taglib-location>
      /WEB-INF/struts-html.tld
     </taglib-location>
</taglib>
<taglib>
     <taglib-uri>
      http://struts.apache.org/tags-logic
     </taglib-uri>
     <taglib-location>
      /WEB-INF/struts-logic.tld
     </taglib-location>
</taglib>
  </jsp-config>
</web-app>

我的部署程序集和 java 构建路径也已正确更新以包含这些库,但其中的 none 似乎可以解决问题。

如果您有任何想法,我很乐意调查。

解决方案:

我已经按照以下步骤解决了这个问题:

1) 删除所有的顶级域名。和来自 lib.struts 的罐子。

2) 将项目转为maven性质

3) 将以下依赖项添加到 pom.xml

 <dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.struts/struts-core -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts-core</artifactId>
        <version>1.3.10</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.struts/struts-taglib -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts-taglib</artifactId>
        <version>1.3.10</version>
    </dependency>
</dependencies>

4) 在 struts-config header 中使用相应的 struts 配置 dtd,因为我使用的是 Struts 1.3,所以对我来说如下:

    <!DOCTYPE struts-config PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
   "http://struts.apache.org/dtds/struts-config_1_3.dtd">

5) 确保操作括号语法正确:

<action path="/ajouter" input="/index.jsp" name="myFormBean"
         type="org.your.pckg.src.MyServletAction">
            <forward name="success" path="/redirection_page.jsp" />
        </action>

差不多就这些了,您可能还需要更改 java 合规性,因为我必须从 1.8 降级到 1.7 才能使其正常工作。

最终这并没有回答为什么之前的错误页面出现的问题,尽管事实上所有库似乎都已正确导入和声明,我怀疑问题的根源在于两者之间的兼容性问题tomcat 或 eclipse 和使用的 struts jar,阻止编译器访问和读取 tld 文件。 无论如何,通过这似乎很清楚的是服务器无法部署 tld,其原因尚未确定。

我得到了同样的错误,因为我单独添加的 jar 文件与 pom.xml 中另外调用的 jar 文件之间存在冲突。确保您仅以一种方式依赖于一个罐子。我只通过 maven 添加了 jar (pom.xml) Maven Dependency jars