多字段搜索框的设计模式

时间:2013-01-16 15:16:44

标签: design-patterns search

我意识到网站的高级搜索模块(在Struts 2中制作)。 此搜索区域是具有许多不同字段的表单。 我可以在所有字段中放置字符串,根据选择,部分或全部字段都会得到不同的结果。 我现在要做的是检查一个很糟糕的if / elseif语句,如果有空白字段(以及哪些),然后应用正确的方法。

实施例

    if (field_1.equals("") && field_2.equals("")) {
        dao.searchAll;
    } else if (field_1.equals("") && !field_2.equals("")) {
        dao.searchType1;
    } else if (!field_1.equals("") && !field_2.equals("")) {
        dao.searchType2;
    } else if {
       ...
       ...

其中dao的方法是HQL(休眠)查询。

这个例子比我有5个textinput字段的情况更简单。

有一种更好,更灵活的方法来做同样的事情吗? 一些设计模式如战略?

2 个答案:

答案 0 :(得分:1)

Struts非常弱。首先要注意的是不要将您的行为直接绑定到接口组件。在JSF中,您可以将这些字段绑定到类的属性,然后从那里引用它们(体现查询调度的组件应该对输入源一无所知)。

调度程序基本上就是您所拥有的:当收到某些消息时,触发特定的响应。我会将值放入一些不可变的形式,然后创建一个工厂方法来获取或进行适当的查询。然后在工厂构造外执行。

这不是一种策略。您可以通过不同的方式确定要执行的操作,但这是一个创建问题:您正在将输入的片段转换为查询。

答案 1 :(得分:0)

看看Hibernate Criteria API。您可以使用它根据字段构建查询。所以,例如,你可以这样写:

Criteria criteria = session.createCriteria(Some.class);
if (!field_1.equals("")) {
  criteria.add( /*some criteria for field_1 */ );
}
if (!field_2.equals("")) {
  criteria.add( /*some criteria for field_2 */ );
}