Файл тега JSP, который либо выводит свое тело, либо возвращает его в переменной - PullRequest
10 голосов
/ 18 мая 2011

У меня есть собственный тег в файле ".tag", который вычисляет и выводит значение. Поскольку я не могу опубликовать код здесь, давайте предположим простой пример.

Содержимое файла mytag.tag:

<@tag dynamic-attributes="dynamicParameters">
<%@attribute name="key" required="true"%> <%-- this works fine, in spite of dynamic-attributes --%>
<jsp:doBody var="bodyContent/">
<%-- ... here is some code to compute the value of variable "output" --%>
${output}

Вызывающий абонент может легко назвать это так:

<prefix:mytag key="foo">Body content...</prefix:mytag>

Это вставит вывод тега. Но я бы также позволил вызывающей стороне сделать что-то вроде этого:

<prefix:mytag key="foo" var="mytagOutput">Body content...</prefix:mytag>

В этом случае вывод фактически не будет записан, а будет присвоен переменной «mytagOutput», которую затем может использовать вызывающая сторона.

Я знаю, что вызывающая сторона может добиться этого, заключив пользовательский тег в c:set, но это менее элегантно, чем просто объявить «var». Я также знаю, что директива @variable с name-from-attribute может быть использована для достижения этой цели. Но тогда я не знаю, был ли атрибут "var" задан вызывающей стороной или нет. (Если дано, я хочу присвоить ${output} этой переменной, в противном случае я просто хочу выписать ${output}.)

Есть ли способ узнать, был ли передан атрибут "var" или нет?

Другим вариантом будет создание второго пользовательского тега, который может называться «getMytag», который всегда ожидает атрибут «var» и просто помещает «mytag» в c:set. Если я не найду решения здесь, я пойду на это.

(Если этот вопрос уже задавался, пожалуйста, укажите мне на него. Я сделал быстрый поиск, но не нашел похожего вопроса.)

Ответы [ 3 ]

12 голосов
/ 05 января 2012

Немного поздно, но лучше поздно, чем никогда.Может быть, кто-то еще сочтет это полезным

<%@ attribute name="var" required="true" type="java.lang.String" rtexprvalue="false"%>
<%@ attribute name="date" required="true" type="java.sql.Timestamp" description="The date to format"%>
<%@ variable alias="formattedDate" name-from-attribute="var" scope="AT_BEGIN" variable-class="java.lang.String"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<c:set var="formattedDate">
    <fmt:formatDate value="${ date }" pattern="hh:mma " var="time" />
    ${fn:toLowerCase(time)}<fmt:formatDate value="${ date }" pattern="MMMMM d, y" />
</c:set>

Установите свой атрибут var (он должен быть обязательным и не разрешать rtexprvalue), затем установите псевдоним переменной, который вы и называете в переменной, как в вашемtag.

Вызовите свой пользовательский тег, предоставив переменную var

<custom:dateFormat date="${ content.date }" var="formattedDate" />
<c:out value="${formattedDate}" />
10 голосов
/ 09 января 2014

Столкнулся с той же проблемой и нашел способ решить эту проблему без «жестко закодированного» имени переменной, которое должно совпадать между .jsp и .tag.

<%@ taglib prefix="c"   uri="http://java.sun.com/jsp/jstl/core"%><%@ 
taglib prefix="s"       uri="http://www.springframework.org/tags" %>

<jsp:directive.attribute name="someInput" type="java.lang.Object" required="true" rtexprvalue="true" description="Input object" />
<jsp:directive.attribute name="var" type="java.lang.String" required="false" rtexprvalue="false" description="Optional return var name" />

<s:eval expression="@someService.someMethod(someInput)" var="someOutput" />

<c:choose>
    <c:when test="${not empty var}">
        ${pageContext.request.setAttribute(var, someOutput)}
    </c:when>
    <c:otherwise>
        ${someOutput}
    </c:otherwise>
</c:choose>

Этот тег можно использовать двумя способами:

<%-- Option 1: renders the output of the tag directly to the page --%>
<some:tagname someInput="${yourVar}" />

<%-- Option 2: stores the output of the tag in variable called "result" and lets the caller render the output on his own --%>
<some:tagname someInput="${yourVar}" var="result" />
<c:out value="${result}"/>
0 голосов
/ 15 марта 2019

Основываясь на другом ответе, переменный псевдоним кажется хорошим решением.Вот простой пример:

<%@ attribute name="urlValue" required="true" type="java.lang.String" %>
<%@ attribute name="var" required="true" type="java.lang.String" rtexprvalue="false" %>
<%@ variable alias="varAlias" name-from-attribute="var" scope="AT_BEGIN" variable-class="java.lang.String"%>


<spring:url value="${urlValue}" var="varAlias"/>
...