3

特定の時点で外部ページを新しいタブで開き、最初のページをアクティブのままにする必要があるjsfアプリケーションで作業しています。ボタンを 1 回クリックするだけで、アプリケーションを実行する方法を見つける必要があります。

  1. 新しいタブでの外部 URL へのリダイレクト
  2. 元のページのボタン自体を無効にするアクション

を使用してみました<outputLink />が、アクション属性がありません。を使用してみました<commandLink />が、外部にリダイレクトできません。また、バッキング Bean でコード化された<commandLink />withとリダイレクトも試しました。target="_blank"

<h:commandLink onclick="submit();" target="_blank" action="#{myBean.execute}" disabled="#{myBean.linkDisabled}" value="external link" />

そして、バッキング Bean で:

public String execute() {
    linkDisabled = true;

    try{
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        externalContext.redirect(Constants.EXTERNAL_URL);
    } catch(Exception e){
        throw new FacesException("Redirection failed");
    }

    return THIS_PAGE;
}

ページが新しいタブで開かれますが、それは URL のあるページではなく現在のページでConstants.EXTERNAL_URLあり、ボタンはまだ有効になっています。エラーメッセージは表示されません。なにか提案を?

前もってありがとう、アンドレア

4

2 に答える 2

12

あなたの質問は紛らわしいです。「リンク」と「ボタン」を混同しています。応答は現在のブラウザー ウィンドウ/タブではなく、別のブラウザー ウィンドウ/タブに返されるため、基本的に JavaScript によってクライアント側の要素を無効にする必要があります。JavaScript では、ボタンを無効にするのは簡単ですが、リンクを無効にすることはできません。簡単にするために、私はあなたが意味し、a<h:commandButton>を使用でき、これが現在のフォームの唯一のボタンであると仮定します。

問題を解決するには、削除する必要がありonclick="submit()"(デフォルトの動作を妨げているため)、ナビゲーションの結果を削除する必要があります (重要ではありませんが、一部の JSF 実装ではわかりません)。JS でボタンを無効にする必要がありますクライアント側。

すべてのコードは次のようになります。

<h:form target="_blank">
    <h:commandButton
        value="external" 
        action="#{myBean.execute}" 
        onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);" />
</h:form>

public void execute() throws IOException {
    FacesContext.getCurrentInstance().getExternalContext().redirect(Constants.EXTERNAL_URL);
}

これsetTimeout()が必要なのは、フォーム データが送信される前にボタンが無効化され、ボタン自体の name=value ペアがリクエスト パラメータとして送信されず、JSF がアクションを呼び出さないためです。

于 2012-04-17T12:06:47.080 に答える
0

action="someaction" を使用して、faces-config.xml にマップして別のページに移動しないのはなぜですか?

于 2012-04-17T10:00:47.207 に答える