如何处理<select> HTML过滤器中的空值?</select>

时间:2010-06-29 13:32:06

标签: java model-view-controller design-patterns anti-patterns

我有一个打印用户的用户界面,我不想按国家/地区进行过滤。 我制作了一个经典的<select />元素。

在JSP中我有

<select id="country" onchange="return filter();">
    <option value="">...</option>
    <c:forEach var="country" items="${countries}">
        <option value="${country.id}"
            ${country.name}
        </option>
    </c:forEach>
</select>

事情是有些用户没有国家,所以我需要处理2个过滤器: - 一个打印所有用户,没有过滤器 - 仅打印没有国家/地区的用户

所以我想知道对Java说什么是最好的方式:“找到我所有的用户”,“找到我没有国家的所有用户”。

我有一点想法:如果countryId = 0,服务器会将其转换为“没有国家/地区的用户,如果countryId = null,则服务器会将其转换为”所有用户“。

最后,DAO对象将进行类似

的查询
public List<User> findByCountry(Integer countryId){

   query = "select * from users"
   if(countryId==0){
      query+= " where country_id is null"
   }
   else if(countryId==null){
      query += " where country_id = " + countryId;
   }
   return query results...
}

这样可以,或者这是丑陋的,还是有人有更好的模式来做到这一点?

2 个答案:

答案 0 :(得分:1)

我实际上会提出两个DAO API:

public ... findAllUsers(...) {...}

public ... findAllUsersWithoutACountry(...) {...} 

我认为,您的方法存在的问题是,由于动态SQL代码,您的API并不明确。这使您的同事更难理解您的代码。其次,这些是两个不同的任务,虽然它们相似,但最好提出两种明确的方法。这对于单元测试来说更容易,并且由于您在方法中的控制流量较少,因此您的圈复杂度较低。此外,代码更容易理解,因为其他开发人员不需要想知道为什么你正在测试countryId对0或null这不会向他们传达大量有意义的消息,除了它只是一个快速的黑客来解决你目前的问题。未来3周,您将会想知道为什么要自己测试这些奇怪的值。 :)

答案 1 :(得分:0)

我认为您的方法是正确的,但您可能希望让任何用户WHERE CountryID=0 || CountryID IS NULL使用“所有用户”标签,这样您就可以过滤以查看没有国家/地区设置的任何人。然后,如果需要/需要,您可以修复这些用户。但我认为总的来说你的解决方案很好。