簡體   English   中英

如何使用jsp傳遞Object:將param標簽包含到另一個jsp中

[英]How to pass Object using jsp:include param tag into another jsp

我試圖使用jsp:include標簽將DTO對象從一個jsp發送到另一個jsp。 但它始終將其視為字符串。 我無法在包含的jsp文件中使用DTO。

這是一個代碼..

<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 Type Value。 有沒有辦法在attributeSubFeatureRemove jsp文件中發送Object(DTO)? 請幫忙。

我認為你真的不想要標簽文件。 這對你想要完成的事情來說太過分了,而且太混亂了。 你需要花時間理解“范圍”。 我會:而不是標記文件:

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"/>

這將使“attribute”成為一個“requestScope”變量,該變量可以在c:import的其他JSP文件中使用。 (注意:forEach不支持范圍屬性,因此請使用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"/>

請注意,我們沒有明確嘗試將該屬性作為參數傳遞,因為我們已經將它提供給“requestScope”中的所有c:import頁面。

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標記,因為它總是發送字符串類型。

這是一個解決方案..

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

這里我給出了Type Attribute來訪問標簽文件中的Object。 它工作正常。

您不能使用jsp:include param標記直接將Object傳遞到另一個jsp中。

但是,您可以使用jsp:include param標記將該屬性的NAME(作為字符串)傳遞到另一個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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM