jstl标记与Struts 1.x标记库的兼容性问题

时间:2018-11-06 15:49:05

标签: java jstl wildfly struts taglib

我决定在屏蔽3.5周后发布此问题,我真的需要别人的帮助。

问题在于不同标签库的兼容性和一致性,出于预算原因,我们无法迁移 struts 1.2

的应用程序的IHM和Web框架

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

例如:

以下代码不起作用

The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

initdb: could not change permissions of directory "/var/lib/postgresql/data/pgdata": Operation not permitted

您可以看到 c:when 测试属性使用了 nested:iterate 标记提供的属性 listeSupportsStructuresPlPg ,当我替换 nested:iterate c:forEach 一起正常工作,但是稍后当我想做另一件事时会崩溃+此类代码出现了100多次,几乎不可能解决。这些时期我面临着一个非常困难的情况,尤其是我已尽一切可能使不兼容的标签相互配合,但未获得良好的结果。

  

项目上下文:我们正在从Web-Logic Server迁移到WilfFly 10.0.0.FINAL,在迁移之前,我想说这个问题根本不存在。

我在发布此问题之前尝试过的解决方案

  

我用

替换了本地c.tld
            <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:forEach替换了nested:iterate,但是没有用

     

我用很多定义替换了strus-nested.tld,但是没有用

     

我将版本从1.2升级到1.3,直到1.x终止

     

我试图通过评估布尔值而不是列表来更改条件的值,但它仅在某些地方有效,我找不到原因。

仅此而已,但我可以向您保证,我尝试了许多可能的修复程序,但没有结果。

2 个答案:

答案 0 :(得分:0)

我不认为您的c标签不知道如何访问Struts值堆栈,因此他们不知道listeSupportsStructuresPlPg是什么。使用等效于<c:choose>的struts。在Struts 2中,这是<s:if>。我不确定Struts 1到底是什么,但是可能有点相似。

答案 1 :(得分:0)

我是经过深入分析的人解决的,

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

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

以前,它们是从WEB-INF文件夹本地加载的,我对其进行了更改,以便可以直接从相应的jar中加载。

 <%@ 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

第3步: 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>

并且我通过添加元素 id 更改了 nested:iterate 的一点,该元素表示与 var 相同的元素> c:forEach

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

通过这种方式, jstl c 标签可以理解 nested:iterate 属性元素。

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

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