wake-up-neo.net

So übergeben Sie Object mithilfe von jsp: Include param in ein anderes jsp

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.

16
Free-Minded

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.

17
alfreema

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. 

1
Free-Minded

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}
0
qiangbro