今後のプロジェクトのためにSpring MVCを試しています。複数の再利用可能な「コンポーネント」をレンダリングするには、アプリケーションにいくつかの Web ページが必要ですが、タイルはこれを達成するのに役立つと思いますか? 各コンポーネントには独自のコントローラーがあります。
私がまとめた例は、部分的にしか機能していません。3 タイルのページです。3 番目のタイルには、(@ModelAttribute 注釈を介して) ArrayList をクライアントに返そうとするコントローラーがありますが、ビューがタイルとして含まれている場合、ArrayList は空です。
*-servlet.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>
ここに私のタイル構成(tiles.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」属性が設定されます。タイルとして追加された場合にのみ、何も返されません。