当前位置 : 主页 > 编程语言 > java >

JSP标签文件输出其身体或返回变量

来源:互联网 收集:自由互联 发布时间:2021-06-25
我在“.tag”文件中有一个自定义标签,用于计算并输出一个值.因为我不能在这里发布代码,我们假设一个简单的例子. 文件内容mytag.tag: @tag dynamic-attributes="dynamicParameters"%@attribute name="k
我在“.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”更为优雅.我也知道使用name-from-attribute的@variable伪指令可以用来实现.但是,我不知道调用者是否给出了属性“var”. (如果给定,我想要为该变量分配${output},否则我想写出${output}.)

有没有办法如何找出是否已经传入“var”属性?

另一个选择是创建一个第二个自定义标签,也许称为“getMytag”,它总是期望“var”属性,并将“mytag”包装在c:set中.如果我在这里找不到解决方案,我会去找.

(如果这个问题已经被问过,请指出我,我做了一个快速搜索,但没有找到类似的问题.)

进入同一个问题,找到一种方法,而不需要在.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}"/>
网友评论