如何在JSF中获取绝对URL?

时间:2012-04-22 18:38:08

标签: java jsf javabeans

我正在尝试在JSF中为我的网络应用编写导航。

到目前为止,我有这个:

<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类。

我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:5)

getRealPath()确实不符合你的想法。阅读javadoc

但这种做法不必要地过于复杂。如果将JSF <h:link>组件与视图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是视图文件的webcontent相对路径,例如/foo/index.xhtml

请注意,上例中的#{view}是指向当前UIViewRoot的{​​{3}},因此您无需自行创建/准备。

答案 1 :(得分:2)

这是对getRealPath所做的误解。这会将http://<host>:<port>/<contextPath>/index.html形式的网址翻译为C:\foo\bar\index.html。远程系统无法使用此信息。对于与文件不对应的资源,该方法返回null。该方法大多无用,应用程序应避免使用它。