Bonjour,
J'ai remarqué un comportement étrange dans les facelets, lors de l'utilisation des c:if avec des tableaux.
Je suis désolée, j'avais déjà traduit mon code en anglais pour le poster.
Quelq'un peut-il m'aider ?
Merci
With MyBean (managed bean) having an array myStrings defined as this:
The following test works:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public class MyBean { private int[] myIntegers={6,5,4,3,2,1,0}; ... getter/setter.... }
and "YESSS" is rendered correctly.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <c:if test="${myBean.myIntegers[1] eq 5}"> YESSS </c:if>
But when I replace the index "1" with a variable "myVar", it does not work anymore!
My question is how to make it work.
This is an example of "myVar" that comes from a <ui:repeat> loop:
In this example, this test does not work:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <ui:repeat value="#{myBean.myStrings}" var="myVar" varStatus="loop"> <!-- condition returns true or false when needed--> myIntegers [#{loop.index}]: #{myBean.myIntegers[loop.index]} => #{myBean.myIntegers[loop.index] eq 5} <!-- when we set condition in the test, it doesn t enter the c:if when test returns true--> <c:if test="${myBean.myIntegers[loop.index] eq 5}"> IT WORKS!!! myIntegers==5, we are inside c:if. <!-- Never rendered, unfortunately --> </c:if> <br /> </ui:repeat>
But just above, the expression:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <c:if test="${myBean.myIntegers[loop.index] eq 5}">
works well outside the c:if, and "true" is rentered when loop.index == 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #{myBean.myIntegers[loop.index] eq 5}
Can anyone tell me where I'm wrong (or confirm it's a known bug)?
Many thanks,
LP.
Using:
Tomcat v6.0
MyFaces: myfaces-api-1.2.8 and myfaces-impl-1.2.8
Facelets: jsf-facelets (1.1.15)
EL: jstl-api-1.2 jstl-impl-1.2
Full listing:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 package art.control; import java.util.ArrayList; import java.util.List; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component @Scope("session") public class MyBean { private int[] myIntegers={6,5,4,3,2,1,0}; // In the xhtml facelet <ui:repeat> element, we'll iterate over that list private List<String> myStrings; public MyBean(){ myStrings = new ArrayList<String>(); myStrings.add("G"); myStrings.add("F"); myStrings.add("E"); myStrings.add("D"); myStrings.add("C"); myStrings.add("B"); myStrings.add("A"); } public int[] getMyIntegers() { return myIntegers; } public void setMyIntegers(int[] myIntegers) { this.myIntegers = myIntegers; } public List<String> getMyStrings() { return myStrings; } public void setMyStrings(List<String> myStrings) { this.myStrings = myStrings; } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 <!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:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:z="http://www.qualcomm.com/jsf/core" xmlns:c="http://java.sun.com/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Insert title here</title> </head> <body> myIntegers[]==5? <br /> <br /> <!-- in this case, test returns false, that s ok --> myIntegers[0]: ${myBean.myIntegers[0] } ==>${myBean.myIntegers[0] eq 5} <c:if test="${myBean.myIntegers[0] eq 5}"> Item 0 equals 5, we are inside c:if </c:if> <br /> <!-- in this case, test returns true, which is ok --> myIntegers[1] :${myBean.myIntegers[1] } ==>${myBean.myIntegers[1] eq 5} <c:if test="${myBean.myIntegers[1] eq 5}"> Item 1 equals 5, we are inside c:if </c:if> <br /> <br /> <ui:repeat value="#{myBean.myStrings}" var="myVar" varStatus="loop"> <!-- condition returns true or false when needed--> myIntegers [#{loop.index}]: #{myBean.myIntegers[loop.index]} => #{myBean.myIntegers[loop.index] eq 5} <!-- when we set condition in the test, it doesn t enter the c:if when test returns true--> <c:if test="${myBean.myIntegers[loop.index] eq 5}"> IT WORKS!!! myIntegers==5, we are inside c:if. <!-- Never rendered, unfortunately --> </c:if> <br /> </ui:repeat> </body> </html>
Displayed after execution:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 myIntegers[]==5? myIntegers[0]: 6 ==>false myIntegers[1] :5 ==>true Item 1 equals 5, we are inside c:if myIntegers [0]: 6 => false myIntegers [1]: 5 => true myIntegers [2]: 4 => false myIntegers [3]: 3 => false myIntegers [4]: 2 => false myIntegers [5]: 1 => false myIntegers [6]: 0 => false
Partager