2011-03-09 5 views
1

postgres 데이터베이스에는 다른 것들 중에서 int [] 필드가있는 테이블이 있습니다.ui를 사용하여 JSF에서 배열을 저장하는 방법 : repeat + h : inputText + managed bean?

내 모델에는 int [] 필드를 포함하여 테이블을 매핑하는 지속 된 bean이 있습니다. 이 클래스에서는 필요한 모든 setter/getter를 구현했습니다.

이제는 컨트롤러 역할을 담당하는 관리 빈과 모델 빈에 대한 링크가 있습니다. 그래서, 내 XHTML에서 나는이 작업을 수행하기 위해 노력하고있어 :

<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber"> 
    <h:inputText value="#{baseNumber}"/> 
</ui:repeat> 

baseSetList가 INT [] 배열입니다.

문제는 양식을 제출할 때이 요소 만 업데이트되지 않는다는 것입니다. 초기화가 작동하고 getter가 호출되지만 저장은 수행되지 않으므로 바인드 사항이어야합니다. 간단히 말해, int (]을 쓰기 가능한 Integer와 같은 래핑 할 수있는 사용자 정의 클래스의 ArrayList로 대체하려고했지만 작동하지 않습니다.

어쩌면 올바르게 바인딩되지 않은 반복입니다. 실제로 모르겠습니다. 이것은 자바에서 수년간의 PHP의 첫 번째 프로젝트입니다 :).

답변

2

올바른지 모르겠지만 baseNumber은 관리 빈의 모든 속성에 바인딩되지 않습니다. ui:repeat의 범위에만 존재합니다. editableBaseSetList

<ui:repeat value="#{editableBaseSetList}" var="myVariable"> 
    <h:inputText value="#{managedBean.property}" /> 
</ui:repeat> 
+0

사실 나는 그 자신을 발견했습니다. 그래서 사실 나는 지금 baseNumber.storedInteger를 사용하고 있고 setters는 correcty입니다. 이제 객체 배열에서 원래의 int 배열을 만들어야합니다. – aciobanu

+0

내 문제는 사실 내 관리 빈 proprety 그것은 배열, 그리고 배열의 각 구성원에 대한 텍스트 입력하고 데이터베이스에 저장하고 싶습니다. 이것은 내가 아직 성취하지 못한 것입니다. – aciobanu

+1

동일한'# {managedBean.property} '에'value'를 가리키는 여러 개의'inputText'를 시도해 보셨습니까? '많은 목록 상자 선택 '권한을 사용할 수 있다는 것을 알고 있습니까? 물론 문제가 해결되면 ... – bluefoot

10

경우의 int는 [], 다음 baseNumber는 int이며 :

당신은 뭔가를해야한다. 이제 입력 텍스트 구성 요소를이 int에 바인딩합니다.

그러나이 바인딩은 양방향이 아닙니다. input 엘리먼트는 그것이 바인딩 된 엘리먼트 만 보게되고, 그것이 출현 한 콜렉션이 아니다. 따라서이 컬렉션을 업데이트하는 방법에 대한 지식이 없습니다.

따라서 업데이트 할 수있는 항목에 바인딩해야합니다. 예를 들어 목록이 내부 정수에 대한 getter와 setter를 가진 IntHolder 포함 된 경우 사용합니다 (의 getInt()와 setInt()를 말한다) 및 목록 ArrayList와 것 : 다시 게시 후

<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber"> 
    <h:inputText value="#{baseNumber.int}"/> 
</ui:repeat> 

, JSF 제공된 값으로 목록의 각 IntHolder에 대해 setInt() 메서드를 호출합니다.

정수 또는 다른 변경 불가능한 형식을 이미 보유하고있는 컬렉션의 경우 위에서 언급 한 컬렉션으로 변환하는 번거 로움이 될 수 있습니다. 그러나 또 다른 해결책이 있습니다. 여기서 var 속성을 ui:repeat으로 사용하지 않고 색인을 사용합니다. 그런 다음 h:inputText에이 색인 var로 색인화 된 모음에 대한 바인딩을 제공합니다.

예.

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

@ManagedBean 
@ViewScoped 
public class RepeatBean { 

    List<Integer> list; 

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

    @PostConstruct 
    public void initList() { 
     list = new ArrayList<Integer>(); 
     list.add(10); 
     list.add(20); 
     list.add(30); 
    } 

    public String save() { 
     // list now contains the values provided by the user. 
     return ""; 

    } 

} 

다음 Facelet에 사용 :

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html"   
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    > 

    <h:body> 

     <h:form> 
      <ui:repeat value="#{repeatBean.list}" varStatus="status">    
       <h:inputText value="#{repeatBean.list[status.index]}" /> 
      </ui:repeat> 
      <h:commandButton value="Save" action="#{repeatBean.save}" /> 
     </h:form> 

    </h:body> 
</html> 

이 초기 화면에 10 20 30이 표시됩니다

는 다음 콩을 가정 해 봅시다.번호를 변경하고 저장을 클릭하면 예를 들어 확인할 수 있습니다. 목록 인스턴스 변수에 업데이트 된 숫자가 들어있는 중단 점입니다.

+2

이런, 고마워, 이제는 jsf가 어떻게 작동하는지 더 잘 느끼기 시작했다. – aciobanu

+2

좋은 것. Facelets 1.x (JSF 1.x의 경우)에서 ''의 'varStatus'를 사용할 수 없다는 사실에 OP는 JSF 2.x를 사용하고 있음을 명시 적으로 언급하지 않았습니다. – BalusC

관련 문제