2011-08-11 1 views
10

내 JSF 페이지selectOneMenu 왜 ItemLabel을 변환기로 보내시겠습니까? 그런 일이 왜


<h:form> 
    <h:selectOneMenu id="studlist" value="#{studBean.selectedStudent}">     
    <p:ajax event="change" process="studlist" update="studdep" ></p:ajax> 
    <f:selectItems value="#{studBean.student}" var="s" 
        itemValue="#{s.studid}" itemLabel="#{s.name}"/> 
    <f:converter converterId="studentconverter"/> 
    </h:selectOneMenu> 
</h:form> 

변환기 클래스이 변환기에 (StudentConverter)


public Object getAsObject(FacesContext context, UIComponent component, String value) { 

Student studConvert= new Student(); 
List<Student> students=new ArrayList<Student>(); 
students=(ArrayList<Student>)((UISelectItems  
      component.getChildren().get(0)).getValue(); 
} 

인수 '문자열 값'은 ITEMLABEL 난을 준다? 은 내가

답변

17

getAsObject() 안에 항목 값 대신 항목 레이블이있는 이유가 확실하지 않습니다. 아마도 귀하의 getAsString()은 잘못하고 있으며 학생 ID를 기반으로 학생 이름을 반환 할 것입니다.

어쨌든 귀하의 itemValue이 옳지 않다는 것을 알 수 있습니다.

<h:selectOneMenu id="studlist" value="#{studBean.selectedStudent}"> 
    <f:selectItems value="#{studBean.student}" var="s" 
     itemValue="#{s.studid}" itemLabel="#{s.name}" /> 
    <f:converter converterId="studentconverter" /> 
</h:selectOneMenu> 

는 A 컨버터는 복잡한 자바 객체와이 HTTP 요청 매개 변수로 주위에 전달 될 수 있도록 String 표현 사이의 변환 사용할 수들이 의도된다. 그러나 학생 ID를 전체 학생 개체 대신 항목 값으로 지정합니다. 대신 전체 학생 개체를 지정해야합니다. #{studBean.selectedStudent}은 학생 번호를 나타내는 Long 속성이 아닌 Student 속성을 참조해야합니다. 다음과 같이이 itemValue를 해결하면

: 다음

public String getAsString(FacesContext context, UIComponent component, Object value) { 
    // This method is called when item value is to be converted to HTTP request parameter. 
    // Normal practice is to return an unique identifier here, such as student ID. 
    Student student = (Student) value; 
    Long id = student.getStudid(); 
    return String.valueOf(id); 
} 

public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    // This method is called when HTTP request parameter is to be converted to item value. 
    // You need to convert the student ID back to Student. 
    Long id = Long.valueOf(value); 
    Student student = someStudentService.find(id); 
    return student; 
} 

그것을 작동한다고 :

<h:selectOneMenu id="studlist" value="#{studBean.selectedStudent}"> 
    <f:selectItems value="#{studBean.student}" var="s" 
     itemValue="#{s}" itemLabel="#{s.name}" /> 
    <f:converter converterId="studentconverter" /> 
</h:selectOneMenu> 

하고 다음과 같이 컨버터 (사소한 nullchecks 생략). 처음했다으로

또는, 당신은 당신의 itemValue을 유지할 수 있고, 전부 <f:converter>을 제거 할 수 있지만 당신은 학생 ID를 나타내는 Long 속성을 가리 키도록 #{studBean.selectedStudent}을 변경해야합니다.

+0

BalusC처럼 항상 똑똑! 감사합니다 – Mariah

1

당신은 다음과 같이 될 것입니다 h:selectOneMenu

페이지의 f:selecitems 속성에 selectitem 목록을 사용할 필요가이 문자열에 itemValue 지팡이;

<h:form> 
    <h:selectOneMenu id="studlist" value="#{studBean.selectedStudent}"> 
    <p:ajax event="change" process="studlist" update="studdep" ></p:ajax>  
    <f:selectItems value="#{studBean.studentSelectItemList}" />  
    <f:converter converterId="studentconverter"/>  
    </h:selectOneMenu> 
</h:form> 

backing bean 측에서 studentSelectItemList selectitem을 채워야합니다.

private List<SelectItem> studentSelectItemList; 

//fill studentSelectItemList at the appropriate place 
    studentSelectItemList.add(new SelectItem(studentId,studentName)); 

이러한 설정 후에 학생 ID를 선택 값으로 지정해야합니다.

+0

아무런 차이가 없습니다. – BalusC

0

오늘도 같은 문제가있었습니다.

이 잘못된 렌더링에 의해 발생합니다 :

<select ...> 
    <option>None</option> 
    <option value="1">First</option> 
    <option value="2">Second</option> 
</select> 

빈 문자열 대신 라벨를 제출에서 "없음"옵션 결과에 대한 value=""를 생략.

그러나이 문제를 해결하고 첫 번째 옵션에 대해 렌더러 쓰기 value="" 그냥 getAsString()가 null 반환하지 확인하게, 대신 "" (빈 문자열)을 반환합니다.


@BalusC는

<h:form id="form"> 
    ... 

    <p:selectOneMenu id="targetStep" value="#{action.targetStep}" required="true"> 
     <o:converter converterId="omnifaces.ListIndexConverter" list="#{entity.stepList}" /> 
     <f:selectItems var="step" value="#{entity.stepList}" itemLabel="#{step.name}" 
      itemValue="#{step}" /> 
    </p:selectOneMenu> 

    <p:commandButton process="@this" update="@widgetVar(stepDialog)" 
     oncomplete="PF('stepDialog').show()" icon="#{icons.addStep}" 
     value="#{bundle.addStep}"> 
     <f:setPropertyActionListener target="#{viewScope.step}" 
      value="#{s:newInstance('it.shape.edea2.jpa.WorkflowStep')}" /> 
    </p:commandButton> 

    <p:message for="targetStep" /> 

    ... 
</h:form> 

<p:dialog widgetVar="stepDialog" header="#{bundle.addStep}" modal="true" dynamic="true" 
    resizable="false"> 
    <h:form> 
     <p:panelGrid columns="2" styleClass="app-full-width"> 
      <h:outputLabel value="#{bundle.name}" /> 
      <h:panelGroup> 
       <p:inputText id="name" value="#{step.name}" required="true" /> 
       <p:message for="name" /> 
      </h:panelGroup> 

      ... 

      <f:facet name="footer"> 
       <p:commandButton process="@form" update="@form :form" 
        oncomplete="hideDialog('stepDialog', args)" icon="#{icons.confirm}" 
        value="#{bundle.confirm}"> 
        <p:collector value="#{step}" addTo="#{entity.stepList}" /> 
        <f:setPropertyActionListener target="#{action.targetStep}" 
         value="#{step}" /> 
       </p:commandButton> 
      </f:facet> 
     </p:panelGrid> 
    </h:form> 
</p:dialog> 

귀하의 구조 :

+0

동의하지 않습니다. '# {s.studid}'가 null (서비스에 의해로드되지 않는 새로운 Student 인스턴스 일 가능성이 높고)'getAsString()'이 null submittedValue (가능성 있음)에 대해 null을 반환하면이 상황이 발생할 수 있습니다. 그리고이 스 니펫은 * 왜 selectOneMenu ItemLabel을 변환기로 보냅니 까? *. 그러나 2 시간 전 질문을 발견했다면 그 시간을 아끼지 않았을 것입니다 :) –

+0

저는이 방법이 일반적이 아니라는 것을 알고 있습니다. 그러나 사용자가 엔티티를 선택하고 선택 공간을 확장 할 수있는이 시나리오를 때때로 만났습니다. 그 자신. 업데이트 된 답변의 실제 사용 사례. –

0

BalusC (다시)에 omnifaces.ListIndexConverter 나를 위해이 일을 못을 박았다. 동일한 문제가 있었고 BalusC가 이전에 내 변환기의 getAsString() 메서드가 내 개체의 "firstname"속성을 반환했음을 지적했습니다.

@Override 공공 문자열 getAsString (FacesContext 컨텍스트 UIComponent를 구성 요소, 개체 값) {

if (value == null || value.equals("")) { 
     return ""; 
    } 
    else { 
     return String.valueOf(((Employee) value).getfirstname()); 
    } 

} 

나는 ID를 반환하려면이 옵션을 변경하고 예상대로 일하기 시작했다.

@Override 공공 문자열 getAsString (FacesContext 컨텍스트 UIComponent를 구성 요소, 개체 값) {이론을 설명하기

if (value == null || value.equals("")) { 
     return ""; 
    } 
    else { 
     return String.valueOf(((Employee) value).getId()); 
    } 

} 

BalusC 당신의 노력은 대단히 감사합니다. 너는 하늘이다!