如何在 PrimeFaces 7.0 上获取 applicationContext 或上下文根名称
How to get the applicationContext or context-root name on PrimeFaces 7.0
我正在尝试获取在 jboss-web.xml 文件中定义的网络应用程序的 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 breaking changes from 6.2 to 7.0 says "Button/Link/MenuItem: The url/href attribute isn't automatically prepended by contextPath anymore. Use the outcome attribute for referencing JSF views in the same application or manually prepend url/href with #{request.contextPath}. See https://github.com/primefaces/primefaces/issues/3506。”但我不明白那是什么意思。
我希望如何构建我的 url(请注意 url 上的 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,它有点低,我用英语评论了哪里:
此节点对象来自 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;
}
是的,他们的意思是这样做...
<p:menuitem value="my URL" url="#{request.contextPath}/boxes/boxesMassive.xhtml" />
在 JSF 中获取应用程序 context-root 的方法是:
FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath();
有关详细信息,请参阅
我正在尝试获取在 jboss-web.xml 文件中定义的网络应用程序的 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 breaking changes from 6.2 to 7.0 says "Button/Link/MenuItem: The url/href attribute isn't automatically prepended by contextPath anymore. Use the outcome attribute for referencing JSF views in the same application or manually prepend url/href with #{request.contextPath}. See https://github.com/primefaces/primefaces/issues/3506。”但我不明白那是什么意思。
我希望如何构建我的 url(请注意 url 上的 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,它有点低,我用英语评论了哪里:
此节点对象来自 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;
}
是的,他们的意思是这样做...
<p:menuitem value="my URL" url="#{request.contextPath}/boxes/boxesMassive.xhtml" />
在 JSF 中获取应用程序 context-root 的方法是:
FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath();
有关详细信息,请参阅