2016-05-25 3 views
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への呼び出しはありません。私のコードで何が間違っていますか?

+0

'title'属性' 'の後の'> 'を忘れていますか? – Omar

答えて

0

オブジェクト値= menuComponent.getValueExpression( "items")。getValue(context.getELContext());

関連する問題