我希望我的页面根据LinkedHashMap中的值显示不同的图像。我有这段代码:
<c:if test="#{myMap.get(1) == 1}">
<h:graphicImage name="images/first.png"/>
</c:if>
<c:otherwise>
<h:graphicImage name="images/second.png"/>
</c:otherwise>
现在,在我的Java类中,我检查了myMap.get(1)的值是1,但页面显示了第二个图像。我的错误在哪里?
编辑:我得到异常“EL Expression Unbalanced”。
答案 0 :(得分:0)
您的问题是<c:if>
是一个简单的JSTL标记来处理,如果有的话,将以下组件添加到JSF组件树情况。另一方面,JSTL和f中还有一个if-else标记,它是与<c:when>
和<c:otherwise>
一起使用的<c:choose>
标记。
因此,正确的条件代码将是
<c:choose>
<c:when test="#{myMap.get(1) eq 1}">
<h:graphicImage name="images/first.png"/>
</c:when>
<c:otherwise>
<h:graphicImage name="images/second.png"/>
</c:otherwise>
</c:choose>
或
<c:if test="#{myMap.get(1) eq 1}">
<h:graphicImage name="images/first.png"/>
</c:if>
<c:if test="#{myMap.get(1) ne 1}">
<h:graphicImage name="images/second.png"/>
</c:if>
如果您的代码配置正确,则需要更改所有内容。关于您可能遇到的其他问题,您需要澄清代码的详细信息,即如果您遇到错误,请将堆栈跟踪与您生成的代码一起发布。
到目前为止,我们还不知道myMap
是什么,或者指的是什么。要使其工作,应该 @ManagedBean ... class MyMap implements Map ...
,或者通过<c:set>
设置,例如myBean.myMap
,用于地图类型的bean属性,或者作用域{ {1}}变量。如果它是来自<c:forEach>
,<ui:repeat>
等的渲染时变量,那么它确实无法按预期工作。有关概述,请参阅JSTL in JSF2 Facelets... makes sense?。
我的回答的最后一点是使用<h:graphicImage>
标记的<h:dataTable>
属性,这样您的代码就不会混淆JSTL标记和JSF组件,并且有条理地为普通JSF提供了一种更清晰的方法 - 组件:
rendered
如果您了解<h:graphicImage name="images/first.png" rendered="#{myMap.get(1) eq 1}" />
<h:graphicImage name="images/first.png" rendered="#{myMap.get(1) ne 1}" />
是什么,您就可以获得三个代码段中的任何一个。
答案 1 :(得分:-1)
我猜您使用的键类型是Integer,只需更改为Long,
EL将数字解释为Long not Integer。
test =“#{myMap.get(1)== 1}”//此行不起作用b'coz,EL解释1为Long。
试试以下代码。
@ManagedBean(name = "index")
public class IndexManagedBean implements Serializable {
private static final long serialVersionUID = 1L;
private final LinkedHashMap<Long, Long> map = new LinkedHashMap<>();
public IndexManagedBean() {
map.put(1L, 1L);
map.put(2L, 2L);
}
public LinkedHashMap<Long, Long> getMap() {
return map;
}
}
<h:body>
<c:if test="#{index.map.get(1) == 1}">
<h:graphicImage name="images/first.png"/>
</c:if>
<c:otherwise>
<h:graphicImage name="images/second.png"/>
</c:otherwise>
</h:body>
答案 2 :(得分:-1)
您必须使用$
符号代替#
。
<c:if test="${myMap.get(1) == 1}">
<h:graphicImage name="images/first.png"/>
</c:if>
而且<c:otherwise>
只能与<c:when>
一起使用,而不能与<c:if>
一起使用。