Проблемы совместимости тегов библиотеки Struts 1.x с тегами jstl - PullRequest
0 голосов
/ 06 ноября 2018

Я решил опубликовать этот вопрос после 3,5 недель блокировки, и я действительно нуждаюсь в чьей-либо помощи.

Проблема связана с совместимостью и согласованностью различных тегов, из-за ограниченного бюджета мы не смогли перенести IHM и веб-фреймворк приложения, который Struts 1.2

Проблема, возникшая после моего анализа, приводит к несовместимости между тегами-вложениями с вложенными в него структурами и возможными значениями 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: когда тестовый атрибут использует свойство listeSupportsStructuresPlPg , предоставленное тегом nested: iterate , когда я заменяю nested: итерация с c: forEach это работает просто отлично, но происходит сбой позже, когда я хочу сделать что-то еще +, есть сотни раз такого кода, и будет почти невозможно решить. Это очень сложная ситуация, с которой я сталкиваюсь в эти времена, особенно из-за того, что я сделал все возможное, чтобы эти несовместимые теги работали друг с другом, но хорошие результаты не были получены.

Контекст проекта: мы мигрировали с сервера Web-Logic на WilfFly 10.0.0.FINAL, перед миграцией я хотел бы сказать, что этот вопрос никогда не существовал.

Решения, которые я пробовал до публикации этого вопроса

Я заменил локальный ctld на

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

Я заменил nested: iterate на c: forEach, но это не сработало

Я заменил strus-nested.tld многими определениями, но это не сработало

Я обновил версию с 1.2 до 1.3, пока не закончился 1.x

Я пытался изменить значение условий, вычисляя логические значения вместо списков, но это работало только в некоторых местах, и я не мог найти причину.

это все, что я могу вспомнить, но могу вас заверить, что я перепробовал множество возможных исправлений, но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Я решил это после глубокого анализа, парень,

Вот шаги, которые я выполнил, чтобы я мог заставить эту страницу работать

Шаг 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 Framework

Ранее версия ядра была на 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 , который представляет то же самое, что var представляет в c: Foreach

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

Таким образом, теги jstl c могут понимать элемент свойства nested: iterate .

Только для информации, вы пропустите один, если эти шаги, ничего не работает

Спасибо за тех, кто пытался помочь.

0 голосов
/ 15 ноября 2018

Я не думаю, что ваши c теги не знают, как получить доступ к стеку значений Struts, поэтому они не знают, что такое listeSupportsStructuresPlPg. Используйте распорки, эквивалентные <c:choose>. В Struts 2 это <s:if>. Я не совсем уверен, что именно в Struts 1, но, вероятно, что-то похожее.

...