0
私は次のコードでカスタムJSFコンポーネントを作成しました:マネージドBeanからカスタムjsfコンポーネントに値を渡すにはどうすればいいですか?
@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;
}
}
その後、私はコンポーネントのレンダラーを追加しました:
@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);
}
}
}
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>
JSFページでは、次のように使用しました。
<mds:mainMenu items="${sidebar.menuItems}" title="Главное меню"</mds:mainMenu>
タグはサイドバー管理対象Beanと関連して、Beanはできるだけシンプルです:
@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;
}
}
しかし!レンダラーには "title"属性の値がありますが、 "items"はありません!どのように私のコンポーネントに "項目" attibute値を渡すには?私がデバッグすると、 "サイドバー" Beanへの呼び出しはありません。私のコードで何が間違っていますか?
'title'属性' mds:mainMenu> 'の後の'> 'を忘れていますか? –
Omar