2010-02-17 10 views
6

내 응용 프로그램에서 버튼을 클릭하면 행을 추가해야하며이 버튼은 모든 행에 있어야합니다. 이 작업을 수행하는 데 도움이 필요하십니까?JSF에서 동적으로 테이블에 행을 추가하는 방법은 무엇입니까?

항목 클래스

public class Item { 
public Item() 
{ 

} 
private String value; 
public Item(String value) { this.value = value; } 
public void setValue(String value) { this.value = value; } 
public String getValue() { return value; } 
} 

콩 클래스를 관리

public class MyMB 
{ 
private List<Item> list;  

public void addItem() { // JSF action method 
    list.add(new Item("Default")); 
    Iterator<Item> iterator = list.iterator(); 
    while(iterator.hasNext()) 
    { 
     Item item = (Item)iterator.next(); 
     System.out.println(item.getValue()); 
    } 
    System.out.println(); 
    } 
/** 
* @return the list 
*/ 
public List<Item> getList() { 
    if(list==null) 
    { 
     loadList(); 
    } 
    return list; 
} 
private void loadList() { 
    list = new ArrayList<Item>(); 
    list.add(new Item("Data")); 
} 

} 

JSF 코드

<h:form> 
    <rich:dataTable value="#{myMB.list}" var="item" id="tabel"> 
    <h:column><h:inputText value="#{item.value}" /></h:column> 
    <h:column><a4j:commandButton value="Add" actionListener="#{myMB.addItem}" reRender="tabel"/></h:column> 

+0

jsf 1.2 또는 jsf 2.0? – Bozho

+0

jsf 1.2 with Apache MyFaces – Hariharbalaji

답변

9

당신이해야 할 모든 기본적으로 참으로 단지 h:dataTablevalue 속성 뒤에 데이터 모델에 빈 개체를 추가합니다.

그러나 동일한 빈 행은 후속 요청에도 보존해야합니다. Backing 빈이 요청 범위가되면 데이터 행은 빈 행없이 다시로드됩니다. 이것은 bean이 세션 범위를 가질 때 모두 작동해야합니다.

JSF 코드에 몇 가지 오류가 있습니다. h:dataTablevar 특성이 누락되어 있고 열 내용이 h:column 안에 있어야합니다.

public class Bean { 
    private List<Item> list; 

    public Bean() { 
     list = new ArrayList<Item>(); 
    } 

    public void add() { 
     list.add(new Item()); 
    } 

    public List<Item> getList() { 
     return list; 
    } 
} 

Item 클래스는 물론 기본 인수 없음의 생성자가 있어야합니다

<h:form> 
    <h:dataTable value="#{bean.list}" var="item"> 
     <h:column><h:inputText value="#{item.value}" /></h:column> 
    </h:dataTable> 
    <h:commandButton value="Add" action="#{bean.add}"/> 
</h:form> 

세션이나보기 콩은 다음과 같이 볼 수 범위. 대개 이것은 이미 암시 적으로 사용할 수 있지만 인수로 자신 만의 생성자를 정의하면 더 이상 사용할 수 없습니다. 명시 적으로 정의해야합니다. 그렇지 않으면 더 이상 Item item = new Item();을 수행 할 수 없습니다. 당신이 요청 범위에 콩을 유지하는 것을 선호하는 경우

public class Item { 

    private String value; 

    public Item() { 
     // Keep default constructor alive. 
    } 

    public Item(String value) { 
     this.value = value; 
    } 

    // ... 
} 

는, 당신은 빈 부하에 동일한 금액을 보존 할 수 있도록, 새로 추가 된 항목의 양을 유지해야합니다.

public class Bean { 
    private List<Item> list; 
    private HtmlInputHidden count = new HtmlInputHidden(); 

    public Bean() { 
     count.setValue(0); 
    } 

    public void add() { 
     list.add(new Item()); 
    } 

    public List<Item> getList() { 
     if (list == null) loadList(); 
     return list; 
    } 

    public HtmlInputHidden getCount() { 
     return count; 
    } 

    public void setCount(HtmlInputHidden count) { 
     this.count = count; 
    } 

    private void loadList() { 
     list = new ArrayList<Item>(); 

     // Preserve list with newly added items. 
     for (int i = 0; i < (Integer) count.getValue(); i++) { 
      list.add(new Item()); 
     } 
    } 
} 

만하여 JSF 페이지의 <h:form>에 다음을 추가해야합니다 : 파악을 위하여

<h:inputHidden binding="#{bean.count}" converter="javax.faces.Integer" /> 

을 유용한이 기사를 찾을 수있는 방법으로 datatables 사용에 관한 : Using Datatables. 또한 요청 및 세션 범위에서 많은 예제가있는 WAR 파일을 포함합니다.

+0

@BalusC :이 기법에 의심의 여지가 있습니다. 전체 페이지가 새로 고쳐지는 버튼을 누르면 Ajax를 사용하여이 모든 과정을 비동기 적으로 수행 할 수 있습니까? – Hariharbalaji

+0

가능합니다. 아직 JSF 2.0을 사용하지 않으므로 일부 타사 구성 요소 라이브러리를 연결해야합니다. JBoss RichFaces의 Ajax4jsf 하위 구성 요소를 사용하는 것이 좋습니다. 자세한 내용은 다음을 참조하십시오. http://www.jboss.org/file-access/default/members/jbossajax4jsf/freezone/docs/devguide/en/html_single/index.html – BalusC

+0

귀하가 제공 한 링크를 사용하여 Ajax를 지원하는 코드. '# {myMB.addItem}'메서드를 찾을 수 없다는 오류가 발생합니다. : ....하지만 Bean 클래스에서 해당 메서드가 있습니다. 친절하게 도와주세요 – Hariharbalaji

2

예를 들어이 표를 가지고 :

<h:datatable value="#{myBean.list}" ...> 
    ... 
    <h:column> 
     <h:commandButton value="Add a row" action="#{myBean.addRow}"/> 
    </h:column> 
</h:datatable> 

방법을 myBean.addRow 단순히 목록에 새로운 요소를 추가합니다 :

public class MyBean { 

    private List<SomeClass> list; 

    ... 

    public List<SomeClass> getList() { 
     return list; 
    } 

    public void addRow() { 
     list.add(new SomeClass()); 
    } 
} 

당신은 버튼을 클릭 할 때 addRow 메서드는 목록에에 새 요소를 추가합니다. 페이지가 새로 고쳐지고 새 행이있는 표가 표시됩니다.

편집 : 귀하의 게시물 에디션에 관한

, 세 가지 :

포인트 1 : 당신이 당신의 오류의 스택 트레이스를 첨부시겠습니까?

포인트 2 : 메소드 addRow는 JSF에서 탐색에 사용하는 ID 인 String을 리턴합니다. 이 작업은 (같은 페이지에 즉, 사용자의 체류) 어떤 탐색을 포함하지 않기 때문에, 단순히 null 또는 ""을 반환 :

public String addRow() { 
    list.add(new Item("new data")); 
    return null; 
} 

포인트 3 : 내가 추가 (클래스 Item 빈 생성자를 제공 할 것을 제안) 현재 생성자의 :

public Item() { 
} 
+0

Bean 클래스의 2 행에서 SomeElement와 getter 메서드에 대해 언급했다. SomeClass를 언급했다 ... 명확히 할 수있다 – Hariharbalaji

+0

죄송합니다. 단지 오타였습니다. 내 게시물을 수정했습니다. 물론, 나는 같은 종류의 객체를 사용한다. (코드 스 니펫을 제공하지 않았을 때 JSF 페이지와 빈에서 가지고있는 것에 관해서 몇 가지 가정을했다.) – romaintaz

+0

안녕하세요, 내 코드를 첨부했지만 오류가 발생했습니다. 도움말을 참조하십시오. – Hariharbalaji