如何使用jsp:include param标签将对象传递到另一个JSP页面

20

我试图使用jsp:include标签从一个jsp页面传递DTO对象到另一个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>

我试图从param中获取属性值,但它总是发送String类型的值。是否有办法在attributeSubFeatureRemove jsp文件中发送对象(DTO)?请帮忙。


@fiffy request.setAttribute需要一个变量。我该如何定义变量?它必须像这样设置${subAttribute}。 - Free-Minded
不行啊,这个不起作用 :( - Free-Minded
1
https://dev59.com/P2Yr5IYBdhLWcg3wqr7o#13510064 - fiffy
3个回答

22

我认为您并不需要标签文件。这对于您想要完成的任务来说过于复杂和令人困惑。 您需要花时间理解"范围"。 我建议您:

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: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: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或作为参数(因为我们不再将其作为参数传递)。

这种技术将更容易管理。


2
<c:forEach>标签的作用域属性未定义。请改用<c:set>标签。 <c:set var="attribute" value="${attribute}" scope="request"></c:set> - faizi
1
最好按照上面的评论建议更新你的答案。干得好!!! - Ankit Katiyar
答案可能需要一些澄清。起初我并不清楚1) 2)是步骤。但在跟随后,确实解决了我的问题。我不知道jsp:param只能传递字符串。 - RabbitBones22

2

在jsp:include param标签中,你无法直接传递一个对象到另一个jsp页面。

但是,你可以通过jsp:include param标签将属性的名称(作为字符串)传递到另一个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}

1

所以我通过使用标签文件解决了这个问题。现在我不再使用 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>

我在这里为标签文件中的对象提供了类型属性,它可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接