在子文件夹中创建指向JSF页面的链接

时间:2013-09-18 09:46:24

标签: jsf url path

我有一个Java Web应用程序,其结构如下:

- Project
     - Web Pages
          + WEB-INF
          + resources
          - administration
               systemsettings.xhtml
               userhandling.xhtml
          login.xhtml
          index.xhtml
          menubar.xhtml
          ...
     + Source Packages ...

我最近将administration文件夹添加到Web Pages,然后移动了两个.xhtml页面,以便为管理员授权过滤器编写更具体的网址格式。

但是,我不知道administration文件夹中页面的路径是什么。虽然<a href='index.xhtml'>有效,但<a href='administration/systemsettings.xhtml'>没有,但会抛出java.io.FileNotFoundException

更新

systemsettings.xhtml的内容是:

<h:body>
    <ui:insert name="header" >
        <ui:include src="menubar.xhtml" />
    </ui:insert>
    <div>Administration - System settings</div>
</h:body>

我忘了在重构后更新包含页面的路径。正如@BalusC建议的那样,这可以通过将<ui:include src="menubar.xhtml" />更改为<ui:include src="/menubar.xhtml" />来修复。

1 个答案:

答案 0 :(得分:2)

如果链接不是以http://之类的方案开头,那么它就是相对于当前请求URI的相对链接,正如您在浏览器的地址栏中看到的那样。如果相对链接以/开头,则它相对于请求URI中的域根。如果相对链接不以/开头,那么它相对于请求URI中当前打开的文件夹。

如果您无法确定当前打开的文件夹,那么您需要通过#{request.contextPath}明确预先设置上下文路径来使其成为域相关链接。

<a href="#{request.contextPath}/administration/systemsettings.xhtml">settings</a>

另一种方法是只使用JSF <h:link>组件。它会自动添加上下文路径(并自动应用JSF映射!)。以下<h:link>示例生成了等效的HTML。

<h:link value="settings" outcome="/administration/systemsettings.xhtml" />
<h:link value="settings" outcome="/administration/systemsettings" />