Расширение h:outputText для пользовательских функций
Я использую 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 ответ:
Предполагая, что вы используете 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 приведен в этом ответе: Как объединить строки в EL?
Comments