1

我正在尝试在 JSF 中为我的 Web 应用程序编写导航。

到目前为止,我有这个:

<ul>
<ui:repeat value="#{pageBean.getPages()}" var="page">
   <li class="#{(pageContext.request.requestURI.endsWith(page.url)) ? 'current_page_item' : '' }">
       <a href="#{pageContext.servletContext.getRealPath(page.url)}">#{page.name}</a>
   </li>
</ui:repeat>
</ul>

但是锚的 href 属性总是空的。另外我不确定是否pageContext.request.requestURI.endsWith(page.url)可以正常工作-我猜不是,因为没有页面具有 current_page_item 类。

我究竟做错了什么?

谢谢!

4

2 回答 2

5

getRealPath()确实没有做你认为它做的事情。阅读它的javadoc

但这种方法不必要地过于复杂。<h:link>如果将 JSF组件与视图 ID 列表结合使用,则不需要自己生成绝对路径。将<h:link>自动添加正确的上下文路径(如果有)。

<ul>
    <ui:repeat value="#{pageBean.pages}" var="page">
        <li class="#{view.viewId == page.viewId ? 'current_page_item' : ''}">
            <h:link value="#{page.name}" outcome="#{page.viewId}" />
        </li>
    </ui:repeat>
</ul>

视图 ID 正是 JSF 用来定位视图和处理导航的页面标识符。视图 ID 是视图文件的相对于 Web 内容的路径,例如/foo/index.xhtml.

请注意,#{view}上面示例中的 EL 是一个隐式 EL 变量,指向 current UIViewRoot,因此您不需要自己创建/准备它。

于 2012-04-22T20:40:47.907 回答
2

这是对做什么的误解getRealPath。这会将表单的 URL 转换为http://<host>:<port>/<contextPath>/index.html类似C:\foo\bar\index.html. 远程系统对这些信息没有用处。对于与文件不对应的资源,该方法返回 null。该方法大多无用,应用程序应避免使用它。

于 2012-04-22T19:51:05.160 回答