2011-10-08 62 views
0

我有這樣的理論的情況:合併兩個非常相似的方法

一個形式

  • 2輸入 [屬性attr1,對象itemattr2] **

    <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}" /> 
    

兩個非常相似的方法在bean.java:

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的操作?

SOLUTION:

private void search(String field, String value) 
action="#{bean.search('attr2', bean.item.attr1)}" 

回答

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) {...} 
    } 
+0

謝謝Bozho,這是一個錯誤的問題,我應該要求甚至合併命令按鈕中的動作,像'action =「#{bean.search(bean.item.attr1,」aatr2「)}'': - ) – gaffcz

+0

這應該與jsf 2 – Bozho

+0

mein gott,你是對的,但用'attr2'而不是'attr2'...謝謝你,對不起:) – gaffcz

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)最終會導致流失:請考慮從該方法返回列表,即使您將其設置爲屬性以傳遞以任何方式使用它。

+0

太感謝您戴夫! – gaffcz

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()); 
} 
+0

非常感謝Crozin,它的工作原理,但我的問題是錯誤的,我應該要求合併即使是行動(請參閱我對bozho的回答) : - / – gaffcz

相關問題