2014-03-05 2 views
2

Java 코드에서 프로그래밍 방식으로 JSF 양식에서 사용할 수있는 <fieldset> 태그를 작성하고 싶습니다.프로그래밍 방식으로 JSF로 HTML 양식 fieldset 태그 작성

내 양식의 설정은 다음과 같습니다

Application app = FacesContext.getCurrentInstance().getApplication(); 

HtmlForm form = (HtmlForm) app.createComponent(HtmlForm.COMPONENT_TYPE); 
form.setStyleClass("pure-form pure-form-stacked"); 

당신은 내가 JSF UI 구성 요소의 식별자로 HtmlForm.COMPONENT_TYPE를 사용하지만 나는 FIELDSET에 대한 식별자를 발견하지 않았습니다 볼 수 있듯이 그래서 나는 시도했다 :

UIComponent fieldset = app.createComponent("fieldset"); 
form.getChildren().add(fieldset); 

불행하게도이 그렇게 작동하지 않습니다 내가 다른 해결책을 마련한다. 아이디어가 있습니까?

HTML 태그 (JSF 컨텍스트에서 알 수 없음)를 생성하는 일반적인 방법이 있습니까?

답변

3

당신이 시도 할 수있는 사항은 다음과 같습니다

<f:verbatim escape="false"> 
    <fieldset id="blah"></fieldset> 
</f:verbatim> 

을 그것을 달성하기 위해 programmaticlly이 같은이 구성 요소를 추가 할 수 있습니다 :

는이 같은 XHTML에서 사용하는 것이 <f:verbatim>라는 구성 요소를 Theres는

String fieldsetHTMLText ="<fieldset id=\"blah\"></fieldset>"; 

UIOutput verbatim = new UIOutput(); 
verbatim.setRendererType("javax.faces.Text"); 
verbatim.getAttributes().put("escape", false); 
verbatim.setValue(fieldsetHTMLText); 
3

내 문제에 대한 세 가지 해결책을 찾았습니다. 첫 번째는 PrimeFaces을 사용하고 두 번째는 MyFaces Tomahawk을 사용하고 세 번째는 문자열 입력을 사용하여 JSF Verbatim UI component을 사용하는 것입니다. 곧 코드 샘플과 솔루션 간의 차이점을 나열하겠습니다.

1 PrimeFaces 하나는 프로그래밍 방식으로 즉석 FIELDSET에를 만들 FIELDSET 클래스를 사용할 수있는 PrimeFaces 구성 요소 스위트의 포함 (그리고 아파치 코 몬즈는 FileUpload 의존성의)와

. 나쁜 점은 PrimeFaces Fieldset 구성 요소가 PrimeFaces JavaScript 파일에 의존하므로 일반 필드 집합 대신 필드 집합과 JavaScript 포함이 너무 많이 발생한다는 것입니다. 토마 설정

import org.primefaces.component.fieldset.Fieldset; 

... 

form.getChildren().add(new Fieldset()); 

2에서 MyFaces 토마

UI 컴포넌트는, 프로그램 된 HTML을 만들 FIELDSET 사용될 수 FIELDSET 성분 온다. Tomahawk의 Fieldset이 사용될 경우 일반적이고 멋진 Fieldset 태그를 얻을 수 있습니다. 여기서 나쁜 점은 Tomahawk이 MyFaces의 확장이며 MyFaces 자체가 표준 JSF와 함께 사용되어서는 안되는 전체 JavaServer Faces 구현이라는 것입니다.

import org.apache.myfaces.custom.fieldset.Fieldset 

... 

form.getChildren().add(new Fieldset()); 

3 JSF 축어 UI 부품

표준화 해키 및 방법은 완전 일치 JSF UI 구성 요소를 사용하는 것이다. 축 어적 구성 요소 내에서 필요한 모든 HTML을 넣을 수 있습니다.이 작은 트릭을 통해 우리는 그대로 태그를 만들 수 있습니다 위의 코드는 FIELDSET의 HTML 요소를 렌더링

UIOutput fieldset = new UIOutput(); 
fieldset.setRendererType("javax.faces.Text"); 
fieldset.getAttributes().put("escape", false); 
fieldset.setValue("<fieldset></fieldset>"); 

을하지만, 문자열 및 프로그래밍 방식으로 해당 태그에 아무것도 추가 할 수 없습니다 폐쇄되는 문자열 내부의 태그이기 때문에, 그래서이 작동하지 않습니다

form.getChildren().add(fieldset); 

요소의 중첩에 사용할 수있는 HTML 태그를 생성하려면, 각각의 개폐 태그이 솔루션 매우 텍스트 무거운를 만드는 자신의 Varbatim 구성 요소에 넣어해야합니다

UIOutput fieldsetStart = new UIOutput(); 
fieldsetStart.setRendererType("javax.faces.Text"); 
fieldsetStart.getAttributes().put("escape", false); 
fieldsetStart.setValue("<fieldset>"); 

UIOutput fieldsetClose = new UIOutput(); 
fieldsetClose.setRendererType("javax.faces.Text"); 
fieldsetClose.getAttributes().put("escape", false); 
fieldsetClose.setValue("</fieldset>"); 

HtmlInputText inputText = (HtmlInputText) app.createComponent(HtmlInputText.COMPONENT_TYPE); 

form.getChildren().add(fieldsetStart); 
form.getChildren().add(inputText); 
form.getChildren().add(fieldsetClose); 

결론 : 표시된 솔루션의

없음 정말 우아한 없다. PrimeFaces와 MyFaces는 많은 의존성을 가지며 표준 JEE 방식은 실제로 많은 노력을 필요로합니다. document.createElement("fieldset");과 같이 알 수없는/사용자 정의 HTML 요소를 생성하는 좋은 솔루션을 찾고자했습니다.

누구나 할 수있는 방법을 알고 있다면 해결책을 게시하십시오.