如何使用 jsp:include param 标记将对象传递到另一个 jsp
How to pass Object using jsp:include param tag into another jsp
我正在尝试使用 jsp:include 标记将 DTO 对象从一个 jsp 发送到另一个 jsp。但它始终将其视为 String。我无法在包含的 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)?请帮忙。
所以我已经通过使用标签文件解决了这个问题。我现在不再使用 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>
这里我给了类型属性来访问标签文件中的对象。它工作正常。
我不认为你真的想要这里的标签文件。对于你想要完成的事情来说,这太过分了,太令人困惑了。你需要花时间去了解"scope"。而不是标记文件,我会:
1) 通过更改此行将您的属性更改为在 "request" 范围内而不是默认的 "page" 范围内:
<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 不支持 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 中或作为参数(因为我们不再将其作为参数传递)。
这项技术会让您更容易掌握。
您不能使用 jsp:include 参数标记直接将对象传递给另一个 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}
我正在尝试使用 jsp:include 标记将 DTO 对象从一个 jsp 发送到另一个 jsp。但它始终将其视为 String。我无法在包含的 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)?请帮忙。
所以我已经通过使用标签文件解决了这个问题。我现在不再使用 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>
这里我给了类型属性来访问标签文件中的对象。它工作正常。
我不认为你真的想要这里的标签文件。对于你想要完成的事情来说,这太过分了,太令人困惑了。你需要花时间去了解"scope"。而不是标记文件,我会:
1) 通过更改此行将您的属性更改为在 "request" 范围内而不是默认的 "page" 范围内:
<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 不支持 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 中或作为参数(因为我们不再将其作为参数传递)。
这项技术会让您更容易掌握。
您不能使用 jsp:include 参数标记直接将对象传递给另一个 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}