# Geschachtelte JSTL-Tags



## TSH (17. Aug 2007)

Mit Tiles schieb ich einen Wert für die Variable beanType in die JSP-Datei


```
<definition name="navigationBox" page="/WEB-INF/jsp/template.jsp" controllerClass="...">
  <put name="title" value="Navigation" type="string" />
  <put name="beanType" value="navigationBeans" type="string" />
</definition>
```

Ich habe hier folgende JSP/JSTL-Anweisung:


```
<tiles:importAttribute name="???" scope="page" />
```

Jetzt frag ich mich, wie ich auf den Inhalt der Variable beanType zugreifen kann, um ihn anstatt ??? einzusetzen? Ich hatte versucht, die JSTL-Anweisungen zu schachteln:


```
<tiles:importAttribute name="<tiles:insert name="beanType"/>" scope="page" />
```

Hat aber eine Fehlermeldung erzeugt.


----------



## TSH (17. Aug 2007)

Hab gedacht, ich hätte es gelöst:

tiles.xml

```
<definition name="navigationBox" page="/WEB-INF/jsp/template.jsp" controllerClass="NavigationController.class"> 
  <put name="title" value="Navigation" type="string" /> 
  <put name="beanType" value="navigationBeans" type="string" /> 
</definition>

<definition name="newsfeedBox" page="/WEB-INF/jsp/template.jsp" controllerClass="NewsfeedController.class"> 
  <put name="title" value="Newsfeeds" type="string" /> 
  <put name="beanType" value="newsfeedBeans" type="string" /> 
</definition>
```

Beide sollen also den gleichen Typ einer Box verwenden (template.jsp), aber unterschiedlich betiteln und mit unterschiedlichen Inhalten befüllen. Die Controller packen jeweils eine List<MenuEntryBean> in den Component Scope, zB:

```
public void execute(ComponentContext componentContext, HttpServletRequest request, HttpServletResponse response, ServletContext servletContext) throws Exception {

  List<MenuEntryBean> navigationBeans = getNavigation();
  componentContext.putAttribute("navigationBeans", navigationBeans);
}
```

In der View-Komponente (template.jsp) wollte ich jetzt "einfach" den BeanType abfragen und in jeder Box die entsprechend im ComponentContext platzierten Beans ausgeben:


```
<tiles:importAttribute name="beanType"/>

<div class="box">
	<h1><tiles:insert name="title" /></h1>
	<ul>
		<logic:iterate name="${beanType}" id="menuEntry" type="MenuEntryBean">
			[*][url="${menuEntry.uri}"]<c:out value="${menuEntry.displayName}"/>[/url]
		</logic:iterate>
	[/list]
</div>
```
Klappt aber nicht. Der beanType, den ich in den tiles.xml Definitionen an die einzelnen Tiles weitergebe scheint beim 2. Mal überschrieben zu werden.

Wenn ich nur eine von beiden Tile-Definitionen drin habe, ist alles ok. Habe ich beide drin, wird die zuerst definierte Liste der beiden navigationBeans bzw. newsfeedBeans nicht gefunden. 

Jemand eine Idee wonach ich weiter suchen kann?


----------



## TSH (17. Aug 2007)

Hab das jetzt statt in den ComponentContext (=Tiles scope) in den Request Scope gepackt (request.setAttribute("navigationBeans", navigationBeans)

Und das kann ich dann auch wie im obigen JSP importieren. Dann gehts.


----------

