2013-04-05 24 views
7

Kullanıcıların öğeleri diledikleri gibi sabitleyebileceği ve kaldırabileceği dinamik bir gösterge panosuyla çalışıyorum. Şimdi varolan kompozit bileşenini destekleyici fasulye görünümüne eklemek istediğim bir sorunum var. Bunu internetten yapmanın doğru yolunu bulmaya çalıştım ama şimdiye kadar başarı yok. İşte Programlama yoluyla destekleyici içinde bileşik bileşen oluşturun ve ekleyin

<?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> 

kompozit bileşeni dönmelidir kodu:

Column column = new Column(); 
UIComponent test = HtmlUtil.getCompositeComponent("test.xhtml", "comp"); 
column.getChildren().add(test); 
: Burada

public static UIComponent getCompositeComponent(String xhtml, String namespace) { 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    Application app = fc.getApplication(); 
    Resource componentResource = app.getResourceHandler().createResource(xhtml, namespace); 

    UIPanel facet = (UIPanel) app.createComponent(UIPanel.COMPONENT_TYPE); 
    facet.setRendererType("javax.faces.Group"); 
    UIComponent composite = app.createComponent(fc, componentResource); 
    composite.getFacets().put(UIComponent.COMPOSITE_FACET_NAME, facet); 

    return composite; 
} 

Ve işlevi kullanıyorum nasıl edilir Burada eklemek istediğiniz basit kompozit bileşenidir

Sütunun içinde hiçbir şey işlenmiyor. Bunun nasıl yapılabileceği hakkında bir fikrin var mı? Benim kullanım durumumda uymuyor çünkü rendered = "# {bean.isThisRendered}" yol gitmek istemiyorum.

+0

ilgi (konu korkunç kötü kaplıdır ve bu beni ileriye ışık yılı getirecek) Out şu şekildedir:

public static void 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); } } 

Yani, özel örnekte, kullanmak HtmlUtil.getCompositeComponent'ı çağıran 3-liner? –

cevap

11

Bu kod eksik. Bileşik bileşen kaynağını bileşik bileşen uygulamasına dahil etmek için FaceletContext#includeFacelet() kullanmanız gerekir. İşte işi yapan bir yardımcı programdır. EL kapsamına #{cc}'un oluşturulması gereken bağlam olduğu için ebeveynin ellerinde olması önemlidir. Yani bu yardımcı yöntem, aynı zamanda, kompozitleri, verilen ebeveynin çocuğu olarak derhal ekler. Ayrıca, kompozit bileşene sabit bir ID vermek önemlidir, aksi halde JSF, kompozit içindeki herhangi bir form/girdi/komut bileşenini işleyemez. Nerede çağırıyoruz:

includeCompositeComponent(column, "comp", "test.xhtml", "someUniqueId"); 
+0

Çok ilginç! Dış bileşenleri dahil etmek için bu yöntemi (belki biraz değişmiş) kullanmak mümkün mü? Varolan bir kaynağı kullanmak yerine, uygulama içinde tanımlı olmayan bileşenleri eklemek istiyorum. – fnst

+1

@fnst: Gerekirse, kaynak işleme özel bir kaynak işleyici ile kontrol edebilirsiniz. Nihayetinde geçerli bir "URL" ile bittiği sürece, temel olarak her şeye işaret edebilir ('file: //', 'http: //', etc ve hatta özel protokoller de dahil olmak üzere, örneğin DB erişimi teorik olarak mümkündür) . – BalusC

+0

Cevabınız için teşekkürler, bunu denemek zorundayız :) Bileşik bileşenler için değer ifadeleri olarak değer ifadeleri eklemek de mümkün müdür? – drodil

İlgili konular