2013-11-09 4 views
3

<p:selectManyCheckbox>을 구현하려고하는데 성공하지 못했습니다. 이제두 개의 ArrayList로 SelectManyCheckbox를 사용하는 방법? - Primefaces

나는 다음과 같은 구조 한 모든 데이터는 MYSQL DB에서 오는

public class CourseMBean{ 

    (...) 
    // Stores all disciplines 
    private static ArrayList<Discipline> allDisciplines; 

    // Stores only the disciplines that's already associated with this course. 
    private static ArrayList<Discipline> courseDisciplines; 

    (get and set for the arraylists) 
    (...) 
} 

을,하지만 그건 문제되지 않습니다 : 저는 두 ArrayList<Discipline>

Course - have many Disciplines 
Discipline - belongs to none, one or many Courses. 

클래스 Course에서이 . 이제 저는 새로운 코스를 만들고 싶습니다. 그래서 코스 코스에는 아무 것도 없습니다.

체크 박스에 모든 분야 표시를 원하고 사용자가 하나의 체크 박스를 선택하면이 체크 박스의 객체 징계가 과정에 추가됩니다. 하나의 체크 박스를 선택 취소하면 courseDsiciplines에서 해당 규율을 제거하십시오.

내 JSF 2.0 코드는 다음입니다 :

<p:selectManyCheckbox id="disciplines" value="#{courseMBean.allDisciplines}" layout="grid" columns="2">           
    <f:selectItems value="#{courseMBean.courseDisciplines}" /> 
</p:selectManyCheckbox> 

이 실제로 선택한 체크 박스없이 모든 분야를 보여줍니다 옳은 일입니다. 그러나 일부 체크 박스를 선택하고 양식을 제출하면 courseDisciplines에 요소를 인쇄하려고 시도하지만 콘솔에는 아무 것도 표시되지 않습니다.

내가 잘못하고있는 것은 무엇입니까? 나는 몇 가지 체크 박스를 선택하고 양식을 제출할 때

+0

selectManyCheckbox가 폼으로 묶여 있습니까? CourseMBean의 범위는 무엇입니까? – 757071

+0

네, 그는 양식 안에 있고 범위는 @ SessionScoped입니다. 뭔가 잘못 되었나요? 제가 원한대로 작동해야합니까? – Paladini

+0

나는 당신의 문제를 이해하기가 힘듭니다. 선택한 항목 대신 사용 가능한 항목을 인쇄하려고하는 이유와 사용 가능한 항목이 비어있는 이유는 무엇입니까?하지만 UI에서 분명히 선택할 수 있습니까? – BalusC

답변

8

은 내가 courseDisciplines으로

실제로 사용할 수 항목을 나타냅니다 courseDisciplines 내부의 요소를 인쇄하려고하지 선택 항목, 그것은 UISelectManyUISelectItem(s) 구성 요소에 대한 일부 기본 개념을 잘못 이해 한 것으로 보입니다.

<f:selectItem(s)> (UISelectItem(s) 제품군)은 개를 사용할 수 있습니다. 개입니다. UI에 표시되고 최종 사용자가 선택해야하는 항목입니다.

(<h:selectManyCheckbox><h:selectManyMenu>와 같은 UISelectMany 가정에서) <p:selectManyCheckbox>의 속성은 value(프리)이 항목을 선택 나타낸다. 서식의 최초 표시 중에 이것이 null 또는 공백 인 경우, 아무것도 선택되지 않습니다. 또는 미리 선택된 항목이있는 경우 equal() 인 사용 가능한 항목 만 미리 선택됩니다. 최종 사용자가 UI에서 선택 및 변경 양식을 제출했다

가 선택한 모든 항목 UISelectMany 성분의 특성에 value 끝날 것이다. UISelectItem(s)은 변경되지 않습니다.

여기 기본 킥오프 예입니다 :

<p:selectManyCheckbox value="#{bean.selectedItems}"> 
    <f:selectItems value="#{bean.availableItems}" /> 
</p:selectManyCheckbox> 
<p:commandButton value="Submit" action="#{bean.submit}" /> 
<p:messages autoUpdate="true" /> 
private List<String> selectedItems; // +getter +setter 
private List<String> availableItems; // +getter (no setter necessary!) 

@PostConstruct 
public void init() { 
    availableItems = new ArrayList<String>(); 
    availableItems.add("one"); 
    availableItems.add("two"); 
    availableItems.add("three"); 
} 

public void submit() { 
    System.out.println("Selected items: " + selectedItems); 
} 

는 (다른 모든 <p:selectManyXxx><h:selectManyXxx> 구성 요소가 정확히 같은 작업)

Discipline 같은 복잡한 자바 빈즈 객체가 그림에 온다

, 그런 다음 Converter이 있는지 확인하여 JSF가 올바르게 변환 할 수 있도록하고 String을 사용하십시오. 생성 된 HTML 출력 및 HTTP 요청 매개 변수 (HTML 및 HTTP 즉, Java 객체를 전달하거나 보유 할 수 없으며 Java로 표시된 문자 시퀀스 만 String으로 표시).

아마도 이것은 근본적인 문제 일 것입니다. 제출할 때 아무 것도 콘솔에 인쇄되지 않는다고하셨습니다. 그러나 실제로 전체 submit() 메서드가 호출되지 않는 경우가 좋을 수 있습니다. 이 점에 대해 충분히 분명하지 않습니다. 전체 액션 메소드가 실제로 호출되지 않는 경우 (즉, 디버그 중단 점이 충돌하지 않거나 static 문자열을 인쇄하는 다른 System.out.println()이 콘솔에 표시되지 않는 경우) 실제로는 전환 오류 일 가능성이 큽니다. <h|p:message(s)>을 올바른 방법으로 사용했거나 대기 중이지만 표시되지 않은 얼굴 메시지에 대한 서버 로그에주의를 기울 였다면주의해야합니다. 이 경우

, 당신은 DisciplineString 사이에 변환하는 Converter를 구현해야합니다. 종종 DB의 ID가 String 표현으로 사용되는 것보다 더

@FacesConverter(forClass=Discipline.class) 
public class DisciplineConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) { 
     // Write code here to convert from String to Discipline. 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object modelValue) { 
     // Write code here to convert from Discipline to String. 
    } 

} 

. 관련 질문에 대한이 대답의 "선택한 항목으로 복잡한 개체"섹션을 참조하십시오. How to populate options of h:selectOneMenu from database?

+0

다시 감사드립니다 Balusc! 그냥 조금 질문 : 변환기에서 대신 "징계"이름을 징계 "ID"값을 얻을 수 있습니까? 핸들 문자열이 ints (id)처럼 너무 안전하지 않고 빠르지 않기 때문에 더 안전하게 "name"대신 ID를 사용하여 DB에서 값을 얻습니다. – Paladini

+0

http://stackoverflow.com/questions/6848970/how-to-prepopulate-a-hselectonemenu-from-a-db/6850681#6850681에서 다른 답변의 전신환을 사용했습니다. 다시 한 번 감사드립니다! – Paladini