2

我正在尝试使用如下所示的片段来实现 pinterest 的 pinit 按钮:

<h:outputLink value="http://pinterest.com/pin/create/button/" class="pin-it-button" count-layout="horizontal">
   <f:param name="url" value="#{beanOne.someMethod}/sometext{prettyContext.requestURL.toURL()}"/>
   <f:param name="media" value="#{beanOne.someOtherMethod}/sometext/somemoretext/#{beanTwo.someMethodTwo}-some-text.jpg"/>
   <f:param name="description" value="#{beanTwo.someOtherMethodTwo}"/>
   <img border="0" src="//assets.pinterest.com/images/PinExt.png" title="Pin It" />
</h:outputLink>

这是陷阱:

  • 整个标记是由来自两个不同 bean 的四种不同方法以及一些静态文本的组合创建的
  • url 参数显然需要进行 urlencoded,因此我在 h:outputLink 中使用 f:param 以便它们得到 urlencoded
  • 生成的a标签需要有非标准count-layout="horizontal"属性

现在我的问题是以下之一:

  • 如何将 count-layout 属性注入 h:outputLink 或生成的锚标记
  • 否则,如果我不能,那么另一种非侵入性(我不想更改 bean 方法)方式来完成所需的 pinit 按钮标记是什么?

所需的标记可以在http://pinterest.com/about/goodies/的“网站固定按钮”部分找到。

4

1 回答 1

5

要么使用普通<a>元素以及委托URLEncoder#encode().

<c:set var="url" value="#{beanOne.someMethod}/sometext#{prettyContext.requestURL.toURL()}"/>
<c:set var="media" value="#{beanOne.someOtherMethod}/sometext/somemoretext/#{beanTwo.someMethodTwo}-some-text.jpg"/>
<c:set var="description" value="#{beanTwo.someOtherMethodTwo}"/>

<a href="http://pinterest.com/pin/create/button/?url=#{utils:encodeURL(url)}&amp;media=#{utils:encodeURL(media)}&amp;description=#{utils:encodeURL(description)}" class="pin-it-button" count-layout="horizontal">
   <img border="0" src="//assets.pinterest.com/images/PinExt.png" title="Pin It" />
</a>

(请注意,该class属性对 无效<h:outputLink>,您应该使用styleClass

或者创建一个自定义渲染器,<h:outputLink>为其添加对count-layout属性的支持。假设您使用的是 Mojarra,最简单的方法是扩展它OutputLinkRenderer

public class ExtendedLinkRenderer extends OutputLinkRenderer {

    @Override
    protected void writeCommonLinkAttributes(ResponseWriter writer, UIComponent component) throws IOException {
        super.writeCommonLinkAttributes(writer, component);
        writer.writeAttribute("count-layout", component.getAttributes().get("count-layout"), null);
    }

}

要让它运行,请在以下位置注册它faces-config.xml

<render-kit>
    <renderer>
        <component-family>javax.faces.Output</component-family>
        <renderer-type>javax.faces.Link</renderer-type>
        <renderer-class>com.example.ExtendedLinkRenderer</renderer-class>
    </renderer>
</render-kit>
于 2012-05-22T13:39:39.853 回答