【问题标题】:How to pass value from managed bean to custom jsf component? [duplicate]如何将值从托管 bean 传递给自定义 jsf 组件? [复制]
【发布时间】:2016-05-25 05:43:27
【问题描述】:

我使用以下代码创建了一个自定义 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”!如何将“项目”属性值传递给我的组件?当我调试时,没有调用“侧边栏”bean。我的代码有什么问题?

【问题讨论】:

  • 您是否在title 属性&lt;mds:mainMenu ... title="Главное меню"&gt;&lt;/mds:mainMenu&gt; 之后忘记了&gt; 或者是拼写错误?

标签: jsf ejb jsf-2.2


【解决方案1】:

对象值 = menuComponent.getValueExpression("items").getValue(context.getELContext());

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2015-12-02
    • 2017-02-07
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多