Я экспериментирую с Spring MVC для будущего проекта.Мне понадобятся веб-страницы в приложении, чтобы отобразить несколько повторно используемых «компонентов», и решил, что Tiles должен помочь мне в этом?Каждый компонент будет иметь свой собственный контроллер.
Пример, который я собрал, работает только частично.Это страница с 3 плитками.Третья плитка имеет контроллер, который пытается вернуть клиенту ArrayList (через аннотацию @ModelAttribute), но ArrayList пуст, когда представление включено в качестве плитки.
Вот настройка плиток в * -сервлете.xml:
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
<property name="order" value="0"/>
</bean>
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles-config/tiles.xml</value>
</list>
</property>
</bean>
<bean id="viewResolver2" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="order" value="1" />
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
Вот мой конфиг плиток (tile.xml):
<tiles-definitions>
<definition name="parent" template="/WEB-INF/jsp/tiles/parent_layout.jsp">
<put-attribute name="header" value="/WEB-INF/jsp/tiles/header.jsp"/>
<put-attribute name="body" value=""/>
<put-attribute name="recordsSection" value=""/>
<put-attribute name="widgetsSection" value=""/>
</definition>
<definition name="_n/list.htm" extends="parent">
<put-attribute name="recordsSection" value="/WEB-INF/jsp/_n/list.jsp"/>
<put-attribute name="widgetsSection" value="/WEB-INF/jsp/_n/widgets.jsp"/>
</definition>
</tiles-definitions>
Вот код JSP, стоящий за рассматриваемой плиткой.Выражение «widgetsList» - это то, что привязано к методу контроллера, но возвращается пустым, когда это представление включено в виде плитки.
<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isELIgnored="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@taglib prefix="display" uri="http://displaytag.sf.net" %>
<h3>Widgets</h3>
<p>widgetsList=${widgetsList}</p>
<div id="displaylist">
<display:table id="items" name="${widgetsList}" cellspacing="0" export="true">
<display:column title="Widget ID" property="widgetId"/>
<display:column title="Widget Name" property="widgetName"/>
<display:column title="Widget State" property="widgetState"/>
</display:table>
</div>
Вот контроллер:
@Controller
public class WidgetController {
@Autowired
private WidgetDaoImpl widgetDao = new WidgetDaoImpl();
@RequestMapping("_n/widgets.htm")
public String widgets() {
return "_n/widgets.htm";
}
@ModelAttribute("widgetsList")
public ArrayList<Widget> getWidgets() {
System.out.println("executing getWidgets()");
ArrayList<Widget> records = widgetDao.listWidgets();
return records;
}
}
Когда ядоступ к представлению «widgets.jsp» напрямую, атрибут «widgetsList» заполняется, только когда он добавляется как тайл, он ничего не возвращает.