f : selectItem (s)에서 열거 형 값을 사용하는 방법
질문의 상태를 선택할 수 있도록 selectOneMenu 드롭 다운을 만들고 싶습니다. 열거 형의 순서가 변경되고 목록이 큰 경우 어떻게되는지 고려하여 f : selectItem을 더 유연하게 만들 수 있습니까? 더 잘 할 수 있을까요? 질문에있는 항목을 자동으로 "선택"할 수 있습니까?
Enum 클래스
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>
JSF에는에 대한 내장 변환기가 enum
있으므로 다음을 수행해야합니다.
@ManagedBean
@ApplicationScoped
public class Data {
public Status[] getStatuses() {
return Status.values();
}
}
와
<h:selectOneMenu value="#{bean.question.status}" >
<f:selectItems value="#{data.statuses}" />
</h:selectOneMenu>
(참고 : JSF 2.0가 필요가를 제공하기 위해 더 이상이 없기 때문에 SelectItem[]
또는 List<SelectItem>
하는 T[]
과 List<T>
잘으로 인정하고 있고하여 현재 항목에 액세스 할 수 var
속성)
JSF 유틸리티 라이브러리 OmniFaces를 사용 <o:importConstants>
하는 경우 빈 대신 사용할 수 있습니다 .
<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}" />
또는 더 나은 방법은 enum 값을 지역화 된 리소스 번들의 속성 키로 만드는 것입니다 (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
현지화를 위해 다음 솔루션도 사용할 수 있습니다.
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에서 하드 코딩되지 않습니다.
열거 형을 래핑하는 인스턴스 <f:selectItems value="#{carBean.carList}" />
목록을 사용 하고 반환 할 수 있습니다 SelectItem
( Status.values()
가능한 모든 값을 가져 오는 데 사용 ).
다음 유틸리티 el 함수를 사용하여 열거 형 값을 얻고 SelectOneMenu
예를 들어 사용할 수 있습니다 . 빈과 상용구 메서드를 만들 필요가 없습니다.
public final class ElEnumUtils
{
private ElEnumUtils() { }
/**
* Cached Enumerations, key equals full class name of an enum
*/
private final static Map<String, Enum<?>[]> ENTITY_ENUMS = new HashMap<>();;
/**
* Retrieves all Enumerations of the given Enumeration defined by the
* given class name.
*
* @param enumClassName Class name of the given Enum.
*
* @return
*
* @throws ClassNotFoundException
*/
@SuppressWarnings("unchecked")
public static Enum<?>[] getEnumValues(final String enumClassName) throws ClassNotFoundException
{
// check if already cached - use classname as key for performance reason
if (ElEnumUtils.ENTITY_ENUMS.containsKey(enumClassName))
return ElEnumUtils.ENTITY_ENUMS.get(enumClassName);
final Class<Enum<?>> enumClass = (Class<Enum<?>>) Class.forName(enumClassName);
final Enum<?>[] enumConstants = enumClass.getEnumConstants();
// add to cache
ElEnumUtils.ENTITY_ENUMS.put(enumClassName, enumConstants);
return enumConstants;
}
}
taglib 파일에 el 함수로 등록하십시오.
<function>
<description>Retrieves all Enumerations of the given Enumeration defined by the given class name.</description>
<function-name>getEnumValues</function-name>
<function-class>
package.ElEnumUtils
</function-class>
<function-signature>
java.lang.Enum[] getEnumValues(java.lang.String)
</function-signature>
</function>
마지막으로 다음과 같이 부릅니다.
<p:selectOneMenu value="#{bean.type}">
<f:selectItems value="#{el:getEnumValues('package.BeanType')}" var="varEnum"
itemLabel="#{el:getEnumLabel(varEnum)}" itemValue="#{varEnum}"/>
</p:selectOneMenu>
Similiar to BalusC answer you should be using a resource bundle with localized enum labels and for cleaner code you can also create a function like getEnumLabel(enum)
참고URL : https://stackoverflow.com/questions/8229638/how-to-use-enum-values-in-fselectitems
'Programming' 카테고리의 다른 글
iOS 7.0.3에서“HelveticaNeue-Italic”에 발생한 일 (0) | 2020.08.19 |
---|---|
누군가 SBT를 사용하는 올바른 방법을 설명 할 수 있습니까? (0) | 2020.08.19 |
pip를 사용하여 Windows에 PyQt4를 설치하는 방법은 무엇입니까? (0) | 2020.08.18 |
SQL : 문자열이 같지 않은 수행 방법 (0) | 2020.08.18 |
LPCSTR, LPCTSTR 및 LPTSTR (0) | 2020.08.18 |