使用doBody将变量从自定义JSP标记传递回父JSP

使用doBody将变量从自定义JSP标记传递回父JSP,jsp,jstl,jsp-tags,Jsp,Jstl,Jsp Tags,我正在处理一个处理分层Bean的自定义标记。bean的外观如下所示: public class HierarchyBean { public List<HierarchyBean> children; public List<SomeOtherBean> someListOfBeans; // getters/setters for Bean } <%@ tag body-content="scriptless" %> <%@

我正在处理一个处理分层Bean的自定义标记。bean的外观如下所示:

public class HierarchyBean {
    public List<HierarchyBean> children;
    public List<SomeOtherBean> someListOfBeans;
    // getters/setters for Bean
}
<%@ tag body-content="scriptless" %>

<%@ attribute name="hierarchyBean" required="true" rtexprvalue="true" type="com.publix.webforms3.survey.domain.Element" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"  %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="cust" tagdir="/WEB-INF/tags/hierarchy" %>

<c:forEach items="${someListOfBeans}" var="bean">
    <c:set var="subBean" value="${bean}" scope="page" />
    <jsp:doBody />
</forEach>
<ul>
<c:forEach items="${children}" var="child">
<cust:hierarchy hierarchyBean="${root}">
    <li>${subBean}</li>
</cust:hierarchy>
</c:forEach>
</ul>
公共类层次结构bean{
公开儿童名单;
公开列出一些bean列表;
//Bean的getter/setter
}
现在,我想制作一个标记,这样我就可以在JSP中完成这项工作:

<ul>
<cust:hierarchy hierarchyBean="${root}">
    <li>${subBean}</li>
</cust:hierarchy>
</ul>
  • ${subBean}
自定义标记的外观如下所示:

public class HierarchyBean {
    public List<HierarchyBean> children;
    public List<SomeOtherBean> someListOfBeans;
    // getters/setters for Bean
}
<%@ tag body-content="scriptless" %>

<%@ attribute name="hierarchyBean" required="true" rtexprvalue="true" type="com.publix.webforms3.survey.domain.Element" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"  %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="cust" tagdir="/WEB-INF/tags/hierarchy" %>

<c:forEach items="${someListOfBeans}" var="bean">
    <c:set var="subBean" value="${bean}" scope="page" />
    <jsp:doBody />
</forEach>
<ul>
<c:forEach items="${children}" var="child">
<cust:hierarchy hierarchyBean="${root}">
    <li>${subBean}</li>
</cust:hierarchy>
</c:forEach>
</ul>

  • ${subBean}
因此,首先,让我来解释一下上面的代码中是否有草率的错误……我的实际项目非常复杂,我试图手动键入一个更简单的示例

第二,我想指出标记的递归性质是有效的。不起作用的是“subBean”的设置。我尝试了使用c:set和不使用c:set,但在我调用的JSP代码中,子bean似乎没有从标记中带回到标记内的主体

我确实知道jsp:doBody有一些属性,即var和varReader,但这两个属性似乎都不是我所需要的


这可能吗?如果可能,我在这里做错了什么使它无法工作?

您应该在标签中添加以下内容:

<%@ variable name-given="subBean" scope="NESTED" %>

这将导致容器在页面中保存subBean属性的值(如果有的话),然后调用标记并使标记定义的subBean变量可用于标记体,然后恢复subBean属性的保存值


更多细节。

你太棒了!谢谢你给我指出了正确的位置。