如何使用 jsp:include 参数标记将 Object 传递到另一个 jsp 中

2022-09-02 10:09:28

我正在尝试使用jsp:include标签将DTO对象从一个jsp发送到另一个jsp。但它总是将其视为字符串。我无法在包含的 jsp 文件中使用 DTO。

这是一个代码..

<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">  
         <jsp:include page="attributeSubFeatureRemove.jsp" >
             <jsp:param name="attribute" value="${attribute}" />
         </jsp:include>
</c:forEach>

属性子功能删除.jsp文件 ..

<c:set value="${param.attribute}" var="attribute" />
<c:forEach items="${attribute.subFeatures}" var="subAttribute">
    <c:forEach items="${subAttribute.attributeValues}" var="subValue">
        <c:if test="${ subValue.preSelectionRequired}">
            <c:set var="replaceParams" value=":${subAttribute.name}:${subValue.name}" />
            <c:set var="removeURL" value="${fn:replace(removeURL, replaceParams, '')}" />
        </c:if>
    </c:forEach> 
    <jsp:include page="attributeSubFeatureRemove.jsp">
        <jsp:param name="subAttribute" value="${subAttribute}" />
    </jsp:include> 
</c:forEach>

在这里,我试图从param中获取属性值,它总是发送字符串类型值。有没有办法在属性SubFeatureRemove jsp文件中发送对象(DTO)?请帮忙。


答案 1

我不认为你真的想要这里的标签文件。这太过分了,对于你想要完成的事情来说太混乱了。您需要花时间了解“范围”。而不是标记文件,我会:

1) 通过更改以下行,将您的属性更改为“请求”范围,而不是默认的“页面”范围:

<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">

到这个

<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">
    <c:set var="attribute" value="${attribute}" scope="request"/>

这将使“属性”成为“requestScope”变量,可以在c:import的其他JSP文件中使用。(注意:forEach 不支持 scope 属性,因此请使用 c:set 在每次迭代中限定其作用域。

2) 将原来的 jsp:include 更改为 c:import。因此,请将其从以下位置更改:

<jsp:include page="attributeSubFeatureRemove.jsp" >
    <jsp:param name="attribute" value="${attribute}" />
</jsp:include>

到这个

<c:import url="attributeSubFeatureRemove.jsp"/>

请注意,我们没有显式尝试将属性作为参数传递,因为我们已经将其提供给“requestScope”中的所有c:import页面。

3) 修改 c:import 的 JSP 以使用 requestScope 引用属性,方法是更改以下内容:

<c:set value="${param.attribute}" var="attribute" />
<c:forEach items="${attribute.subFeatures}" var="subAttribute">

到这个

<c:forEach items="${requestScope.attribute.subFeatures}" var="subAttribute">

在这里,我们不再需要 c:set,因为您已经拥有可用的属性。我们只需要确保在 requestScope 中查找该变量,而不是在默认 pageScope 中或作为参数查找(因为我们不再将其作为参数传递)。

这种技术将更容易管理。


答案 2

您不能使用 jsp:include 参数标记直接将对象传递到另一个 jsp 中。

但是,您可以使用 jsp:include 参数将该属性的 NAME(作为字符串)传递到另一个 jsp 中,然后在包含的 jsp 中,您可以通过其名称从 requestScope 获取该属性本身。

在主 JSP 中:

<c:forEach items="${items}" var="item" varStatus="status">  
     <jsp:include page="attributeSubFeatureRemove.jsp" >
         <jsp:param name="objName" value="item" />
     </jsp:include>
</c:forEach>

在 attributeSubFeatureRemove 中.jsp:

object's name = ${param.objName}
object itself = ${requestScope[param.objName]}

Just for an easier access:
<c:set var="obj" value="${requestScope[param.objName]}" scope="page"></c:set>
obj=${obj}