例 1
パラメータの値を取得するには、 #parameters['sortStyle'] を使用します。最初に、パラメーター sortStyle に個別の値を指定して URL を作成します。
<s:url id="place_sortByAddress" action="getAllPlaces">
<s:param name="sortStyle">ois.AddressComparator
</s:param>
</s:url>
<s:url id="place_sortByAlphabet" action="getAllPlaces">
<s:param name="sortStyle">ois.AlphabetComparator
</s:param>
</s:url>
次に、リンクを追加します (選択したリンクに応じて、さまざまな方法でリストを並べ替えることが目標であると仮定します)。
<s:a href="%{place_sortByAddress}">Sort by Adress</s:a></br>
<s:a href="%{place_sortByAlphabet}">Sort by Alphabet</s:a></br>
次のステップはもう少しトリッキーです。実際に sortStyle というパラメーターがある場合、パラメーター sortStyle の値から新しい Bean が作成されます。この Bean は、リスト内の項目をソートするためのコンパレーター クラスになります。
<table>
<tbody>
<s:if test='%{#parameters["sortStyle"] != null}'>
<s:bean name='%{#parameters["sortStyle"]}' var="comparatorClass" />
<s:sort comparator="#comparatorClass" source="places">
<s:iterator>
<tr>
<td><s:property value="name"/></td>
<td><s:property value="adress"/></td>
</tr>
</s:iterator>
</s:sort>
</s:if>
</tbody>
</table>
たとえば、最初のリンクをクリックした場合、コンパレータ クラスはois.AddressComparatorになります。
このソリューションは正常に機能するはずですが、パラメータの使用に依存しており、ユーザーが表示および変更でき、"if" タグを使用して jsp を直接チェックインする必要もあります。
チェックと変更は、Action クラスによってサーバー側で処理できます。ストラットのおかげで改善されるかもしれません。
例 2
JSP では、struts s:formタグを使用します。s:submitタグを使用して、このフォームの送信ボタンを作成します。各送信ボタンは、リストをソートする方法ごとに、Action クラスの異なるメソッドを呼び出します。
<s:form action="getAllPlaces">
<!-- Submit buttons -->
<s:submit key="messages.submit" action="getAllPlaces" method="sortByAdress"/>
<s:submit key="messages.submit" action="getAllPlaces" method="sortByAlphabet"/>
次に、リストの項目を表示するためのテーブルを作成します。最初の例と同様に、Bean はパラメトリック値から作成されます。URL で送信されるパラメーターの代わりに、属性が Action クラスによって設定され、JSP で使用されます。Action クラスがこの属性の制御と変更を処理できるようにします。
<!-- Table for list -->
<table>
<tbody>
<!-- Create a new bean with parametric class name -->
<s:bean name="%{#attr['comparatorClassName']}" var="comparatorClass" />
<s:sort comparator="#comparatorClass" source="places">
<s:iterator>
<tr>
<td><s:property value="name"/></td>
<td><s:property value="adress"/></td>
</tr>
</s:iterator>
</s:sort>
</tbody>
</table>
</s:form>
そこに、Action クラスのコードがあります。デフォルト値を持つ comparisonClassName 属性があります。メソッド sortByAlphabet() または sortByAddress を呼び出すたびに値が変わります。
public class GetAllPlacesAction extends ActionSupport{
/**
*
* @return
*/
private List<PlaceBean> places = new ArrayList<PlaceBean>();
// Set default comparator class name
private String comparatorClassName = "ois.AlphabetComparator";
public String execute()
{
// Populate Stub List
GetAllPlacesAction.populateStubList(this.places);
// Forward
return SUCCESS;
}
public String sortByAdress()
{
// Refresh comparator class name
this.comparatorClassName = "ois.AddressComparator";
// Populate Stub List
GetAllPlacesAction.populateStubList(this.places);
// Forward
return SUCCESS;
}
public String sortByAlphabet()
{
// Refresh comparator class name
this.comparatorClassName = "ois.AlphabetComparator";
// Populate Stub List
GetAllPlacesAction.populateStubList(this.places);
// Forward
return SUCCESS;
}
private static void populateStubList(List<PlaceBean> p_places)
{
// Populate Stub List
p_places.add(new PlaceBean("Gabriel", "USA"));
p_places.add(new PlaceBean("Kim", "South Corea"));
p_places.add(new PlaceBean("Khofi", "Ghana"));
p_places.add(new PlaceBean("Abel", "Germany"));
}
この例は、経験豊富なユーザーによって改善される可能性があります。しかし、今のところは、リストを表示するだけで十分で、2 つのボタンでアイテムの並べ替え方法を変更できます。がんばってください ;-) @+