Как передать объект с помощью jsp: включить тег param в другой jsp
Я пытаюсь отправить объект DTO из одного jsp в другой jsp с помощью тега jsp: include. Но он всегда рассматривает это как строку. Я не могу использовать DTO во включенном JSP файле.
Вот код..
<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 file..
<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. Есть ли способ отправить объект (DTO) в JS файл attributeSubFeatureRemove? Пожалуйста помоги.
Ответы
Ответ 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", которая может быть использована в других JSP файлах, импортированных c:. (Примечание: forEach не поддерживает атрибут области, поэтому используйте c: установите для области видимости внутри каждой итерации.)
2) Измените исходный jsp: include на c: import. Поэтому измените его:
<jsp:include page="attributeSubFeatureRemove.jsp" >
<jsp:param name="attribute" value="${attribute}" />
</jsp:include>
к этому
<c:import url="attributeSubFeatureRemove.jsp"/>
Обратите внимание, что мы явно не пытаемся передать атрибут в качестве параметра, потому что мы уже сделали его доступным для всех c: импортированных страниц в "requestScope".
3) Измените свой c: импортированный 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 для этой переменной, а не в default pageScope или как параметр (потому что мы больше не передаем его как параметр).
Эта техника будет намного проще для вас.
Ответ 2
Итак, я решил проблему, используя файл тега. Я больше не использую jsp: include tag, потому что он всегда будет отправлять String Type.
Вот решение..
<%@ 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>
Здесь я даю Type Attribute для доступа к объекту в файле тега. И он отлично работает.
Ответ 3
Вы не можете напрямую передать объект, используя jsp: включить тег param в другой jsp.
Однако вы можете передать этот атрибут NAME (как строку), используя jsp: включить тег 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>
в атрибутеSubFeatureRemove.jsp:
object 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}