【问题标题】:Extend h:outputText for custom functionality为自定义功能扩展 h:outputText
【发布时间】:2012-03-12 21:11:30
【问题描述】:

我已经使用 JSF + RF 2 年多了,还没有机会扩展组件的现有功能。

现在的要求是如果字符串超过 25 个字符,我必须修剪并显示它。

实现如下

                        <c:choose>
                            <c:when test="#{fn:length(teststep.name) > 25}">
                                <h:outputText title="#{teststep.name}" value="#{fn:substring(teststep.name, 0, 25)}..."/>
                            </c:when>
                            <c:otherwise>
                                <h:outputText title="#{teststep.name}" value="#{teststep.name}"/>
                            </c:otherwise>
                        </c:choose>

但是我在很多地方都使用了这段代码(并且希望避免每次都使用 8 行的样板代码),所以我想到了自定义 h:outputText 来提供修剪功能。

能否告诉我如何在 JSF 中编写自定义标签

问候, 萨提亚

【问题讨论】:

    标签: jsf richfaces jstl jsf-1.2


    【解决方案1】:

    假设您使用的是 JSP 而不是 Facelets,请将内容放在 /WEB-INF 中的 .tag 文件中,例如 /WEB-INF/tags/outputLimitedText.tag

    <%@ tag body-content="empty" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
    <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
    <c:choose>
        <c:when test="#{fn:length(value) > maxlength}">
            <h:outputText title="#{value}" value="#{fn:substring(value, 0, maxlength)}..."/>
        </c:when>
        <c:otherwise>
            <h:outputText title="#{value}" value="#{value}"/>
        </c:otherwise>
    </c:choose>
    

    那么你可以参考如下:

    <%@ taglib prefix="my" tagdir="/WEB-INF/tags" %> 
    ...
    <my:outputLimitedText value="#{teststep.name}" maxlength="25" />
    

    您也可以使用Converter

    <h:outputText title="#{teststep.name}" value="#{teststep.name}">
        <f:converter converterId="substringConverter" />
        <f:attribute name="maxlength" value="25" />
    </h:outputText>
    

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        String string = (String) value;
        int maxlength = Integer.valueOf((String) component.getAttributes().get("maxlength"));
    
        if (string.length() > maxlength) {
            return string.substring(0, maxlength) + "...";
        } else {
            return string;
        }
    }
    

    您还可以创建自定义 EL 函数。这样你就结束了

    <h:outputText title="#{teststep.name}" value="#{util:ellipsis(teststep.name, 25)}">
    

    此答案中给出了 EL 函数的具体示例:How to concatenate Strings in EL?

    【讨论】:

    • 我已经尝试了第一个解决方案,但并没有给我留下深刻印象:) 但想做类似 。是否有可能仍然保留 h:outputText 的功能并仅添加更多功能?
    • 我会尝试第三个选项,对我来说似乎是一些新的学习:)。非常感谢 BalusC
    • 向现有组件添加新属性只能通过自定义组件而不是自定义标签来实现。这是一项非常乏味的工作。您必须复制 all 现有标记属性,因为无法从现有标记继承。更简单的方法是将额外属性提供为&lt;f:attribute&gt; 并覆盖默认的Renderer
    猜你喜欢
    • 2017-10-21
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2018-07-16
    • 2016-07-03
    相关资源
    最近更新 更多