实施例1
使用#parameters [ 'sortStyle']来获取参数的值。首先创建一个不同的值的URL的参数sortStyle:
<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类在服务器端处理。这可能会由于struts而得到改进。
实施例2
在JSP,使用支柱S:形式标签。使用s:提交标签创建此表单的提交按钮。每个提交按钮都会调用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类的代码。它有一个带默认值的comparatorClassName属性。每次调用方法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"));
}
这个例子可以由更有经验的用户改进。但目前只需显示一个列表就足够了,还有两个按钮可以改变物品的排序方式。祝你好运;-) @ +
谢谢你的详细手册!工作正常! – user2265837 2013-04-21 06:02:48