一尘不染

JSP标记文件,它可以输出其主体或以变量形式返回

jsp

我在“ .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。如果我在这里找不到解决方案,我会继续努力。

(如果以前曾问过这个问题,请给我指出。我进行了快速搜索,但没有找到类似的问题。)


阅读 264

收藏
2020-06-08

共1个答案

一尘不染

遇到同样的问题,并找到了一种解决方法,它不需要在“ .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}"/>
2020-06-08