2016-05-25 10 views
0

Ich habe eine benutzerdefinierte JSF-Komponente mit dem folgenden Code erstellt:Wie übergibt man den Wert von der verwalteten Bean an die benutzerdefinierte jsf-Komponente?

@FacesComponent("MainMenu") 
public class MenuComponent extends UIComponentBase { 
    private List<MenuItem> items; 
    private String title; 

    public MenuComponent() { 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public List<MenuItem> getItems() { 
     return items; 
    } 

    public void setItems(List<MenuItem> items) { 
     this.items = items; 
    } 

    public String getFamily() { 
     return UI.FAMILY; 
    } 
} 

Dann ein Renderer für die Komponente I hinzugefügt:

@FacesRenderer(componentFamily = UI.FAMILY, rendererType = "MainMenuRenderer") 
public class MenuComponentRenderer extends Renderer { 
    @Override 
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException { 
     MenuComponent menuComponent = (MenuComponent) component; 
     ResponseWriter responseWriter = context.getResponseWriter(); 
     responseWriter.startElement("ul", menuComponent); 
     responseWriter.writeAttribute("class", "sidebar-menu", ""); 
     // заголовок 
     responseWriter.startElement("li", menuComponent); 
     responseWriter.writeAttribute("class", "header", ""); 
     responseWriter.write(menuComponent.getTitle()); 
    } 

    @Override 
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException { 
     MenuComponent menuComponent = (MenuComponent) component; 
     ResponseWriter responseWriter = context.getResponseWriter(); 
     responseWriter.endElement("ul"); 
     // title 
     responseWriter.endElement("li"); 
     // menu items 
     for (MenuItem menuItem : menuComponent.getItems()) { 
     responseWriter.startElement("li", menuComponent); 
    } 
    } 
} 

Dann registriert Komponente in taglib.xml:

<tag> 
    <tag-name>mainMenu</tag-name> 
    <component> 
     <component-type>MainMenu</component-type> 
     <renderer-type>MainMenuRenderer</renderer-type> 
    </component> 
    <attribute> 
     <name>items</name> 
     <required>true</required> 
    </attribute> 
    <attribute> 
     <name>title</name> 
     <required>true</required> 
    </attribute> 
</tag> 

In JSF-Seite habe ich es auf folgende Weise verwendet:

<mds:mainMenu items="${sidebar.menuItems}" title="Главное меню"</mds:mainMenu> 

Tag mit Sidebar Managed Bean verwandt ist, ist bean einfach wie möglich:

@ManagedBean(name = "sidebar", eager = true) 
@RequestScoped 
public class Sidebar { 
    @Inject 
    private MenuService menuService; 
    private List<MenuItem> menuItems; 

    public Sidebar() { 
     System.out.println("Hello, world!"); 
    } 

    @PostConstruct 
    public void init(){ 
     setMenuItems(menuService.getMainMenu()); 
    } 

    public List<MenuItem> getMenuItems() { 
     return menuItems; 
    } 

    public void setMenuItems(List<MenuItem> menuItems) { 
     this.menuItems = menuItems; 
    } 
} 

Aber! Ich habe Wert von "Titel" Attribut in meinem Renderer, aber nicht "Elemente"! Wie übertrage ich "items" an meine Komponente? Wenn ich debugge, gibt es keinen Aufruf für "Sidebar" Bean. Was ist falsch in meinem Code?

+0

Vergessen Sie ein '>' nach 'Titel' Attribut' 'oder ist es ein Tippfehler? – Omar

Antwort

0

Objekt Wert = menuComponent.getValueExpression ("Elemente"). GetValue (context.getELContext());