2

今後のプロジェクトのために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」属性が設定されます。タイルとして追加された場合にのみ、何も返されません。

4

2 に答える 2

1

タイルは複合ビューのみを提供し、Spring MVCを使用すると、コントローラーは1つのビューのみを返すことができます。この場合、タイルで定義されたページ全体が1つのコントローラーによって返されます。

私はタイル構成の経験があまりありませんが、タイルプロセッサがスプリングコントローラーを呼び出すように、コントローラーにマップされたURL(JSPではなく)をタイル要素として持つことができる場合にのみ、達成しようとしていることが可能です。各「コンポーネント」。

しかし、あなたはコンポーネントについて話していて、ここでそれらを必要としているように見えるので、コンポーネント指向のフレームワークから始めてみませんか(たとえば、WicketはすぐにSpringと簡単に統合できます)。

于 2011-05-16T15:38:24.430 に答える