Format Datum in mit Datetimeconverter
-
23-09-2019 - |
Frage
Ich habe eine <h:selectOneMenu>
die <f:selectItems>
mit CategoryHistory
Objekte geladen darin. Ich zeige nur das Date date
Feld als itemLabel
.
Das funktioniert, aber ich möchte das Datum zu formatieren:
Ich habe einen Konverter, der javax.faces.convert.DateTimeConverter
und ändern Sie die Felder in den Konstruktor erstreckt. Aber meine Daten zeigen nur in Standardformat: (
DateAndTimeConverter.java
import javax.faces.bean.ManagedBean;
import javax.faces.convert.Converter;
import javax.faces.convert.DateTimeConverter;
import javax.faces.convert.FacesConverter;
@FacesConverter(value = "dateAndTimeconverter")
@ManagedBean
public class DateAndTimeConverter extends DateTimeConverter implements Converter {
public DateAndTimeConverter(){
this.setDateStyle("short");
}
xhtml
<h:selectOneMenu valueChangeListener="#{admin.categoryHistoryListener}"
onchange="submit()" value="#{admin.categoryHistory.id}" converter="#{dateAndTimeconverter}">
<f:selectItems value="#{admin.categoryHistories}" var="n"
itemValue="#{n.id}" itemLabel="#{n.date}">
</f:selectItems>
</h:selectOneMenu>
Es ist auch nicht arbeiten, wenn ich versuche:
<h:selectOneMenu valueChangeListener="#{admin.categoryHistoryListener}"
onchange="submit()" value="#{admin.categoryHistory.id}">
<f:converter converterId="dateAndTimeconverter"/>
<f:selectItems value="#{admin.categoryHistories}" var="n"
itemValue="#{n.id}" itemLabel="#{n.date}">
</f:selectItems>
</h:selectOneMenu>
CategoryHistory Hat ein Datum das Datum und die Lange id + ...
Danke
Lösung
Leider ist der JSF-Wandler gilt nur am Eingang Wert , nicht am Eingang Label .
Sie müssen diese anderen Wege zu lösen. Z.B. die ein Getter verwendet SimpleDateFormat
zu formatieren, die Datum. Oder wenn Ihre Umgebung unterstützt EL 2.2, einfach invoke die Konverter Methode direkt (Sie haben es als Managed Bean bereits):
<f:selectItems value="#{admin.categoryHistories}" var="n" itemValue="#{n.id}"
itemLabel="#{dateAndTimeconverter.getAsString(facesContext, component, n.date)}">
Wenn Sie geschehen, JSF-Utility-Bibliothek benutzen OmniFaces , dann können Sie auch die of:formatDate()
Funktion. Z.
<f:selectItems value="#{admin.categoryHistories}" var="n" itemValue="#{n.id}"
itemLabel="#{of:formatDate(n.date, 'd MMM yyyy')}">
Andere Tipps
Sie können eine Konverter-Methode in Ihrem Bean verwenden, wie:
public class Admin{
...
public String formatDate(Date fecha, String pattern) {
return (new SimpleDateFormat(pattern)).format(fecha);
}
...
}
Und in Ihrer xhtml Seite innen f: selectItems:
<f:selectItems value="#{admin.categoryHistories}" var="n"
itemValue="#{n.id}" itemLabel="#{admin.formatDate(n.date,'d MMM yyyy')}">
</f:selectItems>
Beispiel
xhtml
<h:selectOneMenu value="#{tbMonitoreoController.fechaMonitoreo}">
<f:selectItems value="#{tbMonitoreoController.fechasMonitoreo}" />
Methode in tbMonitoreoController
public SelectItem[] getFechasMonitoreo(){
Collection<Date> entities = getEjbFacade().getFechasMonitoreo();
return JsfUtil.getSelectItemsFechasMonitoreo(entities, true);
}
public static SelectItem[] getSelectItemsFechasMonitoreo(Collection<Date> listDate, boolean selectOne) {
int size = selectOne ? (listDate.size() + 1) : listDate.size();
SelectItem[] items = new SelectItem[size];
int i = 0;
if (selectOne) {
items[0] = new SelectItem(null, "---");
i++;
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
for (Date x : listDate) {
items[i++] = new SelectItem(x, simpleDateFormat.format(x));
}
return items;
}