扩展h:outputText以获得自定义功能

时间:2012-02-22 14:16:16

标签: jsf richfaces jstl jsf-1.2

我使用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中编写自定义标记

此致 萨蒂亚

1 个答案:

答案 0 :(得分:11)

假设您使用的是JSP而不是Facelets,请将内容放在.tag中的/WEB-INF文件中,例如/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?