web-dev-qa-db-fra.com

Comment passer un objet en utilisant jsp: include param tag dans un autre jsp

J'essaie d'envoyer un objet DTO d'un jsp à un autre en utilisant jsp: include tag. Mais il le traite toujours comme String. Je ne peux pas utiliser DTO dans mon fichier jsp inclus.

Voici un code ..

<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">  
         <jsp:include page="attributeSubFeatureRemove.jsp" >
             <jsp:param name="attribute" value="${attribute}" />
         </jsp:include>
</c:forEach>

fichier 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>

Ici, j'essaie d'obtenir la valeur d'attribut de param, elle envoie toujours String Type Value. Est-il possible d'envoyer un objet (DTO) dans le fichier attributSubFeatureRemove jsp? S'il vous plaît aider.

16
Free-Minded

Je ne pense pas que vous vouliez vraiment des fichiers de tags ici. C'est exagéré et trop déroutant pour ce que vous voulez accomplir. Vous devez passer du temps à comprendre "portée". Au lieu de fichiers de balises, je voudrais:

1) Modifiez votre attribut pour qu'il soit dans la portée "request" au lieu de la portée par défaut "page" en modifiant cette ligne:

<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">

pour ça

<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">
    <c:set var="attribute" value="${attribute}" scope="request"/>

Cela fera de "attribut" une variable "requestScope" utilisable dans d'autres fichiers JSP importés c: (Remarque: forEach ne supporte pas l'attribut scope, utilisez donc c: set pour l'étendre à l'intérieur de chaque itération.)

2) Changez votre jsp original: include en c: import. Alors changez de:

<jsp:include page="attributeSubFeatureRemove.jsp" >
    <jsp:param name="attribute" value="${attribute}" />
</jsp:include>

pour ça

<c:import url="attributeSubFeatureRemove.jsp"/>

Notez que nous n'essayons pas explicitement de passer l'attribut en tant que paramètre, car nous l'avons déjà mis à la disposition de toutes les pages c: importées dans "requestScope".

3) Modifiez votre JSP importé pour faire référence à l'attribut à l'aide de requestScope en modifiant ceci:

<c:set value="${param.attribute}" var="attribute" />
<c:forEach items="${attribute.subFeatures}" var="subAttribute">

pour ça

<c:forEach items="${requestScope.attribute.subFeatures}" var="subAttribute">

Ici, nous n'avons plus besoin du c: set car vous avez déjà l'attribut disponible. Nous devons simplement nous assurer que nous recherchons cette variable dans requestScope, plutôt que dans la pageScope par défaut ou en tant que paramètre (car nous ne la transmettons plus en tant que paramètre).

Cette technique sera beaucoup plus facile à gérer.

17
alfreema

J'ai donc résolu le problème en utilisant un fichier de balises. Je n'utilise plus jsp: include maintenant, car il enverra toujours le type de chaîne.

Voici une solution ..

<%@ taglib prefix="cms2" tagdir="/WEB-INF/tags/spine/surgery"%>
<c:forEach items="${attributeDTOList}" var="attribute" varStatus="status">  
     <cms2:attributeSubFeatureRemove attribute="${attribute}" /> 
</c:forEach>

fichier 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>

Ici, je donne un attribut de type pour accéder à l’objet dans le fichier de balises. Et ça marche bien. 

1
Free-Minded

Vous ne pouvez pas passer directement un objet à l'aide de la balise jsp: include param dans un autre fichier jsp.

Cependant, vous pouvez passer le nom de cet attribut (sous forme de chaîne) à l'aide de la balise jsp: include param dans un autre jsp. Ensuite, dans le jsp inclus, vous pouvez obtenir cet attribut lui-même sous le nom de requestScope.

dans votre JSP principal:

<c:forEach items="${items}" var="item" varStatus="status">  
     <jsp:include page="attributeSubFeatureRemove.jsp" >
         <jsp:param name="objName" value="item" />
     </jsp:include>
</c:forEach>

dans 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