I just got done figuring all that stuff out, here's an example of
dynamically creating a definition, sticking it into the context, and then
inserting it into a jsp:


In the action:

// In my original code I'm looping to create definitions for a portal-esque
app
// you might eliminate the vector completely
java.util.Vector componentList = new java.util.Vector();

ComponentDefinition definition = new ComponentDefinition();
definition.setTemplate("/common/big_window.jsp");
definition.put("window.title", "Dynamic Title");
definition.put("window.content", "/do/some/stuff");

// Stick the def into the tiles context.  You can get this by extending
TilesAction
// or by request.getContext() (I think)
context.putAttribute("templateDefinition1" , definition);
componentList.add("templateDefinition1" );
request.setAttribute("componentsList", componentList);


So then I've built a collection of definition names and stuck that into the
request, this way I know the names to extract.  If you're just using 1
definition, you could just have hardcoded the name and not sent it in the
request.  The following loops over the vector of def names and inserts each
one, it's not pretty due to a limitation in jsps and the <logic:iterate>
tag, and adapted from a few of the Tiles example pages:

<jsp:useBean id="componentsList" scope="request" class="java.util.Vector" />

<%
Iterator it=componentsList.iterator();
Integer index = null;
int i = 1;
while( it.hasNext() ) {
    String comp=(String)it.next();
    index = new Integer(i++);
%>

<tiles:insert name="<%=comp%>" flush="true"/>

Hope this helps!


-Chip

-----Original Message-----
From: William Salvucci [mailto:[EMAIL PROTECTED]
Sent: Monday, June 23, 2003 11:17 AM
To: [EMAIL PROTECTED]
Subject: Re: [tiles] programatically putting a definition into a layout


tiles context? How do I get that?

The logon.jsp has a struts html:form attribute that is associated to the
action class.

>>> [EMAIL PROTECTED] 06/23/03 06:05AM >>>


William Salvucci wrote:

>with the following tiles-def, I can forward to layout.main and everything
is fine:
>
>definition name="layout.main" path="/layoutMain.jsp">
>    <put name="header" value="header.jsp" />
>    <put name="app" value="layout.app" />
>    <put name="footer" value="footer.jsp" />
>  </definition>
>
>  <definition name="layout.app" path="/layoutApp.jsp">
>    <put name="mainMenu" value="menu.main" />
>    <put name="subMenu" value="subMenu.jsp" />
>    <put name="body" value="welcome.jsp" />
>  </definition>
>
>  <!-- Menu bar definition -->
><definition name="menu.main" path="/menu.jsp" >
>  <putList name="items" >
>    <add value="Item 1" />
>    <add value="Item 2" />
>    <add value="Item 3" />
>  </putList>
></definition>
>
>I then modify the tiles-def so that in layout.main app = "logon.jsp" where
logon.jsp submit is associated with a struts action. In the struts action I
set the layout.main app = "layout.app"
>
>ComponentDefinition layout = TilesUtil.getDefinition("layout.main",
request, this.servlet.getServletContext());
>      layout.put("app", "layout.app");
>
>
  It is not recommended to change a definition dynamically, unless you
know very well what you do. A definition content is shared by all the
website. Changing the content will be reflected to all user of the
definition. If you want to change a definition attribute for the current
tiles, you should do so in the tile context, which hold a temporary copy
of the definition.

>and forward to "layout.main". So basically after the action everything
should be the same as my original setup. However, I get the following error
on the forward
>
><Jun 20, 2003 1:16:00 PM EDT> <Error> <HTTP> <Included resource or file
"/netl-c
>ommons/layout.app" not found from requested resource
"/netl-commons/layoutMain.j
>sp".>
>
>
  The layout.app name has been interpreted as an URL.  It appear that
the Tiles mechanism hasn't catch it.
  I don't see how you call the action from the logon.jsp page.

  Cedric

>layoutMain.jsp is not changed during my update and looks like
>
><TABLE border="1">
>  <TR><TD COLSPAN="2"><tiles:insert attribute="header"/></TD></TR>
>  <TR><TD COLSPAN="2"><tiles:insert attribute="app" /> </TD></TR>
>  <TR><TD COLSPAN="2"><tiles:insert attribute="footer"/></TD></TR>
></TABLE>
>
>Any idea why layoutMain.jsp could load layout.app in the original, but
can't when I programatically put it into layout.main? I noticed that the put
method doesn't have type as an argument for specifying "string", "page",
"definition", so I hope that isn't it.
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to