OmniFaces Faces.includeCompositeComponent(...)
의 작은 변형을 사용하여 다른 UIComponent에 복합 구성 요소를 동적으로 추가하려고합니다. 나는 this question의 동작을 재현하려고 시도했지만 작동하지 않습니다."Faces.includeCompositeComponent"?를 사용하여 동적으로 구성 요소를 추가하는 방법 Websphere 8 및 ICEFaces 3
적응 방법에 대한 코드입니다
/**
* Create and include the composite component of the given library ane
* resource name as child of the given UI component parent and return the
* created composite component. This has the same effect as using
* <code><my:resourceName></code>. The given component ID must be unique
* relative to the current naming container parent and is mandatory for
* functioning of input components inside the composite, if any.
*
* @param parent The parent component to include the composite component in.
* @param libraryName The library name of the composite component.
* @param resourceName The resource name of the composite component.
* @param id The component ID of the composite component.
* @return The created composite component, which can if necessary be further
* used to set custom attributes or value expressions on it.
* @since 1.5
*/
public static UIComponent includeCompositeComponent(UIComponent parent, String libraryName, String resourceName, String id)
{
// Prepare.
FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();
FaceletContext faceletContext = (FaceletContext) context.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
// This basically creates <ui:component> based on <composite:interface>.
Resource resource = application.getResourceHandler().createResource(resourceName, libraryName);
UIComponent composite = application.createComponent(context, resource);
composite.setId(id); // Mandatory for the case composite is part of UIForm!
// Otherwise JSF can't find inputs.
// This basically creates <composite:implementation>.
UIComponent implementation = application.createComponent(UIPanel.COMPONENT_TYPE);
implementation.setRendererType("javax.faces.Group");
composite.getFacets().put(UIComponent.COMPOSITE_FACET_NAME, implementation);
// Now include the composite component file in the given parent.
parent.getChildren().add(composite);
parent.pushComponentToEL(context, composite); // This makes #{cc} available.
try
{
faceletContext.includeFacelet(implementation, resource.getURL());
}
catch (IOException e)
{
throw new FacesException(e);
}
finally
{
parent.popComponentFromEL(context);
}
return composite;
}
(내가 OmniFaces v1.6에에서했다) 그리고이 미안 그것에게
JSFUtils.includeCompositeComponent(panelGroup, "comp",
"../inc-templates/test.xhtml", JSFUtils.createUniqueId());
를 사용하려고 시도하는 방법입니다 다음
또한 "test.xhtml"파일을 만들고 WEB-INF/inc-templates/test.xhtml 아래에 두었습니다. 다음은 그 내용이다 :
<tag>
<tag-name>test</tag-name>
<source>../inc-templates/test.xhtml</source>
</tag>
: 적어도
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:composite="http://java.sun.com/jsf/composite">
<!-- INTERFACE -->
<cc:interface>
</cc:interface>
<!-- IMPLEMENTATION -->
<cc:implementation>
<h:outputText value="TEST"/>
</cc:implementation>
</html>
마지막으로
test.xhtml, I've이처럼 taglib.xml에 test.xhtml 태그를 추가
코드를 실행하고 구성 요소를 삽입하려고하면 다음 예외가 발생합니다.
,393,210및 org.my.JSFUtils.includeCompositeComponent (JSFUtils.java:496)에서 광고 사실 자원이 이전 라인에서 생성되지 않는 것을 알 UIComponent composite = application.createComponent(context, resource);
코드의 라인에 정확히 가리킨다 : Resource resource = application.getResourceHandler().createResource(resourceName, libraryName);
왜 이런 일이 일어날 수 있는지 전혀 알지 못합니까? 나는 심지어 inc-templates/test.xhtml 그리고 심지어는 test.xhtml 메서드를 호출 할 때 리소스의 위치를 변경해 보았습니다.하지만 아무 것도 작동하지 않습니다 ... 나는 항상 같은 오류가 발생합니다. 그런데
은, 미안은 ICEFaces 3. 사전에감사를 사용하여 WebSphere 8 미안에 배포하려고!
정말 고마워요! 생각한 것처럼, 프로그래밍 방식으로 복합 구성 요소를 포함하려고했습니다. 나는 네가 제안한 것을 했어. – jcrusoe