我有这种理论情况:
带
的表单 2个输入 [对象attr1
的[attr2
,item
个** **
<h:inputText id="attr1" value="#{bean.item.attr1}"/>
<h:inputText id="attr2" value="#{bean.item.attr2}"/>
2提交按钮 [按attr1
搜索,在{dtb中搜索attr2
]在foo.xhtml中:
<h:commandButton id="search1" action="#{bean.search1}" />
<h:commandButton id="search2" action="#{bean.search2}" />
和两个非常相似的方法:
public void search1(){
try
{
session = DaoSF.getSessionFactory().openSession();
Criteria criteria = session.createCriteria(Foo.class);
criteria.add(Restrictions.like("attr1", item.getAttr1()));
dataList = criteria.list();
}
catch (Exception e) {...}
}
public void search2(){
try
{
session = DaoSF.getSessionFactory().openSession();
Criteria criteria = session.createCriteria(Foo.class);
criteria.add(Restrictions.like("attr2", item.getAttr2()));
dataList = criteria.list();
}
catch (Exception e) {...}
}
有没有办法将这两种方法合并为一种?
UPDATE:还合并了commandButtons的动作?
解决方案:
private void search(String field, String value)
action="#{bean.search('attr2', bean.item.attr1)}"
答案 0 :(得分:2)
当然:寻找相同的东西,以及有什么不同。您没有提供足够的信息来了解这是否可行:
public void search(String sAttr, T attr) {
try {
session = DaoSF.getSessionFactory().openSession();
Criteria criteria = session.createCriteria(Foo.class);
criteria.add(Restrictions.like(sAttr, attr));
dataList = criteria.list();
} catch (Exception e) {...}
}
如果属性类型不一样,那就更令人恼火了,而Java带来的快乐也让它变得丑陋。
在某些时候,你最终会得到一个带Criteria
的方法,你可以在运行中创建它们并将它们传递给包装try / catch和list的东西,或者你最终创建一个接口并将实现传递给它。
另一方面,IMO创建的副作用依赖关系(如在搜索方法中设置dataList
)最终会导致眼泪:考虑从方法中返回列表,即使您只是将其设置为属性被传递给使用它的任何东西。
答案 1 :(得分:2)
只需传递与参数不同的内容:
public void search(String param, Attr attr){
try
{
session = DaoSF.getSessionFactory().openSession();
Criteria criteria = session.createCriteria(Foo.class);
criteria.add(Restrictions.like(param, attr));
dataList = criteria.list();
}
catch (Exception e) {...}
}
答案 2 :(得分:2)
您可以创建第三个方法并从这些方法中调用它:
private void doSearch(String field, String value) {
session = DaoSF.getSessionFactory().openSession();
Criteria criteria = session.createCriteria(Foo.class);
criteria.add(Restrictions.like(field, value));
dataList = criteria.list();
}
public void search1() {
doSearch("attr1", item.getAttr1());
}
public void search2() {
doSearch("attr2", item.getAttr2());
}