我有一个运行在tomcat 8上的primefaces Web应用程序。在其中META-INF/context.xml定义了以下内容:
META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?> <Context antiJARLocking="true" path="/syslac"/>
在我的xhtml页面中,我有以下片段代码,其中p:commandButton具有oncomplete标记,它将执行handleLoginRequest函数。
<h:form> <h:panelGrid columns="2" cellpadding="5"> <h:outputLabel for="username" value="Usuario:" /> <p:inputText value="#{loginBean.usuarioVendedor.usuarioSistema}" id="username" required="true" label="username" /> <h:outputLabel for="password" value="Contrasena:" /> <h:inputSecret value="#{loginBean.usuarioVendedor.clave}" id="password" required="true" label="password" /> <f:facet name="footer"> <p:commandButton value="Ingresar" update=":growl" actionListener="#{loginBean.loguearse}" oncomplete="handleLoginRequest(xhr, status, args)" /> </f:facet> </h:panelGrid> </h:form>
剧本:
<script type="text/javascript">function handleLoginRequest(xhr, status, args) { if (args.validationFailed || !args.loggedIn) { jQuery('#dialog').effect("shake", {times: 2}, 100); } else { dlg.hide(); jQuery('#loginLink').fadeOut(); window.location = args.view; } } </script>
但是我无法META-INF/context.xml通过logginBean 检索上下文路径,因此无法发送导航中window.location要使用的视图arg:/syslac/page.xhtmlsyslac是应用程序的上下文路径。
/syslac/page.xhtml
上下文路径在可用的支持bean中ExternalContext#getRequestContextPath()。
ExternalContext#getRequestContextPath()
String contextPath = FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath();
因此,您可以例如:
String loginURI = contextPath + "/login.xhtml"; // ...
注意,当用作JSF导航结果时,这是完全不必要的。有关正确的方法,请参见底部的第二个“另请参阅”链接。
上下文路径在EL by中可用HttpServletRequest#getContextPath()。
HttpServletRequest#getContextPath()
#{request.contextPath}
<h:outputScript> // ... window.location = "#{request.contextPath}" + args.view; </h:outputScript>
或当脚本位于.js文件中时(正确的做法!):
.js
<html lang="en" data-baseuri="#{request.contextPath}"> window.location = document.documentElement.dataset.baseuri + args.view;