Jsf 在<;f:选择项目标签>;使用DateTimeConverter

Jsf 在<;f:选择项目标签>;使用DateTimeConverter,jsf,label,converter,selectonemenu,date-formatting,Jsf,Label,Converter,Selectonemenu,Date Formatting,我有一个,其中加载了类历史对象。我仅将日期字段显示为项目标签。 这是可行的,但我想格式化日期: 我创建了一个转换器,它扩展了javax.faces.convert.DateTimeConverter,并更改构造函数中的字段。但我的日期仅以默认格式显示:( DateAndTimeConverter.java import javax.faces.bean.ManagedBean; import javax.faces.convert.Converter; import javax.faces.co

我有一个
,其中加载了
类历史对象。我仅将
日期
字段显示为
项目标签
。 这是可行的,但我想格式化日期: 我创建了一个转换器,它扩展了
javax.faces.convert.DateTimeConverter
,并更改构造函数中的字段。但我的日期仅以默认格式显示:(

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>

当我尝试以下操作时,它也不起作用:

<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>

类别历史记录有日期和长id+


谢谢

不幸的是,JSF转换器仅适用于输入,而不适用于输入标签

您需要用其他方法来解决这个问题。例如,一个用于格式化日期的getter。或者,如果您的环境支持EL 2.2,只需直接调用converter方法(您已经将其作为托管bean使用):


不幸的是,JSF转换器仅适用于输入,而不适用于输入标签

您需要用其他方法来解决这个问题。例如,一个用于格式化日期的getter。或者,如果您的环境支持EL 2.2,只需直接调用converter方法(您已经将其作为托管bean使用):


您可以在bean中使用转换器方法,如下所示:

public class Admin{
    ...
        public String formatDate(Date fecha, String pattern) {
            return (new SimpleDateFormat(pattern)).format(fecha);
        }
    ...
}
并且,在xhtml页面的f:selectItems内:

<f:selectItems value="#{admin.categoryHistories}" var="n"
               itemValue="#{n.id}" itemLabel="#{admin.formatDate(n.date,'d MMM yyyy')}">
</f:selectItems>

您可以在bean中使用转换器方法,如下所示:

public class Admin{
    ...
        public String formatDate(Date fecha, String pattern) {
            return (new SimpleDateFormat(pattern)).format(fecha);
        }
    ...
}
并且,在xhtml页面的f:selectItems内:

<f:selectItems value="#{admin.categoryHistories}" var="n"
               itemValue="#{n.id}" itemLabel="#{admin.formatDate(n.date,'d MMM yyyy')}">
</f:selectItems>

示例

xhtml


tbmonitorocontroller中的方法

public SelectItem[]getFechasMonitoreo(){
集合实体=getEjbFacade().getFechasMonitoreo();
返回JsfUtil.getSelectItemsFechasMonitoreo(实体,true);
}
公共静态SelectItem[]getSelectItemsFechasMonitoreo(集合列表日期,布尔selectOne){
int size=selectOne?(listDate.size()+1):listDate.size();
SelectItem[]items=新建SelectItem[尺寸];
int i=0;
如果(选择一){
items[0]=新建SelectItem(空,“--”);
i++;
}
SimpleDataFormat SimpleDataFormat=新的SimpleDataFormat(“日/月/年”);
对于(日期x:listDate){
items[i++]=newselectitem(x,simpleDateFormat.format(x));
}
退货项目;
}
示例

xhtml


tbmonitorocontroller中的方法

public SelectItem[]getFechasMonitoreo(){
集合实体=getEjbFacade().getFechasMonitoreo();
返回JsfUtil.getSelectItemsFechasMonitoreo(实体,true);
}
公共静态SelectItem[]getSelectItemsFechasMonitoreo(集合列表日期,布尔selectOne){
int size=selectOne?(listDate.size()+1):listDate.size();
SelectItem[]items=新建SelectItem[尺寸];
int i=0;
如果(选择一){
items[0]=新建SelectItem(空,“--”);
i++;
}
SimpleDataFormat SimpleDataFormat=新的SimpleDataFormat(“日/月/年”);
对于(日期x:listDate){
items[i++]=newselectitem(x,simpleDateFormat.format(x));
}
退货项目;
}

与实际问题无关:为什么声明转换器为
@ManagedBean
?与实际问题无关:为什么声明转换器为
@ManagedBean
?哎哟,很痛……无论如何,谢谢:)我喜欢OmniFaces,没有这个伟大的库,JSF是不完整的!哎哟,好痛。。。无论如何谢谢:)我喜欢OmniFaces,没有这个伟大的库JSF是不完整的!
<h:selectOneMenu value="#{tbMonitoreoController.fechaMonitoreo}">
<f:selectItems value="#{tbMonitoreoController.fechasMonitoreo}" />
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;
}