Ich versuche, das DTO-Objekt mit einem jsp: include-Tag von einem jsp zu einem anderen jsp zu senden. Es wird jedoch immer als String behandelt. Ich kann DTO in meiner enthaltenen JSP-Datei nicht verwenden.
Hier ist ein Code ..
<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">
<jsp:include page="attributeSubFeatureRemove.jsp" >
<jsp:param name="attribute" value="${attribute}" />
</jsp:include>
</c:forEach>
datei attributSubFeatureRemove.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>
Hier versuche ich, den Attributwert von param zu erhalten, es wird immer ein String-Typ-Wert gesendet. Gibt es eine Möglichkeit, ein Objekt (DTO) in der JSP-Datei attributeSubFeatureRemove zu senden? Bitte helfen.
Ich glaube nicht, dass Sie wirklich Tag-Dateien hier haben wollen. Das ist übertrieben und zu verwirrend für das, was Sie erreichen wollen. Sie müssen Zeit damit verbringen, "Umfang" zu verstehen. Anstelle von Tag-Dateien würde ich Folgendes tun:
1) Ändern Sie Ihr Attribut in den Bereich "Anfrage" anstelle des Standardbereichs "Seite", indem Sie diese Zeile ändern:
<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">
zu diesem
<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">
<c:set var="attribute" value="${attribute}" scope="request"/>
Dadurch wird "attribut" zu einer "requestScope" -Variablen, die in anderen JSP-Dateien verwendet werden kann, die c: importiert werden. (Hinweis: forEach unterstützt das Bereichsattribut nicht. Verwenden Sie daher c: set, um den Bereich innerhalb jeder Iteration festzulegen.)
2) Ändern Sie das ursprüngliche jsp: include in c: import. Also ändere es von:
<jsp:include page="attributeSubFeatureRemove.jsp" >
<jsp:param name="attribute" value="${attribute}" />
</jsp:include>
zu diesem
<c:import url="attributeSubFeatureRemove.jsp"/>
Beachten Sie, dass wir nicht explizit versuchen, das Attribut als Parameter zu übergeben, da wir es bereits allen c: importierten Seiten im "requestScope" zur Verfügung gestellt haben.
3) Ändern Sie Ihre c: importierte JSP so, dass sie mit dem requestScope auf das Attribut verweist, indem Sie Folgendes ändern:
<c:set value="${param.attribute}" var="attribute" />
<c:forEach items="${attribute.subFeatures}" var="subAttribute">
zu diesem
<c:forEach items="${requestScope.attribute.subFeatures}" var="subAttribute">
Hier brauchen wir das c: set nicht mehr, weil Sie das Attribut bereits zur Verfügung haben. Wir müssen nur sicherstellen, dass wir im requestScope nach dieser Variablen suchen, anstatt im Standard-PageScope oder als Parameter (da wir sie nicht mehr als Parameter übergeben).
Diese Technik wird für Sie viel einfacher zu handhaben sein.
Also habe ich das Problem mit der Tag-Datei gelöst. Ich verwende jetzt kein jsp: include-Tag mehr, da es immer String-Typ senden wird.
Hier ist eine Lösung ..
<%@ taglib prefix="cms2" tagdir="/WEB-INF/tags/spine/surgery"%>
<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">
<cms2:attributeSubFeatureRemove attribute="${attribute}" />
</c:forEach>
datei 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>
Hier gebe ich das Typattribut für den Zugriff auf das Objekt in der Tag-Datei. Und es funktioniert gut.
Sie können ein Objekt nicht direkt mit jsp: include param in ein anderes jsp übergeben.
Sie können jedoch den NAME (als String) dieses Attributs mithilfe von jsp: include param in ein anderes jsp übergeben. In dem enthaltenen jsp können Sie dieses Attribut anhand des Namens von requestScope erhalten.
in Ihrer Haupt-JSP:
<c:forEach items="${items}" var="item" varStatus="status">
<jsp:include page="attributeSubFeatureRemove.jsp" >
<jsp:param name="objName" value="item" />
</jsp:include>
</c:forEach>
in 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}