web-dev-qa-db-ja.com

jsp:include paramタグを使用してオブジェクトを別のjspに渡す方法

Jsp:includeタグを使用して、DTOオブジェクトを1つの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から属性値を取得しようとしていますが、常に文字列型の値を送信しています。 attributeSubFeatureRemove jspファイルでオブジェクト(DTO)を送信する方法はありますか?助けてください。

19
Free-Minded

ここにタグファイルが本当に必要だとは思わない。それはやり過ぎであり、達成したいことを混乱させすぎます。 「スコープ」の理解に時間を費やす必要があります。タグファイルの代わりに、私は:

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」変数になり、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:importedページで属性を利用できるようにしているため、属性をパラメーターとして明示的に渡そうとしないことに注意してください。

3)これを変更して、requestScopeを使用して属性を参照するようにc:imported JSPを変更します。

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

これに

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

ここでは、すでに使用可能な属性があるため、c:setは必要ありません。デフォルトのpageScopeやパラメーターとしてではなく、その変数のrequestScopeを確認する必要があります(パラメーターとして渡さなくなったため)。

この手法は、管理がはるかに簡単になります。

17
alfreema

Jsp:include paramタグを使用してオブジェクトを別の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}
1
qiangbro

そこで、タグファイルを使用して問題を解決しました。常に文字列型を送信するため、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>

ここでは、タグファイルのオブジェクトにアクセスするためのタイプ属性を指定しています。そしてそれはうまくいきます。

1
Free-Minded