2

ユーザーが URL を入力する状況を実装したいと考えています。マネージド Bean で指定された条件が true の場合、この URL は新しい Web ページで開かれます。

私はこの可能性を見つけました:

「h:link」タグは、「結果」と対話する必要があるリンクを生成するのに役立ちますJSFが、「アクション」のサポートがないため、動的な結果を生成するのが難しくなります。

「h:commandLink」タグがヤバい、生成されるのJavaScriptが本当に怖い!サポートする確固たる理由がない限り、このタグの使用はお勧めしません。ただし、「h:link」に欠けている「アクション」属性をサポートしています。

JSF「h:outputLink」は、プログラム自体と対話する必要のないリンクを生成するのに役立ちます。最後に「h:link」に「action」属性を追加すれば完璧です。

しかし、条件が検証された後、マネージド Bean から開いている Web ページを起動する方法が見つかりませんでした。

JSF2.0、Facelets、および PrimeFaces 3.4 を使用しています。

4

1 に答える 1

8

これらのリンク コンポーネントのいずれかを使用してターゲットを新しいウィンドウで開くには、target="_blank"属性を指定する必要がありますが、これは、リンクをクリックした時点で既に新しいウィンドウでターゲットを開いているため、応答に依存しません。基本的には、応答が到着した瞬間にターゲットを新しいウィンドウで開く必要があります。唯一の方法は、Web ブラウザーで実行されるように、JavaScriptwindow.open()呼び出しを応答に返すことです。

window.open()標準の JSF では、JavaScript を条件付きでレンダリングするだけで済みます。

<h:form>
    <h:inputText value="#{bean.url}" />
    <h:commandButton value="submit" action="#{bean.submit}">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
    <h:outputScript rendered="#{bean.valid}">window.open('#{bean.url}')</h:outputScript>
</h:form>

private String url;
private boolean valid;

public void submit() {
    valid = validate(url);
}

// ...

PrimeFaces ではRequestContext#execute()、応答の完了時に実行する必要がある JavaScript コードを指定するために使用できます。

<h:form>
    <p:inputText value="#{bean.url}" />
    <p:commandButton value="submit" action="#{bean.submit}" />
</h:form>

private String url;

public void submit() {
    if (validate(url)) {
        RequestContext.getCurrentInstance().execute("window.open('" + url + "')");
    }
}

// ...

具体的な問題とは関係ありません:あなたが引用した乱暴なステートメントは、HTTP/HTML の基本 (GET と POST の制限など) について何も知らない人によって書かれているようです。程よい塩加減でお召し上がりください。

于 2012-10-02T11:39:18.807 に答える