Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSP tag file that either outputs its body or returns it in a variable

Tags:

jsp

jsp-tags

I have a custom tag in a ".tag" file that computes and outputs a value. Because I cannot post the code here, let's assume a simple example.

Content of file 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}

The caller can easily call it like this:

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

This will insert the output of the tag. But I would also enable the caller to do something like this:

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

In this case, the output would not actually be written, but assigned to the variable "mytagOutput", which the caller then can use.

I know that the caller can achieve this by wrapping the custom tag in a c:set, but this is less elegant than simply declaring a "var". I also know that the @variable directive with the name-from-attribute can be used to achieve this. But then, I do not know if the attribute "var" has been given by the caller or not. (If given, I want to assign ${output} to that variable, otherwise I want to just write out ${output}.)

Is there a way how I can find out if the "var" attribute has been passed in or not?

Another option would be to create a second custom tag, maybe called "getMytag", which always expects the "var" attribute and just wraps the "mytag" in a c:set. If I don't find a solution here, I will go for that.

(If this question has been asked before, please point me to it. I did a quick search, but did not find a similar question.)

like image 996
Madoc Avatar asked May 18 '11 09:05

Madoc


1 Answers

A little late, but better late than never. Maybe someone else will find this helpful

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

Set your var attribute (it must be required and not allow an rtexprvalue), then set your variable alias, which is what you refer to the variable as in your custom tag.

Call your custom tag supplying the var variable

<custom:dateFormat date="${ content.date }" var="formattedDate" />
<c:out value="${formattedDate}" />
like image 131
PaulC Avatar answered Oct 08 '22 07:10

PaulC