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 変数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 に答える