我可以在 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>
。
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>
。