2016-06-07 2 views
1

jsf에 대한 사용자 정의 UI 구성 요소를 작성하여 <f:selectItems />을 대체하려고했습니다.이 요소는 selectOneMenu에 래핑됩니다. 그래서 내 facesComponent는 selectOneMenu가 <select></select>을 제공하는 동안 모든 옵션을 생성해야합니다.사용자 정의 jsf 요소 교체 <f : selectItems />

문제는 옵션이 selectOneMenu 내부에 렌더링되지 않고 바로 외부에 렌더링된다는 점입니다.

내 facesComponent은 다음과 같습니다

@FacesComponent(value = "be.mokuril.jsf.SelectItemsForEnum") 
public class SelectItemsForEnum extends UISelectItems { 

@Override 
public void encodeAll(FacesContext facesContext) throws IOException { 
    ResponseWriter responseWriter = ResponsefacesContext.getResponseWriter(); 
    responseWriter.startElement("option", null); 
    responseWriter.writeAttribute("value", 1, null); 
    responseWriter.write("option1"); 
    responseWriter.endElement("option"); 
    responseWriter.startElement("option", null); 
    responseWriter.writeAttribute("value", 2, null); 
    responseWriter.write("option2"); 
    responseWriter.endElement("option"); 
} 

을 그리고 이것은 내 태그 라이브러리입니다 :

<h:form> 
<h:selectOneMenu> 
    <mw:selectItemsForEnum /> 
</h:selectOneMenu> 
</h:form> 

나는 또한했습니다 : 문제를 재현하는

<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
version="2.0" id="mw" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" 
> 
<namespace>http://www.mokuril.be/jsf/mw</namespace> 
<composite-library-name>mw</composite-library-name> 

<tag> 
    <tag-name>selectItemsForEnum</tag-name> 
    <component> 
     <component-type>be.mokuril.jsf.SelectItemsForEnum</component-type> 
    </component> 
</tag> 

그리고 XHTML 구성 요소 트리를보고 있습니다 :

중요한

<UISelectItems id="j_idt9" inView="true" rendered="true" transient="false"/> 
나는 그것을 같이 할 것으로 예상 실제로 무엇

,하지만 난 분명히 내려다 보이는해야 뭔가 : 내 구성 요소 대신 <f:selectItems />를 사용하는 경우

<HtmlSelectOneMenu disabled="false" id="j_idt7" immediate="false" inView="true" localValueSet="false" readonly="false" rendered="true" required="false" transient="false" valid="true"> 
    <SelectItemsForEnum id="j_idt8" inView="true" rendered="true" transient="false"/> 
</HtmlSelectOneMenu> 

은 내가이 얻을. UISelectOne/UISelectMany 구성 요소가 UISelectItem(s) instences 그들의 직접 아이들을 스캔하기 때문에

답변

1

귀하의 구체적인 문제가 발생합니다. 복합 구성 요소를 사용하는 경우 내용은 기본적으로 UISelectItem(s)의 인스턴스가 아닌 UIPanel 구성 요소에 래핑되므로 선택 구성 요소는이를 무시합니다. 기술적으로, 복합 컴포넌트 대신 사용자 정의 컴포넌트를 사용해야합니다. 또한 When to use <ui:include>, tag files, composite components and/or custom components?

그러나, 당신은 다음 문제를 우연히거야 참조하십시오 UISelectOne/UISelectMany 모든 스스로 옵션을 렌더링하고 렌더러의 출력을 무시하는 것입니다. 기본적으로 아무도 <f:xxx> 구성 요소가 HTML을 HTML로 렌더링하지 않습니다. 이 책임은 부모 인 <h:xxx>까지입니다. 기술적으로, <f:selectItem(s)>의 출력을 조작하려는 경우 렌더 대신 <h:selectOneMenu>의 렌더러를 재정의해야합니다.

그것은 당신이 이런 식으로 해결하려고하는 문제 unclear하지만 나는 교육 추측을 수행하는 경우, 그 질문은 아마 대답해야하고 실제 문제를 올바른 방법을 해결 : How to use enum values in f:selectItem(s) 및/또는 How to add tooltip to f:selectItems합니다.

+0

목표는 ID 만 지정해야하는 selectItems의 태그를 제공하는 것입니다. 그런 다음 구성 요소는 해당 ID를 사용하여 데이터베이스에서 열거 형 값을 조회 한 다음 해당 열거 형의 옵션을 만듭니다. 그러나 만 html을 렌더링하면이 방법은 불가능할 수 있습니다. – mokuril

+2

보기 대신 모델에서 해당 작업을 수행하는 것이 좋습니다. – BalusC

+0

아마도 사실 일 것입니다. 아마도 selectItem을 사용하고 ID를 전달하고 SelectItem []을 반환하는 bean을 만들어야합니다. 귀하의 의견을 보내 주셔서 감사합니다! – mokuril