首页 > 解决方案 > 如何在 PrimeFaces 7.0 上获取 applicationContext 或 context-root 名称

问题描述

我正在尝试获取在 jboss-web.xml 文件中定义的 web 应用程序的 applicationContext:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <context-root>/Tesoreria-WEB</context-root>
    <max-active-sessions>300</max-active-sessions>
</jboss-web>

有没有办法获得 String Tesoreria-WEB?我需要它,因为从 3.5 升级到 7.0 后,我的菜单不再添加 URL 的那部分,所以我会在创建之前获取该上下文并添加它。我曾尝试过:

    System.out.println("Application name: "+ PrimeRequestContext.getCurrentInstance(FacesContext.getCurrentInstance()).getApplicationContext());

但没有成功,有没有办法或者我应该手动添加它?谢谢!

顺便说一句,我认为他们在从 3.5 升级到 7.0 后停止正确添加 url,因为https://github.com/primefaces/primefaces/wiki/Migration-Guide从 6.2 到 7.0 的重大更改说“按钮/链接/菜单项: url/href 属性不再由 contextPath 自动添加。使用结果属性在同一应用程序中引用 JSF 视图或手动添加 url/href 与 #{request.contextPath}。请参阅https://github.com/primefaces /primefaces/issues/3506。” 但我不明白这是什么意思。

我希望如何构建我的网址(请注意网址上的 Tesoreria-WEB): http ://10.13.44.48:8483/Tesoreria-WEB/XHTML/boxes/boxesMassive.xhtml

自从我升级到 7.0 后它们是如何构建的(这带来了 404): http://10.13.44.48:8483/XHTML/boxes/ boxesMassive.xhtml

我在 ManagedBean 和 xhtml 上动态创建了我的 menuBar,我这样调用它,这一切都没有 menuItems 没有类似的东西都是在 ManagedBean 上制作的:

<p:menubar id="menuBar" binding="#{menuMB.menuBar}"
                    autoDisplay="false" styleClass="cds-menu-mainmenu"
                    rendered="#{plantillaGeneralMB.habilitarMenu}" />

这就是我们动态制作菜单的方式,在调试时我找到了他们获取 url 的确切位置,它有点向下,我用英语评论了 where:

此 Node 对象来自 org.w3c.dom.Node

private List<SubMenuItem> cargarSubmenus(Node pNodeMenu,
            List<String[]> lJerarquiaTemp, String[] tituloPadre) {

        Node nodeSubMenu = null;
        // Obtener la lista de hijos de este nodo.
        NodeList childNodes = pNodeMenu.getChildNodes();

        int sizeList = childNodes.getLength();
        List<SubMenuItem> lSubmenus = new ArrayList<>();
        SubMenuItem subMenu = null;
        lJerarquiaTemp.add(tituloPadre);

        for (int i = 0; i < sizeList; i++) {

            // Obtener el hijo de este nodo correspondiente al indice indicado.
            nodeSubMenu = childNodes.item(i);

            // Verificar que efectivamente este nodo sea un Submenu
            if (nodeSubMenu.getNodeName().equals("SUBMENU")) {

                // Verificar que el nodo tenga atributos.
                if (nodeSubMenu.hasAttributes()) {

                    NamedNodeMap map = nodeSubMenu.getAttributes();
                    // Obtener codigo.
                    Node codigo = map.item(0);
                    // Obtener titulo
                    String titulo = nodeSubMenu.getChildNodes().item(1)
                            .getTextContent();
                    // THIS IS THE URL **********************
                    String url = nodeSubMenu.getChildNodes().item(3)
                                .getTextContent();
// Im having to add "/Tesoreria-WEB" + url to make my urls well constructed, no idea what changed so much from 3.5 to 7.0 here if someone knows how to make it work without adding this manually its appreciated
                    subMenu = new SubMenuItem(codigo.getTextContent(), titulo,
                            "/Tesoreria-WEB"+url);




                    System.out.println("Application name: "+ PrimeRequestContext.getCurrentInstance(FacesContext.getCurrentInstance()).getApplicationContext());


                    subMenu.setlJerarquia(lJerarquiaTemp);
                    String[] menuInfo = { codigo.getTextContent(), titulo, url };
                    // Si esta nodo tiene mas hijos llamar recursivamente este
                    // metodo.

                    if (nodeSubMenu.getChildNodes().item(5) != null
                            && nodeSubMenu.getChildNodes().item(5)
                                    .getNodeName().equals("SUBMENU")) {
                        subMenu.setlSubmenus(cargarSubmenus(nodeSubMenu,
                                subMenu.getlJerarquia(), menuInfo));
                    }

                    if (nodeSubMenu.getChildNodes().item(5) != null
                            && nodeSubMenu.getChildNodes().item(5)
                                    .getNodeName().equals("TABS")) {
                        subMenu.setlTabs(cargarTabs(nodeSubMenu.getChildNodes()
                                .item(5)));
                    }

                    // Adicionar este submenu y sus hijos a la lista de submenus
                    // del nodo original.
                    lSubmenus.add(subMenu);

                }
            }
        }

        return lSubmenus;

    }

标签: jsfprimefaces

解决方案


是的,他们的意思是这样做......

<p:menuitem value="my URL" url="#{request.contextPath}/boxes/boxesMassive.xhtml" />

推荐阅读