9

我在 JSF 中使用此代码:

<c:if test="#{sV.done.booleanValue()}">
     <option value="#{sV.id}" selected="selected">#{sV.text}</option>
</c:if>
<c:if test="#{not sV.done.booleanValue()}">
     <option value="#{sV.id}">#{sV.text}</option>
</c:if>

sv是我的类包含数据(pojo),done 是一个Boolean变量,我想显示option带有selected属性的标签 if sV.doneis true。但我做不到。不知道我哪里错了。

否则可能会出现问题c,因为c:forEach在我的情况下在同一页面中的某个时间之前没有工作?可能是什么原因?我哪里错了?

每次它显示选项标签时没有 selected attribute

4

4 回答 4

7

尝试这个: -

<c:if test="${sV.done == true}">...</c:if>  // or
<c:if test="${sV.done eq true}">...</c:if>  // or
<c:if test="${sV.done}">...</c:if>   // or

而对于否定(如果 sV.done 为假): -

<c:if test="${! sV.done}">...</c:if>    /// OR
<c:if test="${not sV.done}">...</c:if>  /// OR
<c:if test = "${sV.done != true}">...</c:if>     // OR
<c:if test = "${sV.done ne true}">...</c:if>  // OR

有关if 运算符的更多信息,请查看此链接:- JSTL if

于 2012-10-06T09:35:51.473 回答
5

只要您使用的是 EL 2.2,您的语法就很好。那么,没有一个 JSTL<c:xxx>标记被解释?您需要导入 JSTL 核心标记库。不清楚您使用的是什么视图技术和 JSTL 版本,因此这里是 JSP 和 Facelets 的导入示例。

带有 JSTL 1.0 的 JSP:

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

带有 JSTL 1.1/1.2 的 JSP:

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

带有 JSTL 1.1/1.2 的 Facelets 1.x:

<html ... xmlns:c="http://java.sun.com/jstl/core">

带有 JSTL 1.2 的 Facelets 2.x:

<html ... xmlns:c="http://java.sun.com/jsp/jstl/core">

也可以看看:


与具体问题无关,您是否考虑过使用 JSFUISelectOne组件而不是自己摆弄<option>元素?您可以在我们的h:selectOneMenuwiki 页面中找到一些具体示例。

于 2012-10-06T11:38:05.990 回答
3

JSF 和 JSTL 都直接访问“盒装”对象(布尔值、整数等)。不需要拆箱——因此您不必调用 booleanValue()。

<c:if test="${sV.done}">...</c:if>

但实际上,您的整个方法可能会更好——我不在页面中呈现选项,没有选项列表和值。我不会每次都手动写出循环和选择测试,有标签或者你可以编写一个方法来做到这一点。

超级提示: 我有一个名为 Pair(String name, Object value) 和库方法 HtmlUI.renderSelectOptions() 的类,用于从这些列表和“当前”值中输出 SELECT 选项。

选择组合框可能也不是布尔值的最佳表示?您可以使用复选框。但这取决于您的 UI 设计。

如果您确实想这样做,您可以只切换标签内的 SELECTED 属性。比为整个、键和值复制代码更容易。对于遗留代码,我有一个函数也可以满足这个确切的要求:)

希望这可以帮助!投票给我。

于 2012-10-06T10:41:23.280 回答
-2

正如我在问题中提到的那样,似乎其他一些组件/库正在干扰 c:if 的工作,它在任何情况下都不起作用。我尝试了上面给出的所有建议。感谢大家的回复。

于 2013-01-07T07:02:44.047 回答