JSTL c: forEach тег не работает для выражения El в JSF - PullRequest
0 голосов
/ 25 мая 2019

Пытаясь решить более крупную проблему с помощью JSF, я заметил, что не могу использовать c: forEach для перебора списков.Исследования научили меня, что сейчас есть несколько разных версий, и я полагаю, что я использую JSF 2.2.

Я пробовал несколько разных настроек в файле web.xml и в теге xmlns: c, но безрезультатно..

Ниже приведен тестовый файл для демонстрации того, что не работает: index.html включает Content / Content_index.xhtml, который включает Content / Recursive_Box.xhtml:

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
    <c:choose>
        <c:when test="#{LoginBean.currentUser.loggedOn}">
            <ui:include src="#{MainBean.setLayout(0,0,0)}"></ui:include>
        </c:when>
        <c:otherwise>
            <ui:include src="#{MainBean.setLayout(0,6,0)}"></ui:include>
        </c:otherwise>
    </c:choose>
</html>

Content_index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
        xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
    <c:choose>
        <c:when test="#{LoginBean.currentUser.loggedOn}">
            <title>
                Bubble Up!
            </title>
<!--<c:set value="#{TargetBean.PullStructure(LoginBean.currentUser.userIndex)}" var="tickle"></c:set>-->
            <ui:include src="Recursive_Box.xhtml">
                <ui:param name="box" value="#{TargetBean.structure}" />
            </ui:include>
        </c:when>
    </c:choose>
</html>

Recursive_Box.xhtml (работают только первые 2 теста: статический и тест1)

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
        xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
    #{box}<br/>

    #{box.boxList}<br/>
    #{box.getBoxList()}<br/>
    #{box.boxList.get(0)}<br/>

    #{box.boxList.size()}<br/>
    <c:forEach var = "i" begin = "1" end = "5">
        Static<br/>
    </c:forEach>
    <c:forEach var = "i" begin = "0" end = "#{box.boxList.size()}">
        Test1<br/>
    </c:forEach>
    <c:forEach var = "i" begin = "1" end = "#{box.boxList.size()}">
        Test2<br/>
    </c:forEach>
    <c:forEach var = "i" items = "#{box.getBoxList()}">
        Test2<br/>
    </c:forEach>
    <c:forEach var = "i" begin = "1" end = "#{box.getBoxList().size()}">
        Test3<br/>
    </c:forEach>

    <c:forEach var = "i" begin = "1" end = "${box.boxList.size()}">
        Test4<br/>
    </c:forEach>
    <c:forEach var = "i" items = "${box.getBoxList()}">
        Test5<br/>
    </c:forEach>
    <c:forEach var = "i" begin = "1" end = "${box.getBoxList().size()}">
        Test6<br/>
    </c:forEach>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
            http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

Я должен иметь возможность перебирать заданный список, но для моих тестов я получаю следующий вывод:

Main.Box@50eb0e0
[Main.Box@2452c4d, Main.Box@5fd03294, Main.Box@4c97b69b, Main.Box@3c6e8659, Main.Box@17e2e2dd]
[Main.Box@2452c4d, Main.Box@5fd03294, Main.Box@4c97b69b, Main.Box@3c6e8659, Main.Box@17e2e2dd]
Main.Box@2452c4d
5
Static
Static
Static
Static
Static
Test1

1 Ответ

0 голосов
/ 05 июня 2019

В конце концов я понял, что это на самом деле не связано с конфигурацией, но связано со сборкой и временем рендеринга (именно это привело меня к выполнению c: forEach, а не к ui: repeat, нуждающемуся в UI: включить, как я сделал).

Поскольку TargetBean (где находится коллекция) зависит от LoginBean, TargetBean должен быть создан с использованием идентификатора пользователя LoginBean для получения коллекции из базы данных. Это также должно быть первым делом, чтобы циклы c: forEach имели информацию для перебора, и, следовательно, должны происходить во время сборки (например, c: forEach), поэтому мне пришлось поместить вызов в первый c: forEach. поскольку у меня нет других тегов времени сборки для использования в моем примере.

Вот мой тестовый файл, в котором я смог получить отображаемые результаты:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
        xmlns:ui="http://xmlns.jcp.org/jsf/facelets">


    Test 1:<br/>
    <c:forEach var = "i" begin = "0" end = "#{TargetBean.PullStructure(0).boxList.size()-1}">
        Result 1!<br/>
    </c:forEach>

    #{TargetBean}<br/>            
    #{TargetBean.structure.boxList}<br/>
    #{TargetBean.structure.getBoxList()}<br/>
    #{TargetBean.structure.boxList.get(0)}<br/>
    #{TargetBean.structure.boxList.size()}<br/>    
    <br/><br/>

    Static:<br/>
    <c:forEach var = "i" begin = "0" end = "4">
        #{i}: #{TargetBean.structure.boxList.get(i)}<br/>
    </c:forEach>
    Test 2:<br/>
    <c:forEach var = "i" begin = "1" end = "#{TargetBean.structure.boxList.size()-1}">
        Result 2!<br/>
    </c:forEach>
    Test 3:<br/>
    <c:forEach var = "i" items = "#{TargetBean.structure.getBoxList()}">
        Result 3!<br/>
    </c:forEach>
    Test 4:<br/>
    <c:forEach var = "i" begin = "1" end = "#{TargetBean.structure.getBoxList().size()-1}">
        Result 4!<br/>
    </c:forEach>
    Test 5:<br/>
    <c:forEach var = "i" begin = "1" end = "${TargetBean.structure.boxList.size()-1}">
        Result 5!<br/>
    </c:forEach>
    Test 6:<br/>
    <c:forEach var = "i" items = "${TargetBean.structure.getBoxList()}">
        Result 6!<br/>
    </c:forEach>
    <c:forEach var = "i" begin = "1" end = "${TargetBean.structure.getBoxList().size()-1}">
        Test6<br/>
    </c:forEach>
    Test 7:<br/>
    <c:forEach var = "i" begin = "0" end = "${TargetBean.structure.boxList.size()-1}">
        #{TargetBean.structure.boxList.get(i)}<br/>
    </c:forEach>
</html>
...