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 メソッドが呼び出される理由がわかりません。ポインタはありますか?