Struts 1.x taglibs 与 jstl 标签的兼容性问题

Struts 1.x taglibs compatibility issues with jstl tags

我决定 post 在屏蔽了 3.5 周后回答这个问题,我真的需要别人的帮助。

问题在于不同标签库的兼容性和连贯性,出于预算原因,我们无法迁移 struts 1.2[=42= 应用程序的 IHM 和 Web 框架]

我分析后的问题导致 struts-nested taglib 及其可能值与 jstl 标签值不兼容.

例如:

以下代码无效

            <nested:iterate property="listeSupportsStructuresPlPg">
                <c:choose>
                    <c:when test="${listeSupportsStructuresPlPg.code eq 'PL' && !listeSupportsStructuresPlPg.testOfNajah}">
                        <div class="row">
                            <div class="niveauPLPG">
                                <b>Poche libre </b>
                            </div>
                        </div>
                </c:when>
              </c:choose>
        </nested:iterate>

如您所见,c:when 测试属性使用 属性 listeSupportsStructuresPlPg nested:iterate 标签,当我用 c:forEach 替换 nested:iterate 时,它工作正常但稍后崩溃当我想做另一件事时 + 此类代码出现 100 次,几乎无法解决。这是我现在面临的一个非常困难的情况,尤其是我已经尽了一切可能使这个不兼容的标签相互配合但没有获得好的结果。

Project Context: We were migrating from Web-Logic Server To WilfFly 10.0.0.FINAL, before Migration i'd like to say that this isssue never existed.

我在post回答这个问题之前尝试过的解决方案

I replaced the local c.tld with

   <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

I replaced nested:iterate with c:forEach but it didn't work

I replaced strus-nested.tld with many definitions but it didn't work

I upgraded the version from 1.2 to 1.3 until 1.x terminated

I tried to do change the value of the conditions by evaluating booleans instead of lists but it worked only in some places and i couldn't find why.

我只记得这些,但我可以向你保证,我尝试了很多可能的修复方法,但没有结果。

我认为您的 c 标签不知道如何访问 Struts 值堆栈,所以它们不知道 listeSupportsStructuresPlPg 是什么。使用 struts 等同于 <c:choose>。在 Struts 2 中,这是 <s:if>。我不确定 Struts 1 中的确切内容,但可能类似。

经过大佬的深入分析解决了,

这是我遵循的步骤,因此我可以使此页面正常工作

第 1 步:改变我们加载 TLD 的方式

以前它们是从 WEB-INF 文件夹本地加载的,我更改了它以便可以直接从适当的 jars 加载。

 <%@ 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-nested" prefix="nested" %>
 <%@ taglib uri="/WEB-INF/cgit.tld" prefix="cgit" %>
 <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
 <%@ taglib uri="http://java.sun.com/jstl/xml" prefix="x" %>

第 2 步:删除所有本地 TLD

第三步:Struts框架版本升级

之前他们的核心版本是1.2.8,当前版本是1.3.10

        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts-core</artifactId>
            <version>1.3.10</version>
            <optional>true</optional>
        </dependency>


        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts-taglib</artifactId>
            <version>1.3.10</version>
        </dependency>

        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts-tiles</artifactId>
            <version>1.3.10</version>
        </dependency>

        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts-tiles</artifactId>
            <version>1.3.10</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts-extras</artifactId>
            <version>1.3.10</version>
        </dependency>

我通过添加元素 idnested:iterate 做了一点改动,它代表与 [=35= 相同的东西]var代表在c:forEach

    <nested:iterate id="row" property="listeSupportsStructuresPlPg">
            <c:out value="${row.****}"/>
    </nested:iterate>

这样 jstl c 标签可以理解 nested:iterate 属性 元素。

仅供参考,如果这些步骤无效,请跳过其中一个

感谢那些试图提供帮助的人。