2

私は新しいタイルユーザーであり、これまでのところ気に入っています。しかし、私は今問題に直面しており、タイルが私の目的を達成するための適切なツールであるかどうかはわかりません。

私がやりたいのは、複数のサイト間で共有される一般的な登録フォームを作成することです。この登録フォームは、サイトごとに若干異なります。したがって、明らかに、同じjspファイルとjavaコードを使用できます。私の目的は、どの入力フォームフラグメントをフォームに含めるか、どの入力フォームフラグメントを含めないか(サイトごとに)を構成できる.propertiesファイルを作成することです。

属性を動的に挿入する方法はありますか?

ビュー作成者クラスを作成しました。このようにして、既存の属性を追加/上書きできます。

public class TestViewPreparer extends ViewPreparerSupport {
    public void execute(TilesRequestContext tilesContext, AttributeContext attributeContext) throws PreparerException {
        Attribute attribute = new Attribute("/WEB-INF/views/search-panel/holiday-type.jsp");
        attributeContext.putAttribute("rfFragment", attribute);
    }
}

ただし、これは一度に1つの属性のみを追加/オーバーライドします。テンプレートファイルに加えて、それぞれに次の行を追加する必要があります。

<tiles:insertAttribute name="rfFragment1" />
<tiles:insertAttribute name="rfFragment2" />
    //... etc

私が探しているのは、Attributesのリストを追加し、それらをループを使用してテンプレート行に含めるようなものです。どういうわけかこのように:

    <tiles:useAttribute id="fragments" name="rfFragments" classname="java.util.List" />
    <c:forEach var="fragment" items="${fragments}">
        <tiles:insertAttribute value="${fragment}" flush="true" /></c:forEach>

私の問題は、AttributeContext1つの属性しか取得できず、属性のリストを取得できないことです。または私は何かを逃しましたか?

詳細を踏まえて、問題について十分に説明したと思います。

4

1 に答える 1

1

現在、ViewPreparer を使用してタイル内に動的ナビゲーション メニューを作成しようとしている同様の問題に取り組んでいます。以下にリンクされている投稿によると、AttributeContext を使用する代わりに、TilesRequestContext を介して ArrayLists を渡すことができます。私はそれを自分で完全に動作させることはできませんでしたが、おそらくこれらのリンクは、将来これを探している人に役立つでしょう (良い例を見つけるのに永遠にかかりました)

ViewPreparer の例

コントローラに Spring を注入する

私の実装:

public class HeaderController extends ViewPreparerSupport{
private EvalTypesService evalTypesService;

@Autowired
public HeaderController(EvalTypesService evalTypesService){
    this.evalTypesService = evalTypesService;
}

@Override
public void execute(TilesRequestContext tilesContext, AttributeContext attributeContext) throws PreparerException{
    List<EvalMasterEvaluationType> evalTypes = evalTypesService.getAllActiveEvalTypes();
    tilesContext.getRequestScope().put("evalTypes", evalTypes);
}

}

view.xml での定義:

<definition name=".mainTemplate" template="/WEB-INF/views/main_template.jsp" preparer="myPathToController.HeaderController">
    <put-attribute name="header" value="/WEB-INF/views/tiles/header.jsp" />
    <put-attribute name="content" value="" />
    <put-attribute name="footer" value="/WEB-INF/views/tiles/footer.jsp" />
</definition>

ディスパッチ サーブレット xml のタイル Bean:

<bean class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"/>

<bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/views/**/views.xml</value>
        </list>
    </property>
    <property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.SimpleSpringPreparerFactory" /></bean>

header.jsp タイル内:

<div id="nav">
<c:out value="${msg}"></c:out>
<ul>
    <c:forEach var="type" items="${evalTypes}">
    <li><a href="<s:url value="/evalTypes/${type.id}" />"><c:out value="${type.name}" /></a></li>

    </c:forEach>
</ul>

于 2013-05-31T17:02:46.467 に答える