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

I don't think you really want tag files here. That's way overkill and too confusing for what you want to accomplish. You need to spend time understanding "scope". Instead of tag files, I would:

1) Change your attribute to be in the "request" scope instead of the default "page" scope by changing this line:

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

to this

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

That will make "attribute" a "requestScope" variable that can be used in other JSP files that are c:imported. (Note: forEach doesn't support scope attribute so use c:set to scope it inside each iteration.)

2) Change your original jsp:include to c:import. So change it from:

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

to this

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

Note that we don't explicitly try to pass the attribute as a parameter, because we have already made it available to all c:imported pages in the "requestScope".

3) Modify your c:imported JSP to reference the attribute using the requestScope by changing this:

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

to this

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

Here we no longer need the c:set because you already have the attribute available. We just need to make sure we look in the requestScope for that variable, instead of in the default pageScope or as a parameter (because we are no longer passing it as a parameter).

This technique will be a lot easier for you to manage.


You can not directly pass an Object using jsp:include param tag into another jsp.

However, you can pass that attribute's NAME (as a string) using jsp:include param tag into another jsp, Then in the included jsp, you can get that attribute itself by its name from requestScope.

in your main JSP:

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

in 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}