You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Elie Ciment <ec...@gmail.com> on 2006/11/09 20:35:20 UTC

Tiles Menu Items

Hi,

I have an issue with Struts Tiles putList items. I can get all the items in
my jsp page fine, with the links and values for each menu item.

The problem is, when I try to nest a putList tag within another one, to
attempt to create subMenu functionality. I have no way of retrieving the
submenu items on my jsp page.

For example, I have a tile definition called ".mainMenu", which defines a
putList tag with 3 items. The first two are plain <item link="
http://www.google.com" value="Google Home Page"/> type of items - the third
is not an item, but rather another putList:

<definition name=".mainMenu" path="/WEB-INF/template/header.jsp">
        <putList name="menuItems">
            <item link="http://www.google.com" value="Google Home Page"/>
            <item link="http://www.gmail.com" value="Google Email Page"/>
            <putList name="subMenu">
                       <item link="http://somesublink.menu/"
value="SubLinkTest"/>
                       <item link="http://somesublink2.menu/"
value="SubLinkTest2"/>
            </putList>
    </definition>


The point of doing this is obvious - I want to get the subMenu functionality
from the tiles menu items putList tag. However, when displaying it on the
jsp page, I don't know how to iterate over the submenu:

For the main menu:

<tiles:importAttribute name="menuItems" ignore="true"/>

                    <!-- Menu begin -->
                    <ul >
                        <c:forEach var="item" items="${menuItems}">
                            <li><a href="<c:out value="${item.link}"/>"><c:out
value="${item.value}"/></a></li>
                        </c:forEach>
                    </ul>

That works fine for those menuitems in the "top-level" menuItems putList.
When it comes to the other subMenu, I will get errors. Obviously so. The
problem is that when I try to iterate over them with either c:forEach or
using Struts logic:iterate tags I can't do it and get errors as well. What
is interesting is that when I just output the "item" itself, I can see the
entire collection of submenu items -
for example:

<c:out value="${item}"/>

(without any ".value" or ".link") - so I know it is there and is accesible.
The question is, how do I access this putList in the jsp page?

Thanks for your help!!!

-EC

Re: Tiles Menu Items

Posted by Elie Ciment <ec...@gmail.com>.
Here's a solution I thought of for the time being; if anyone else has any
better way of accomplishing this, or comments, please share them with me.

The following takes a putList containing items, as well as nested putLists
(maximum one level of nesting for this example, but it can be extended to
handle more):

[The first item in the nested putList will be displayed in the top level
menu, all subsequent items will be in the submenu]
<ul>
    <c:catch>
    <c:forEach var="item" items="${menuItems}">
        <!-- Top level menu item -->
        <c:catch var="e1">
        <c:if test=" ${empty item.value}">
            <!-- DUMMY TEST TO BREAK TO SUBMENU -->
        </c:if>
        <li>
            <a href="<c:out value="${item.link}"/>">
                <c:out value="${item.value}"/>
            </a>
        </li>
        </c:catch>
        <c:if test="${not empty e1}">

            <%
                //Get the subMenu to populate the menu with
                ArrayList<SimpleMenuItem> subMenu =
(ArrayList<SimpleMenuItem>) pageContext.getAttribute("item");
                pageContext.setAttribute("subMenu", subMenu);

                //Set an initial variable which will be a
                //placeholder telling us if the first item
                //hsa been added to the submenu - this item
                //will appear on the main menu
                pageContext.setAttribute("initial", true);

            %>
            <c:forEach var="subItem" items="${subMenu}">
            <c:if test="${not initial}">
                <c:if test=" ${empty subItem.value}"/>
                        <!-- Submenu item -->
                        <li>
                            <a href="<c:out value="${subItem.link}"/>">
                                <c:out value="${subItem.value}"/>
                            </a>
                        </li>
            </c:if>
            <c:if test="${initial}">
                <li>
                    <a href="<c:out value="${subItem.link}"/>">
                        <c:out value="${subItem.value}"/>
                    </a>
                    <ul>
                <%
                    //Reset initial to false
                    pageContext.setAttribute("initial", false);
                %>
            </c:if>
            </c:forEach>
                    </li>
                </ul>
        </c:if>
    </c:forEach>
    </c:catch>
</ul>


And, the tiles definition is as it was previously, except "somesublink" ends
up being the main menu (top level) link, not a sub-menu link.

Again, if anybody wishes to share their thoughts, please do... I am sure
there is a better solution to this nested menu tiles issue.

Thanks

On 11/9/06, Elie Ciment <ec...@gmail.com> wrote:
>
> Hi,
>
> I have an issue with Struts Tiles putList items. I can get all the items
> in my jsp page fine, with the links and values for each menu item.
>
> The problem is, when I try to nest a putList tag within another one, to
> attempt to create subMenu functionality. I have no way of retrieving the
> submenu items on my jsp page.
>
> For example, I have a tile definition called ".mainMenu", which defines a
> putList tag with 3 items. The first two are plain <item link="
> http://www.google.com" value="Google Home Page"/> type of items - the
> third is not an item, but rather another putList:
>
> <definition name=".mainMenu" path="/WEB-INF/template/header.jsp">
>         <putList name="menuItems">
>             <item link=" http://www.google.com" value="Google Home Page"/>
>             <item link="http://www.gmail.com" value="Google Email Page"/>
>             <putList name="subMenu">
>                        <item link="http://somesublink.menu/"
> value="SubLinkTest"/>
>                        <item link="http://somesublink2.menu/"
> value="SubLinkTest2"/>
>             </putList>
>     </definition>
>
>
> The point of doing this is obvious - I want to get the subMenu
> functionality from the tiles menu items putList tag. However, when
> displaying it on the jsp page, I don't know how to iterate over the submenu:
>
>
> For the main menu:
>
> <tiles:importAttribute name="menuItems" ignore="true"/>
>
>                     <!-- Menu begin -->
>                     <ul >
>                         <c:forEach var="item" items="${menuItems}">
>                             <li><a href="<c:out value="${item.link}"/>"><c:out
> value="${item.value}"/></a></li>
>                         </c:forEach>
>                     </ul>
>
> That works fine for those menuitems in the "top-level" menuItems putList.
> When it comes to the other subMenu, I will get errors. Obviously so. The
> problem is that when I try to iterate over them with either c:forEach or
> using Struts logic:iterate tags I can't do it and get errors as well. What
> is interesting is that when I just output the "item" itself, I can see the
> entire collection of submenu items -
> for example:
>
> <c:out value="${item}"/>
>
> (without any ".value" or ".link") - so I know it is there and is
> accesible. The question is, how do I access this putList in the jsp page?
>
> Thanks for your help!!!
>
> -EC
>