1

我是 Struts FW 和 JSP 的新手。我有几个通过<s: iterator>. 我想根据每一列(名称、地址等)对这个列表进行排序,所以我添加了<s:sort>标签并创建了比较器类(名称、地址)。

现在,我想知道如何通过 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>
4

2 回答 2

0

例 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

这个解决方案应该可以正常工作,但它依赖于参数的使用,用户可以看到和修改,而且我们还必须直接在 jsp 中使用“if”标记进行检查。

Action 类可以在服务器端处理检查和更改。多亏了struts,它可能会得到改进。

例 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 类的代码。它有一个带有默认值的 compareClassName 属性。每次调用方法 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"));
    }

更有经验的用户可能会改进此示例。但目前只显示一个列表和两个按钮来更改其项目的排序方式就足够了。祝你好运 ;-) @+

于 2013-04-11T18:01:11.203 回答
0
<s:sort comparator="?how to pass enum class  here?" source="places">   
    <s:iterator status="status">   
    ...   
    </s:iterator>

我的枚举类是 -->

package com.vijay.util;
public enum ServiceComparator {
    displayNameAndEffectiveAt{
        @Override
        public int compare(ServiceContract sc0, ServiceContract sc1) {
            //code
        }
    };
}
于 2019-11-06T12:11:46.050 回答