如何使用 jsp:include 参数标签将对象传递到另一个 jsp

Posted

技术标签:

【中文标题】如何使用 jsp:include 参数标签将对象传递到另一个 jsp【英文标题】:How to pass Object using jsp:include param tag into another jsp 【发布时间】:2015-06-04 17:29:19 【问题描述】:

我正在尝试使用 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>

attributeSubFeatureRemove.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>

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

【问题讨论】:

@fiffy request.setAttribute 需要变量。我将如何定义变量?它必须像这样设置 $subAttribute 不,那不行:( ***.com/a/13510064/2885897 【参考方案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"/>

这将使“attribute”成为“requestScope”变量,该变量可以在其他通过 c:imported 的 JSP 文件中使用。 (注意:forEach 不支持范围属性,因此请使用 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:imported 页面。

3) 修改您的 c:imported 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 中或作为参数(因为我们不再将其作为参数传递)。

这种技术对你来说会更容易管理。

【讨论】:

标签的范围属性未定义。请改用 标记。 最好按照上面评论中的建议更新您的答案。 Gr8 工作。!! 答案可能需要一些清晰。我首先不清楚 1) 2) 是步骤。遵循它确实解决了我的问题。我不知道 jsp:param 只传递字符串。【参考方案2】:

您不能使用 jsp:include 参数标记直接将 Object 传递给另一个 jsp。

但是,您可以使用 jsp:include 参数标记将该属性的名称(作为字符串)传递给另一个 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

【讨论】:

【参考方案3】:

所以我通过使用标签文件解决了这个问题。我现在不再使用 jsp:include 标记,因为它总是会发送字符串类型。

这是一个解决方案..

<%@ taglib prefix="cms2" tagdir="/WEB-INF/tags/spine/surgery"%>
<c:forEach items="$attributeDTOList" var="attribute" varStatus="status">  
     <cms2:attributeSubFeatureRemove attribute="$attribute" /> 
</c:forEach>

attributeSubFeatureRemove.tag 文件

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ attribute name="attribute" required="true" type="com.medtronic.b2b.core.dto.HCCB2BClassificationAttributeDTO" %>
<%@ taglib prefix="surgery" tagdir="/WEB-INF/tags/spine/surgery"%>               

    <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> 
        <surgery:attributeSubFeatureRemove attribute="$subAttribute" />
     </c:forEach>

这里我给出类型属性来访问标记文件中的对象。它工作正常。

【讨论】:

以上是关于如何使用 jsp:include 参数标签将对象传递到另一个 jsp的主要内容,如果未能解决你的问题,请参考以下文章

C++ 将对象传递给函数

如何使用核心数据将对象传递给 SwiftUI 中的其他视图

如何通过NodeJS将对象传递给前端

如何将对象传递给 .handlebars 模板并在 javascript 代码块中使用它?

如何将对象传递给 innerHTML (JavaScript) 中的函数?

如何将对象传递给另一个数组对象