【问题标题】:Format date in <f:selectItem(s) itemLabel> using DateTimeConverter使用 DateTimeConverter 在 <f:selectItem(s) itemLabel> 中格式化日期
【发布时间】:2011-01-10 09:35:18
【问题描述】:

我有一个&lt;h:selectOneMenu&gt;,其中包含&lt;f:selectItems&gt;CategoryHistory 对象。我只将Date date 字段显示为itemLabel。 这有效,但我想格式化日期: 我创建了一个扩展 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>

CategoryHistory 有一个 Date 日期和 Long id +...

谢谢

【问题讨论】:

  • 与实际问题无关:转换器为什么声明@ManagedBean

标签: jsf label converter selectonemenu date-formatting


【解决方案1】:

很遗憾,JSF 转换器仅适用于输入 value,而不适用于输入 label

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

<f:selectItems value="#{admin.categoryHistories}" var="n" itemValue="#{n.id}" 
    itemLabel="#{dateAndTimeconverter.getAsString(facesContext, component, n.date)}">

如果你碰巧使用了 JSF 实用程序库OmniFaces,那么你也可以使用它的of:formatDate() 函数。例如:

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

【讨论】:

  • 哎呀好痛……还是谢谢你:)
  • 我喜欢 OmniFaces,如果没有这个伟大的库,JSF 是不完整的!
【解决方案2】:

您可以在 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>

【讨论】:

    【解决方案3】:

    例子

    xhtml

    <h:selectOneMenu value="#{tbMonitoreoController.fechaMonitoreo}">
    <f:selectItems value="#{tbMonitoreoController.fechasMonitoreo}" />
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 2012-05-21
      • 1970-01-01
      • 2014-03-19
      • 2017-05-28
      • 2021-03-15
      • 2013-04-06
      相关资源
      最近更新 更多