2015-03-31 13 views
9

Próbuję wysłać obiekt DTO z jednego jsp do innego jsp przy użyciu znacznika jsp: include. Ale zawsze traktuje to jako String. Nie mogę używać DTO w dołączonym pliku jsp.Jak przekazać obiekt za pomocą narzędzia jsp: dołącz znacznik param do innego jsp

Oto kod ..

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

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

Tutaj staram się uzyskać wartość atrybutu z param, zawsze wysyłając typu String Value. Czy istnieje sposób wysyłania Object (DTO) w pliku attributeSubFeatureRemove jsp? Proszę pomóż.

+0

@fiffy request.setAttribute chce zmienną. Jak zdefiniuję zmienną? To musi być ustawiony jak to $ {} –

+0

Brak atrybutu podrzędnego ów nie działa :( –

+0

http://stackoverflow.com/a/13510064/2885897 – fiffy

Odpowiedz

9

Nie sądzę, że naprawdę chcesz pliki znaczników tutaj. To jest przesada i zbyt mylące dla tego, co chcesz osiągnąć. Trzeba poświęcić czas na zrozumienie "zakresu". Zamiast plików znaczników, chciałbym:

1) Zmiana atrybutu być na „żądanie” zakres zamiast „strona” domyślny zakres zmieniając tę ​​linię:

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

do tego

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

To sprawi, że "atrybut" będzie zmienną "requestScope", która może być użyta w innych plikach JSP c: importowanych. (Uwaga: forEach nie obsługuje atrybutu scope, więc użyj c: set, aby przeskalować go wewnątrz każdej iteracji.)

2) Zmień oryginalny jsp: include na c: import. Więc go zmienić od:

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

do tego

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

pamiętać, że wyraźnie nie starają się przekazać atrybut jako parametr, ponieważ mamy już ona dostępna dla wszystkich c: zaimportowanych stron w "requestScope".

3) Modyfikacja C: importowany JSP odwołać atrybut używając requestScope zmieniając w ten sposób:

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

do tego

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

Tu nie trzeba już c: set bo ciebie już mają dostępny atrybut. Musimy tylko upewnić się, że szukamy w requestScope dla tej zmiennej, zamiast w domyślnym pageScope lub jako parametrze (ponieważ już nie przekazujemy go jako parametru).

Ta technika będzie o wiele łatwiejsza w zarządzaniu.

+2

Zakres atrybut jest niezdefiniowany dla tagu Użyj tag zamiast faizi

+1

Lepiej zaktualizuj swoją odpowiedź zgodnie z sugestią powyżej w komentarzu. Gr8 zadanie. !! –

+1

piękna osoba, dziękuję lol –

1

Rozwiązałem ten problem, używając pliku znaczników. Nie używam już teraz znacznika jsp: include, ponieważ zawsze będzie wysyłał typ ciągu.

Oto rozwiązanie ..

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

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

Tutaj daję typ atrybutu do dostępu do obiektów w pliku znaczników. I działa dobrze.

0

Nie można bezpośrednio przekazać obiektu za pomocą jsp: dołącz tagu param do innego jsp.

Możesz jednak podać NAZWĘ tego atrybutu (jako ciąg znaków), używając jsp: include param tag do innego jsp, a następnie do dołączonego jsp, możesz uzyskać ten atrybut sam przez nazwę z requestScope.

w głównym JSP:

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

w 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} 
Powiązane problemy