2013-04-10 61 views
1

我是Struts FW和JSP的新手。我有几个通过<s: iterator>生成的列表行。我希望根据每列(姓名,地址等) 对列表进行排序,因此我添加了<s:sort>标记并创建了比较器类(名称,地址)。Struts2将url参数传递给排序标记

现在,我不知道如何通过URL参数,我想使用哪种类型的比较器?

的代码看起来是这样的:

<s:bean name="ois.AlphabetComparator" var="alphabetComparator" /> 
<s:bean name="ois.AddressComparator" var="addressComparator" /> 
<s:url id="place" action="getAllPlaces"> 
    <s:param name="sortStyle">#addressComparator 
    </s:param> 
</s:url> 
<s:a href="%{place}"> 
<s:sort comparator="?how to pass url parameter here?" source="places"> 
    <s:iterator status="status"> 
    ... 
    </s:iterator> 
</s:sort> 

回答

0

实施例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")); 
    } 

这个例子可以由更有经验的用户改进。但目前只需显示一个列表就足够了,还有两个按钮可以改变物品的排序方式。祝你好运;-) @ +

+0

谢谢你的详细手册!工作正常! – user2265837 2013-04-21 06:02:48