1

JSP でのサーバー呼び出しに応じて、実行時にメニューを構築しようとしています。メニューを表すモデルを以下に示します。

import java.util.ArrayList;
import java.util.List;

public class MenuItem {
    public String menuText;
    public List<MenuItem> subMenuItems=new ArrayList<MenuItem>();

    public MenuItem(String menuText) {
        super();
        this.menuText = menuText;
        this.subMenuItems = new ArrayList<MenuItem>();
    }

    public MenuItem(){

    }

    public MenuItem(String menuText, List<MenuItem> subMenuItems) {
        super();
        this.menuText = menuText;
        this.subMenuItems = subMenuItems;
    }

    // @Override
    // public String toString() {
    // // TODO Auto-generated method stub
    // StringBuffer buffer = new StringBuffer();
    // for (MenuItem menuItem : getSubMenuItems()) {
    // buffer.append(menuItem.toString());
    // }
    // return ("  Menu --->" + getMenuText() + buffer.toString());
    //
    // }

    public String getMenuText() {
        return menuText;
    }

    public void setMenuText(String menuText) {
        this.menuText = menuText;
    }

    public List<MenuItem> getSubMenuItems() {
        return subMenuItems;
    }

    public void setSubMenuItems(List<MenuItem> subMenuItems) {
        this.subMenuItems = subMenuItems;
    }

}

上記のモデルでは、コントローラーからサンプル メニューを渡します。

   List<MenuItem> menuMainList = new ArrayList<MenuItem>();
            List<MenuItem> submenus = new ArrayList<MenuItem>();
            MenuItem item1= new MenuItem();
            item1.setMenuText("****");
            submenus.add(item1);
            MenuItem item2 = new MenuItem();
            item2.setMenuText("SampleMenu");

            item2.setSubMenuItems(submenus);

            menuMainList.add(item2);
            System.out.println(menuMainList);
            model.addAttribute("menuItem", menuMainList);

JSP ページでは、次のことを試みます。

<c:forEach items="${menuItem}"  begin="0" var="menuListItem">
            <c:choose>
                <c:when test="${empty menuListItem.subMenuItems}">
                    <div>
                        <c:out value="${menuListItem.menuText}" />
                    </div>
                </c:when>
                <c:otherwise>
                    <div>
                        <span><c:out value="${menuListItem.menuText}" /></span>
                        <div style="width: 150px;">
                            <cobTags:menuDivItem menuList="${menuListItem.subMenuItems}"></cobTags:menuDivItem>
                        </div>
                    </div>
                </c:otherwise>
            </c:choose>
        </c:forEach>

カスタムタグは次のとおりです。

 <%@ tag language="java" pageEncoding="ISO-8859-1"%>
<%@ attribute name="menuList" required="true"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="cobTags"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<c:forEach items="${menuList}" begin="0" var="menuListItem">
    <div>
        <cobTags:drawMenuItem  menuItem="${menuListItem}"></cobTags:drawMenuItem>
        <c:out value="${menuListItem}" />
    </div>
</c:forEach>

    <%@ tag language="java" pageEncoding="ISO-8859-1"%>
<%@ attribute name="menuItem" type="com.sample.bean.MenuItem"
    required="true"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<div style="color: red;">
    <c:out value="${menuItem.menuText}" />
</div>

次のコードを実行すると、エラーが発生します。

タイプ クラス java.lang.String の [com.sample.bean.MenuItem@547ca73] をクラス com.sample.bean.MenuItem に変換できません

オブジェクトをカスタム タグに渡すと、モデルの toString メソッドが呼び出される理由がわかりません。ポインタはありますか?

4

1 に答える 1

4

引数の型を宣言すると、問題が解決するはずです。

<%@ attribute name="menuList" required="true" type="java.util.Collection" %>
于 2013-11-14T08:02:15.123 に答える