2015-03-31 3 views
9

Я пытаюсь отправить объект DTO из одного jsp в другой jsp, используя тег jsp: include. Но он всегда рассматривает его как String. Я не могу использовать DTO в моем включенном файле jsp.Как передать объект с помощью jsp: включить тег param в другой 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> 

Здесь я пытаюсь получить значение атрибута из пар, он всегда посылает тип строка значения. Есть ли способ отправить объект (DTO) в файл jsp attributeSubFeatureRemove? Пожалуйста помоги.

+0

@fiffy request.setAttribute хочет переменную. Как я буду определять переменную? Он должен быть установлен как этот $ {субатрибут} –

+0

Нет Thats не работает :( –

+0

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

ответ

9

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

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 не поддерживает атрибут области, поэтому используйте c: установите для его охвата внутри каждой итерации.)

2) Измените исходный jsp: include на c: import. Меняем его от:

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

к этому

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

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

Этот способ будет намного проще для вас.

+2

Scope атрибут не определен для тега не Используйте тег вместо <с..: set var = "attribute" value = "$ {attribute}" scope = "request"> faizi

+1

Лучше вы обновите свой ответ, как предлагаете выше в комментарии. Gr8 job. !! –

+1

вы красивый человек, спасибо lol –

1

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

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

<%@ 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 файл

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

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

0

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

Однако вы можете передать NAME этого атрибута (как строку) с помощью jsp: включить тег param в другой 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} 
Смежные вопросы