Saya ingin membuat dropdown selectOneMenu sehingga saya dapat memilih status pertanyaan saya. Apakah mungkin membuat f: selectItem lebih fleksibel dengan mempertimbangkan apa yang terjadi jika urutan enum berubah, dan jika daftarnya besar? Dan dapatkah saya melakukan ini dengan lebih baik? Dan apakah mungkin untuk secara otomatis "memilih" item yang dimiliki pertanyaan?
Kelas enum
public enum Status {
SUBMITTED,
REJECTED,
APPROVED
}
Entitas pertanyaan
@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>
sumber
#{bean.question.status}
memiliki nilai enum yang valid. Anda tidak perlu melakukan apa pun untuk memastikan bahwa propertiquestion
memiliki status yang sesuai sebelumnya.+= status
, coba gunakan.concat(status)
seperti yang disarankan @Ziletka.Untuk lokalisasi kita juga bisa menggunakan solusi ini:
Jadi jalur sumber daya untuk string lokalisasi tidak di-hardcode di Enum.
sumber
<c:set>
atau<ui:param>
atau mengubah nama fungsi EL kustom.Anda bisa menggunakan
<f:selectItems value="#{carBean.carList}" />
dan mengembalikan daftarSelectItem
instance yang membungkus enum (gunakanStatus.values()
untuk mendapatkan semua kemungkinan nilai).sumber
Anda dapat menggunakan fungsi utilitas el berikut untuk mendapatkan nilai enum dan menggunakannya dalam a
SelectOneMenu
misalnya. Tidak perlu membuat metode kacang dan boilerplate.Daftarkan sebagai fungsi el di file taglib:
Dan akhirnya menyebutnya seperti:
Mirip dengan jawaban BalusC, Anda harus menggunakan paket sumber daya dengan label enum yang dilokalkan dan untuk kode yang lebih bersih Anda juga dapat membuat fungsi seperti
getEnumLabel(enum)
sumber
#{myBundle[enumName.i18nKey]}
dan kemudian memasukkan kunci i18n ke dalam enumerasi Anda sebagai properti:BLA_TYPE("SOME_BLA_TYPE_KEY")
byBLA_TYPE
adalah enum yang akan digunakan danSOME_BLA_TYPE_KEY
merupakan kunci i18n.