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?
Vergessen Sie ein '>' nach 'Titel' Attribut' mds: mainMenu> 'oder ist es ein Tippfehler? –
Omar