我可以在 JSF 的任何 EL 表达式中使用转换器来格式化对象的输出吗?

Can I use a converter to format the output of an object within any EL expression in JSF?

Class:

public class Booking {
    String foo1;
    String foo2;
}

转换器:

@FacesConverter(forClass = Booking.class)
public class BookingDisplayConverter implements Converter {

@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2)     {        
        Booking booking = (Booking) arg2;        
        return (booking.getFoo1() +" ("+ booking.getFoo2() +")");
    }

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

这很好用:

<h:outputText value="#{ViewReservation.booking}"/>

这不是(它使用 toString()):

<h:commandButton value="Email" onclick="location.href = 'mailto:me@example.com?subject=Reservation: #{ViewReservation.booking})'; return false;"/>  

有没有办法让转换器在第二个示例中工作?

编辑:我知道我可以创建一个 ApplicationBean 范围的格式化程序,它可以做类似 #{ApplicationBean.formatBooking(booking)} 的事情,但我正在寻找为了更优雅的东西。

Is there a way to get the converter to work in the 2nd example?

不是通过标准 JSF API。

JSF 实用程序库 OmniFaces has however an <o:param> 正是为了这个目的,扩展了标准 <f:param> 以支持转换器。但是,这仅适用于 <f:param> 适用的情况,而 onclick 属性并非如此。

如果可以用 <h:outputLink> 替换 <h:commandButton>,那么您可以按如下方式使用它:

<h:outputLink value="mailto:me@example.com">
    Email
    <o:param name="subject" value="#{viewReservation.booking}" />
</h:outputLink>

您总是可以添加一些 CSS 使其看起来像一个按钮。

应该注意的是,您首先应该真正为此使用 <f:param>,因为它还 URL 对查询字符串中使用的值进行编码。例如。 : 应编码为 %3A。内联 EL 表达式不会这样做,如果它包含引号等,可能会导致 URL 甚至 JavaScript 语法错误。

还应该注意的是 <h:commandButton>return false; 毕竟是一个相当笨拙的工作选择。如果你真的需要一个死按钮,你最好抓住 <h:button>