覆盖 Primefaces 渲染器
Override Primefaces Renderer
我正在使用 Primefaces 和 JSF 2.2 开发动态菜单。
问题是它没有插入菜单 ID。查看 primefaces 的代码,它命中了一个永远为假的代码:
基础菜单渲染器:
protected boolean shouldRenderId(MenuElement element) {
if(element instanceof UIComponent)
return shouldWriteId((UIComponent) element);
else
return false;
}
分层菜单渲染器:
writer.startElement("li", null);
if(shouldRenderId(submenu)) {
writer.writeAttribute("id", submenu.getClientId(), null);
}
所以,我决定重写 primefaces 的 TieredMenuRenderer,但是我的重写构造函数 classe 被调用但重写方法从未被调用。
这是我设置 facesconfig.xml
的方式
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.TieredMenuRenderer</renderer-type>
<renderer-class>ui.jsf.TieredMenuRenderer</renderer-class>
</renderer>
</render-kit>
我的覆盖 class:
public class TieredMenuRenderer extends org.primefaces.component.tieredmenu.TieredMenuRenderer {
@Override
protected void encodeElements(FacesContext context, AbstractMenu menu, List<MenuElement> elements) throws IOException {
System.out.println("----------- TEST --------------");
super.encodeElements(context, menu, elements);
}
Sysout 从不打印。
有谁知道我做错了什么?
谢谢!
编辑:
将 ID 添加到 DefaultMenuItem:
DefaultMenuItem item = new DefaultMenuItem();
item.setId(menuItem.getMenuId());// just return a string value.
添加菜单 xhtml,"menucontroller.model" 是一个 primefaces MenuModel,我使用 DefaultMenuModel :
遍历渲染器套件,当我执行以下命令时,returns 正确的渲染器类型 org.primefaces.component.TieredMenuRenderer
Iterator<String> renderKit = kit.getRendererTypes("org.primefaces.component");
当我执行下面的代码时 returns 我的限定 classname ui.jsf.TieredMenuRenderer@64baec0e
:
Renderer renderer = kit.getRenderer("org.primefaces.component", "org.primefaces.component.TieredMenuRenderer");
首先,我的渲染器没有覆盖正确的渲染器。当我应该覆盖 org.primefaces.component.MenubarRenderer
时,我覆盖了 org.primefaces.component.tieredmenu.TieredMenuRenderer
。
然后,为了更正 primefaces id 问题,我在渲染的 class 中执行了以下操作:
@Override
protected boolean shouldRenderId(MenuElement element) {
return true;
}
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
AbstractMenu menu = (AbstractMenu) component;
encodeMarkup(context, menu);
encodeScript(context, menu);
}
EncodedEnd 正在从覆盖我 ID 的 primefaces 调用 "generateIds()"。
完全呈现 class:
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.primefaces.component.menu.AbstractMenu;
import org.primefaces.model.menu.MenuElement;
public class MenuRenderer extends org.primefaces.component.menubar.MenubarRenderer {
@Override
protected boolean shouldRenderId(MenuElement element) {
return true;
}
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
AbstractMenu menu = (AbstractMenu) component;
encodeMarkup(context, menu);
encodeScript(context, menu);
}
}
我正在使用 Primefaces 和 JSF 2.2 开发动态菜单。
问题是它没有插入菜单 ID。查看 primefaces 的代码,它命中了一个永远为假的代码:
基础菜单渲染器:
protected boolean shouldRenderId(MenuElement element) {
if(element instanceof UIComponent)
return shouldWriteId((UIComponent) element);
else
return false;
}
分层菜单渲染器:
writer.startElement("li", null);
if(shouldRenderId(submenu)) {
writer.writeAttribute("id", submenu.getClientId(), null);
}
所以,我决定重写 primefaces 的 TieredMenuRenderer,但是我的重写构造函数 classe 被调用但重写方法从未被调用。
这是我设置 facesconfig.xml
的方式<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.TieredMenuRenderer</renderer-type>
<renderer-class>ui.jsf.TieredMenuRenderer</renderer-class>
</renderer>
</render-kit>
我的覆盖 class:
public class TieredMenuRenderer extends org.primefaces.component.tieredmenu.TieredMenuRenderer {
@Override
protected void encodeElements(FacesContext context, AbstractMenu menu, List<MenuElement> elements) throws IOException {
System.out.println("----------- TEST --------------");
super.encodeElements(context, menu, elements);
}
Sysout 从不打印。
有谁知道我做错了什么?
谢谢!
编辑:
将 ID 添加到 DefaultMenuItem:
DefaultMenuItem item = new DefaultMenuItem();
item.setId(menuItem.getMenuId());// just return a string value.
添加菜单 xhtml,"menucontroller.model" 是一个 primefaces MenuModel,我使用 DefaultMenuModel :
遍历渲染器套件,当我执行以下命令时,returns 正确的渲染器类型 org.primefaces.component.TieredMenuRenderer
Iterator<String> renderKit = kit.getRendererTypes("org.primefaces.component");
当我执行下面的代码时 returns 我的限定 classname ui.jsf.TieredMenuRenderer@64baec0e
:
Renderer renderer = kit.getRenderer("org.primefaces.component", "org.primefaces.component.TieredMenuRenderer");
首先,我的渲染器没有覆盖正确的渲染器。当我应该覆盖 org.primefaces.component.MenubarRenderer
时,我覆盖了 org.primefaces.component.tieredmenu.TieredMenuRenderer
。
然后,为了更正 primefaces id 问题,我在渲染的 class 中执行了以下操作:
@Override
protected boolean shouldRenderId(MenuElement element) {
return true;
}
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
AbstractMenu menu = (AbstractMenu) component;
encodeMarkup(context, menu);
encodeScript(context, menu);
}
EncodedEnd 正在从覆盖我 ID 的 primefaces 调用 "generateIds()"。
完全呈现 class:
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.primefaces.component.menu.AbstractMenu;
import org.primefaces.model.menu.MenuElement;
public class MenuRenderer extends org.primefaces.component.menubar.MenubarRenderer {
@Override
protected boolean shouldRenderId(MenuElement element) {
return true;
}
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
AbstractMenu menu = (AbstractMenu) component;
encodeMarkup(context, menu);
encodeScript(context, menu);
}
}