tutorial etiquetas ejemplos directivas desde cero jsp jsp-tags

etiquetas - jsp y html



Archivo de etiqueta JSP que produce su cuerpo o lo devuelve en una variable (2)

Un poco tarde, pero mejor tarde que nunca. Tal vez alguien más encontrará esto útil

<%@ 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>

Establezca su atributo var (debe ser necesario y no permita un rtexprvalue), luego configure su alias variable, que es lo que refiere a la variable como en su etiqueta personalizada.

Llame a su etiqueta personalizada que suministra la variable var

<custom:dateFormat date="${ content.date }" var="formattedDate" /> <c:out value="${formattedDate}" />

Tengo una etiqueta personalizada en un archivo ".tag" que calcula y genera un valor. Como no puedo publicar el código aquí, supongamos un ejemplo simple.

Contenido del archivo 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}

La persona que llama puede llamarlo así:

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

Esto insertará la salida de la etiqueta. Pero también permitiría que la persona que llama haga algo como esto:

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

En este caso, la salida no se escribiría, sino que se asignaría a la variable "mytagOutput", que la persona que llama puede usar.

Sé que la persona que llama puede lograr esto envolviendo la etiqueta personalizada en un c:set , pero esto es menos elegante que simplemente declarar una "var". También sé que la directiva @variable con el name-from-attribute se puede usar para lograr esto. Pero entonces, no sé si el llamador "var" ha sido dado por el que llama o no. (De ser así, quiero asignar ${output} a esa variable; de ​​lo contrario, solo quiero escribir ${output} .)

¿Hay alguna manera de saber si el atributo "var" se ha transferido o no?

Otra opción sería crear una segunda etiqueta personalizada, tal vez llamada "getMytag", que siempre espera el atributo "var" y simplemente ajusta el "mytag" en un c:set . Si no encuentro una solución aquí, iré por eso.

(Si esta pregunta se ha hecho antes, indíquemela. Hice una búsqueda rápida, pero no encontré una pregunta similar).


Se encontró con este mismo problema y encontró una forma de hacerlo sin un nombre de variable "codificado" que tenga que coincidir entre .jsp y .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>

Esta etiqueta se puede usar de dos maneras:

<%-- 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}"/>