Struts Tiles Question in J2EE Project

Tservarius

Mitglied
Hi Leute,
hier ein kleines Problem von mir. Erstmal nen Haufen Sourcecode (schon reduziert) und denn weiter unten mein Problem und die Frage.

struts-config.xml
---------------------------------------------------------------------------

Code:
....
<plug-in className="org.apache.struts.tiles.TilesPlugin">
     <set-property property="definitions-parser-validate" value="true" />
     <set-property property="moduleAware" value="true" />
     <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
</plug-in>
....



tiles-defs.xml
---------------------------------------------------------------------------

Code:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
 
<tiles-definitions>
 
<definition name="base.definition" path="/jsp/layout.jsp">
	<put name="title" value="testtitle" />
</definition>
	
 
<definition name="page.login" extends="base.definition">
	<put name="test" value="test" />
	<put name="body" value="/jsp/login.jsp" />	
</definition>
</tiles-definitions>



layout.jsp
---------------------------------------------------------------------------

Code:
<%@ page language="java"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles"%>
	
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 
<html:html locale="true">
<head>
	<html:base />
	<title><tiles:getAsString name="title" /></title>
 
	<div class="content">
		<tiles:insert attribute="body" />
	</div>
 
</body>
</html:html>



login.jsp
---------------------------------------------------------------------------

Code:
<%@ page language="java"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles"
	prefix="tiles"%>
 
		<div class="introtext">
			<h4>
			<tiles:getAsString name="test" />
			</h4>
		</div>




Mein Problem:
---------------------------------------------------------------------------
Die Tags in der layout.jsp werden korrekt gelesen, die tags in der login.jsp jedoch nicht und es resultiert nur die Fehlermeldung:

ServletException in:/jsp/login.jsp] Error - tag.getAsString : attribute 'test' not found in context. Check tag syntax'

Was mache ich falsch, bzw. warum werden die tiles-tags in der layout.jsp interpretiert, aber nicht mehr in den einzelnen jsp's wie z.B. login.jsp, welches selbst in der layout.jsp eingebunden wird.

Schonma danke im Voraus!
 
Das ist auch korrekt so. Deine in der Tiles definition definierte page.login mappt ja nicht auf login.jsp sondern auf layout.jsp - da ist wahrscheinlich dein denkfehler. Du definierst einen Tile namens page.login, der (nach Auflösung der Vererbung) duch index.jsp dargestellt wird. Darin benutzt du nun "body" und landes in der login.jsp. Damit bist du aber nun eine Kontextebene tiefer (du hattest "test" nur für page.login definiert) und hast somit keinen Zugriff mehr auf Attribute aus dem Namensraum ein Level höher.

Das ganze könntest du folgendermaßen abändern:
Ersetz deine page.login durch folgende
Code:
<definition name="page.login" extends="base.definition">
  <put name="test" value="test" />
  <put name="body" value="page.login.body" />
</definition>

<definition name="page.login.body" page="/jsp/login.jsp" />
Jetzt kannst du test folgendermaßen weiterreichen:
Code:
layout.jsp
...
<tiles:importAttributes /> <!-- legt alle Tiles Attribute im PageContext ab -->
<tiles:get name="body">
  <tiles:put name="test" value="$test" />
</tiles>
Schlag mich nicht tot, wenn's net 100% korrekt ist. Hab schon lang nichts mehr mit Tiles gemacht undauch grad die Doku nicht bei der Hand. Essentiell ist aber, dass du Attribute manuell in tiefere Ebenen weiterreichen musst.

Gruß
Ollie
 

Neue Beiträge

Zurück