Tiles 3 are not render list attributes

I had no problem with Slabs 3.0.1 until after you added the list attributes to the definitions. There are no errors and the definitions render correctly with the exception that list attributes are not present in the JSP.

I am loading tiles using CompleteAutoloadListener, here is the web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <listener>
        <listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
    </listener>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param> 
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> 
    <welcome-file-list>
        <welcome-file>/index.action</welcome-file>
    </welcome-file-list>
</web-app>

      

The definitions (tiles-defs.xml) look like this:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
    <definition name="head-default" template="/WEB-INF/template/head.jsp">
        <put-list-attribute name="items">
            <add-attribute value="/style/cssbase-min.css" />
            <add-attribute value="/style/cssfonts-min.css" />
            <add-attribute value="/style/cssreset-min.css" />
            <add-attribute value="/style/grids-min.css" />
            <add-attribute value="/style/style.css" />
        </put-list-attribute>   
    </definition>

    <definition name="default" template="/WEB-INF/template/template.jsp">
        <put-list-attribute name="items" inherit="true"/>
        <put-attribute name="head" value="head-default"/>
        <put-attribute name="header" value="/WEB-INF/template/header.jsp"/>
        <put-attribute name="body" value="/WEB-INF/template/body.jsp"/>
        <put-attribute name="footer" value="/WEB-INF/template/footer.jsp"/>
    </definition>
    <definition name="REGEXP:\/recruiter#candidate-input\.(.*)"  extends="default">
        <put-attribute name="head" value="/WEB-INF/template/recruiter/head.jsp"/>
        <put-attribute name="body" value="/WEB-INF/content/recruiter/candidate-input.jsp"/>
    </definition>
    <definition name="REGEXP:(.*)#(.*)"  extends="default">
        <put-list-attribute name="items" inherit="true"/>
        <put-attribute name="body" value="/WEB-INF/content{1}/{2}"/>
    </definition>
</tiles-definitions>

      

Finally, here is a snippet (head.jsp) where I am trying to output the value of "items", in fact I gave up and just wanted to see if the iteration would work (there should be 5 items in the list) so I just had to print five lines, but no loops were introduced.

<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <s:iterator value="items">
        iterator,
    </s:iterator>
    <c:forEach var="item" items="${items}">
        ${item}
    </c:forEach>
    <script src="<s:url value='/script/jquery/1.8.1/jquery.min.js'/>"></script>
    <script src="<s:url value='/script/jquery.sort.js'/>"></script>
    <title>A Title</title>
</head>

      

Any ideas?

Update: Final working title tile including the use of location tags.

<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <tiles:importAttribute name="items"/>
    <s:iterator value="#attr.items">
        <s:property/>
    </s:iterator>
    <script src="<s:url value='/script/jquery/1.8.1/jquery.min.js'/>"></script>
    <script src="<s:url value='/script/jquery.sort.js'/>"></script>
    <title>A Title</title>
</head>

      

Because the tiles place the imported "elements" attribute on the page area, it can only be accessed from struts2 using the #attr area.

+3


source to share


1 answer


In Tiles 2.2, your code is missing an extra line example from the Tiles 2.2 documentation :

<tiles:useAttribute id="list" name="items" classname="java.util.List" />

      

However, tile 3.0.1 now uses the importAttribute tag:



<tiles:importAttribute name="items"/>

      

Working solution:

<tiles:importAttribute name="items"/>
<c:forEach var="item" items="${items}">
    ${item}
</c:forEach>

      

+11


source







All Articles