テーブル、画像、プロットなどの複雑なオブジェクトのリストを1つのページにレンダリングしたいとします。各要素は、独自のブロック(たとえば<div>
)に存在します。このような複雑なオブジェクトにはいくつかの種類がありますので、レンダリングロジックを1か所に実装するのではなく、何らかの方法でモジュール化します(オブジェクトの種類ごとに別々のコードとJSPを準備する別のコード)。私はこれをできる最善の方法は何ですか?struts2:動的ブロックページ構造
私自身が<s:action>
タグを使用するつもりでした。だから私は私のリストを反復処理し、いくつかの条件に基づいてアクションを呼び出すことができます:
<s:iterator value="objectList" var="element">
<s:if test="#element.type == 'TABLE'">
<s:action name="renderTable"><s:param name="elementValue" value="#element.value"/></s:action>
</s:if>
...
</s:iterator>
表やグラフや私がアクションをレンダリングにデータを渡す必要があり、他の要素をレンダリングするために - あなたは、私がしようとしている見ることができますentries
を私のrenderTable
に渡してください。 Strutsはこのパラメータを文字列の配列にキャストし、私のアクションでsetElementValue(String[])
を見つけようとします。だから私は例外を取得:
java.lang.NoSuchMethodException: edu.stackoverflow.RenderTable.setElementValue([Ljava.lang.String;)
私はorg.apache.struts2.components.ActionComponent
の実装は、このような方法でパラメータを処理する理由はわかりません、ここではクラスからのコードは次のとおりです。
for (Iterator i = parameters.entrySet().iterator(); i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
String key = (String) entry.getKey();
Object val = entry.getValue();
if (val.getClass().isArray() && String.class == val.getClass().getComponentType()) {
params.put(key, (String[])val);
} else {
params.put(key, new String[]{val.toString()});
}
}
ので、アプローチが不可能になります。
代替手段はありますか?
私はこれらのアプローチに慣れていません。どちらが最もシンプルですか? –
私のレンダリングコードでもDIを使っていくつかの依存関係を提供する必要があるので、おそらくこれはJSPタグでは難しいでしょう。 –
@pavel_kazlouに依存します。値スタックは、カスタムタグ、コンポーネント、アクションタグのいずれを使用していても、依頼全体を通じて引き続き利用できます。これは、値にアクセスするためのさまざまな方法を提供します。これには、値をプッシュすること( ''など)が含まれます。 –