Как передать объект с помощью 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-файл. .

<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) в файле attributeSubFeatureRemove jsp ? Пожалуйста помощь.

3 ответов


Я не думаю, что вы действительно хотите файлы здесь тег. Это слишком много и слишком запутанно для того, чего вы хотите достичь. Вам нужно потратить время на понимание "сферы". Вместо файлов тегов я бы:

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 не поддерживает атрибут 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"/>

обратите внимание, что мы явно не пытаемся передать атрибут в качестве параметра, потому что мы уже сделали его доступным для всех 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 для этой переменной, а не в pageScope по умолчанию или в качестве параметра (потому что мы больше не передаем его в качестве параметра).

этот метод будет намного проще для вас, чтобы управлять.


поэтому я решил проблему, используя файл тегов. Я больше не использую JSP:include tag, потому что он всегда будет отправлять строковый тип.

вот решение ..

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

attributeSubFeatureRemove.файл тегов

<%@ 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>

здесь я даю атрибут типа для доступа к объекту в файле тегов. И это прекрасно работает.


вы не можете напрямую передать объект с помощью JSP: включить тег param в другой jsp.

однако вы можете передать имя этого атрибута (как строку) с помощью JSP:include param tag в другой 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}