Luc*_*uke 100 jsf enums selectonemenu jsf-2
我想制作一个selectOneMenu下拉列表,以便我可以在我的问题上选择一个状态.是否可以使f:selectItem更灵活,考虑到如果枚举的顺序发生变化会发生什么,以及列表是否很大?我能做得更好吗?是否可以自动"选择"问题所具有的项目?
恩类
public enum Status {
SUBMITTED,
REJECTED,
APPROVED
}
Run Code Online (Sandbox Code Playgroud)
问题实体
@Enumerated(EnumType.STRING)
private Status status;
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 204
JSF有一个内置转换器enum,所以这应该做:
@ManagedBean
@ApplicationScoped
public class Data {
public Status[] getStatuses() {
return Status.values();
}
}
Run Code Online (Sandbox Code Playgroud)
同
<h:selectOneMenu value="#{bean.question.status}" >
<f:selectItems value="#{data.statuses}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
(注意:由于JSF 2.0不再需要提供SelectItem[]or List<SelectItem>,a T[]并且List<T>也被接受,你可以按var属性访问当前项目)
如果您碰巧使用JSF实用程序库OmniFaces,那么您可以使用<o:importConstants>而不是bean.
<o:importConstants type="com.example.Status" />
<h:selectOneMenu value="#{bean.question.status}" >
<f:selectItems value="#{Status}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
如果您打算也控制标签,可以将它们添加到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;
}
}
Run Code Online (Sandbox Code Playgroud)
同
<f:selectItems value="#{data.statuses}" var="status"
itemValue="#{status}" itemLabel="#{status.label}" />
Run Code Online (Sandbox Code Playgroud)
或者,更好的是,使枚举值成为本地化资源包的属性键(需要EL 3.0):
<f:selectItems value="#{data.statuses}" var="status"
itemValue="#{status}" itemLabel="#{text['data.status.' += status]}" />
Run Code Online (Sandbox Code Playgroud)
在与资源包关联的属性文件中使用此方法 #{text}
data.status.SUBMITTED = Submitted
data.status.REJECTED = Rejected
data.status.APPROVED = Approved
Run Code Online (Sandbox Code Playgroud)
Zil*_*tka 16
对于本地化,我们也可以使用此解决方案
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>
Run Code Online (Sandbox Code Playgroud)
因此,本地化字符串的资源路径在Enum中不是硬编码的.
| 归档时间: |
|
| 查看次数: |
81081 次 |
| 最近记录: |