我想创建一个selectOneMenu下拉列表,这样我就可以选择我的问题的状态。有没有可能让f:selectItem更灵活,考虑到如果枚举的顺序改变了会发生什么,如果列表很大会发生什么?我能做得更好吗?是否有可能自动“选择”问题所具有的项目?
枚举类
public enum Status {
SUBMITTED,
REJECTED,
APPROVED
}
问题实体
@Enumerated(EnumType.STRING)
private Status status;
JSF
<div class="field">
<h:outputLabel for="questionStatus" value="Status" />
<h:selectOneMenu id="questionStatus" value="#{bean.question.status}" >
<f:selectItem itemLabel="Submitted" itemValue="0" />
<f:selectItem itemLabel="Rejected" itemValue="1" />
<f:selectItem itemLabel="Approved" itemValue="2" />
</h:selectOneMenu>
<hr />
</div>
发布于 2011-11-23 00:16:12
JSF有一个用于enum
的内置转换器,因此应该这样做:
@Named
@ApplicationScoped
public class Data {
public Status[] getStatuses() {
return Status.values();
}
}
使用
<h:selectOneMenu value="#{bean.question.status}" >
<f:selectItems value="#{data.statuses}" />
</h:selectOneMenu>
(注意:从JSF2.0开始,不再需要提供SelectItem[]
或List<SelectItem>
__,也接受T[]
和List<T>
,您可以通过var
属性访问当前项)
如果您碰巧使用JSF实用程序库OmniFaces,那么您可以使用而不是bean。
<o:importConstants type="com.example.Status" />
<h:selectOneMenu value="#{bean.question.status}" >
<f:selectItems value="#{Status}" />
</h:selectOneMenu>
如果您还想控制标签,可以将它们添加到Status
枚举中:
public enum Status {
SUBMITTED("Submitted"),
REJECTED("Rejected"),
APPROVED("Approved");
private String label;
private Status(String label) {
this.label = label;
}
public String getLabel() {
return label;
}
}
使用
<f:selectItems value="#{data.statuses}" var="status"
itemValue="#{status}" itemLabel="#{status.label}" />
或者,更好的做法是将枚举值设置为本地化资源包的属性键(需要EL 3.0 ):
<f:selectItems value="#{data.statuses}" var="status"
itemValue="#{status}" itemLabel="#{text['data.status.' += status]}" />
在与资源束#{text}
相关联的属性文件中
data.status.SUBMITTED = Submitted
data.status.REJECTED = Rejected
data.status.APPROVED = Approved
发布于 2012-04-06 04:21:25
对于本地化,我们也可以使用这个解决方案:
public enum Status { SUBMITTED, REJECTED, APPROVED }
data.status.SUBMITTED=Submitted
data.status.REJECTED=Rejected
data.status.APPROVED=Approved
<h:selectOneMenu value="#{bean.question.status}" >
<f:selectItems
value="#{data.statuses}"
var="status"
itemValue="#{status}"
itemLabel="#{text['data.status.'.concat(status)]}" />
</h:selectOneMenu>
因此本地化字符串的资源路径不是硬编码在Enum中的。
发布于 2011-11-22 23:54:33
您可以使用<f:selectItems value="#{carBean.carList}" />
并返回包装枚举的SelectItem
实例列表(使用Status.values()
获取所有可能的值)。
https://stackoverflow.com/questions/8229638
复制相似问题