11

h:outputLink、他の JSF タグ、またはコードを使用して HTML リンクを作成し、リクエスト パラメータを使用して顔以外のリクエスト (HTTP GET) を作成する方法はありますか?

たとえば、次のナビゲーション ルールがあります。

<navigation-rule>
    <navigation-case>
        <from-outcome>showMessage</from-outcome>
        <to-view-id>/showMessage.jsf</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

私のページでは、次のhtmlコードを出力したいと思います:

<a href="/showMessage.jsf?msg=23">click to see the message</a>

ページに html コードを記述することもできますが、ナビゲーション ルールを使用して、すべての URL を 1 つの構成可能なファイルで定義したいと考えています。

4

4 に答える 4

12

これは興味深いアイデアです。それが実際にどのように機能するかを知りたいです。

ナビゲーション ルールの取得

ナビゲーションはNavigationHandlerによって処理されます。NavigationHandler を取得するのは難しくありませんが、API は使用するルールを公開しません。

私が見ているように、次のことができます。

  1. 初期化時にfaces-config.xmlを解析し、ルールをアプリケーションコンテキストに保存します(簡単
  2. faces-config.xml のルールを無視する独自の NavigationHandler を実装するか、独自のルール ファイルでそれらを補足し、そのルールセットを何らかの形で公開します (実行可能ですが、少し手間がかかります) 。
  3. 独自のFacesContextをモックして、既存のナビゲーション ハンドラに渡します ( 2 つの FacesContext オブジェクトを同じスレッドに共存させるのは非常に難しく、非常に非効率的です) 。

さて、あなたにも別の問題があります。ビューを検索するためのマッピングをどこに保持しますか? それらを豆にハードコーディングしますか?

ナビゲーション ルールの使用

余談ですが、バックエンドからパラメーターを含む URL を作成する方法は 2 つあります。どちらも、ある種の Bean を定義する必要があります。

<managed-bean>
    <managed-bean-name>navBean</managed-bean-name>
    <managed-bean-class>foo.NavBean</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

ソース:

package foo;

import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

public class NavBean implements Serializable {

    private String getView() {
        String viewId = "/showMessage.faces"; // or look this up somewhere
        return viewId;
    }

    /**
     * Regular link to page
     */
    public String getUrlLink() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext extContext = context.getExternalContext();
        String viewId = getView();
        String navUrl = context.getExternalContext().encodeActionURL(
                extContext.getRequestContextPath() + viewId);
        return navUrl;
    }

    /**
     * Just some value
     */
    public String getValue() {
        return "" + System.currentTimeMillis();
    }

    /**
     * Invoked by action
     */
    public String invokeRedirect() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext extContext = context.getExternalContext();
        String viewId = getView();
        try {
            String charEncoding = extContext.getRequestCharacterEncoding();
            String name = URLEncoder.encode("foo", charEncoding);
            String value = URLEncoder.encode(getValue(), charEncoding);
            viewId = extContext.getRequestContextPath() + viewId + '?' + name
                    + "=" + value;
            String urlLink = context.getExternalContext().encodeActionURL(
                    viewId);
            extContext.redirect(urlLink);
        } catch (IOException e) {
            extContext.log(getClass().getName() + ".invokeRedirect", e);
        }
        return null;
    }

}

得る

GET リクエストの場合、UIParameters を使用して値を設定し、レンダラーにパラメーター リストを作成させることができます。

<h:outputLink value="#{navBean.urlLink}">
    <f:param name="foo" value="#{navBean.value}" />
    <h:outputText value="get" />
</h:outputLink>

役職

POST アクション中に URL をビューに設定する場合は、(ボタンまたは commandLink によって呼び出される) アクションでリダイレクトを使用して行うことができます。

<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
    <h:outputText value="post" />
</h:commandLink>

ノート

文字列をエンコードするためにExternalContext.encodeActionURLが使用されることに注意してください。これは、コンテキスト (ポートレットなど) 間で移植可能なコードを作成するための優れた方法です。画像またはダウンロード ファイルへのリンクをエンコードする場合は、encodeResourceURLを使用します。

于 2008-09-26T15:00:42.967 に答える
3

PrettyFaces を使ってみましたか?これは、ブックマーク可能な JSF ページ / GET 要求を使用した JSF を可能にするために特別に設計されたオープンソースの JSF 拡張機能です。

PrettyFaces - JSF / JSF2 の SEO、動的パラメータ、ブックマーク、およびナビゲーション

于 2009-11-03T19:18:53.813 に答える
0

フォームを考えたことはありますか?

<h:form>
    <h:commandLink value="Click to see the message" action="#{handler.outcome}" />
    <h:inputHidden id="msgId" value="#{bean.msgId}"/>
</h:form>
于 2008-09-26T13:52:30.540 に答える
0

ネストされた param タグで commandLink を使用できます。これは基本的に、上記の hubbardr と同じです。

<h:form>
  <h:commandLink value="click here" action="${handler.outcome}">
    <f:param name="msgId" value="${bean.id}" />
  </h:commandLink>
</h:form>

次に、バッキング Bean で次のことを行う必要があります。

Map requestMap = FacesContext.getCurrentInstance()
                 .getExternalContext().getRequestParameterMap();
String msgId = (String) requestMap.get("msgId");

そして、あなたがする必要があることは何でもしてください。

于 2008-10-02T18:46:34.073 に答える