我正在尝试在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类。
我做错了什么?
谢谢!
答案 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。该方法大多无用,应用程序应避免使用它。