0

リンクが欲しいのですが、ユーザーがリンクをクリックすると、次のようになります。

  • キーをセッションに保存する
  • 別のJSFページで新しいウィンドウを開く
  • 現在のページをリロードしないでください

問題を解決する方法がわかりません。
キーを保存して新しいウィンドウを開くと、キーは空です。
キーを保存するプロセスが遅すぎるのではないでしょうか。
そして、ページがリロードされないようにする方法は?

これは私の現在のコードです:

JavaScript

function openWin2(url)
{
     var w = 800;
     var h = window.innerHeight - 100;
     var left = ((screen.width-w)/2);
     var top = ((screen.height-h)/2);
     window.open(url, 'Tax', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
}

xhtml

<ui:repeat value="#{main.list}" var="items">
    <h:commandLink action="#{main.setClickedId(items.itemId)}">
        <table onclick="openWin2('immobilie.xhtml')"><tr><td>Hello</td></tr></table>
    </h:commandLink>
</ui:repeat>

ManagedBean
保存

public void setClickedId(String clickedId) {
    this.clickedId = clickedId;

    FacesContext context = FacesContext.getCurrentInstance();
    Map<String, Object> map = context.getExternalContext().getSessionMap();
    if(map.containsKey("id")){map.remove("id");}
    map.put("id", clickedId);
}

ロード

FacesContext context = FacesContext.getCurrentInstance();
immoId = context.getExternalContext().getSessionMap().get("id").toString();
4

3 に答える 3

0

タグを使用することをお勧めしa4j:ajaxます(RichFacesで入手可能、ドキュメントはこちら)。次に、xhtmlのマークアップは次のようになります。

<h:commandLink action="#{main.setClickedId(items.itemId)}">
    <table><tr><td>Hello</td></tr></table>
    <a4j:ajax oncomplete="openWin2('immobilie.xhtml')" />
</h:commandLink>

このコードはAJAXリクエストをサーバーに送信し、サーバーはメソッドを実行setClickedIdし、レスポンスがブラウザに戻ると、関数openWin2が呼び出されます。

于 2013-02-02T11:53:36.250 に答える
0

キーを保存して新しいウィンドウを開くと、キーは空です。キーを保存するプロセスが遅すぎるのではないでしょうか。

ここでの問題は、JavaScriptとサーバー側のメソッドが異なる場所で実行されることです。

  • JavaScriptコードはクライアントブラウザで実行されます。これは、PCでローカルにコードを実行するようなものです。

  • サーバー側のコードはサーバー上で実行されます。ブラウザはサーバーに対してリクエストを実行する必要があります。サーバーはそのジョブを実行し、ので定義されたメソッドを実行してから、ブラウザに応答を返しactionます。<h:commandLink>ブラウザが応答を処理します。注:これは非常に基本的な説明です。JSFリクエストの詳細については、JSFライフサイクルとカスタムコンポーネントを参照してください。

これを知っているのは、メソッドの実行が遅すぎるということではなく、別の時間に実行されます。

そして、ページがリロードされないようにする方法は?

つまり、完全なリクエストではなく、サーバーに対してajaxリクエストを実行する必要があります。これを実現するために、JSF 2は<f:ajax>、単純なリクエストをajaxリクエストに変換する機能を提供し、ブラウザーはページの更新を行いません。

解決策は2段階のプロセスである必要があります。

  1. サーバーアクションを実行して、セッション内のデータをajaxリクエストとして保存します。

  2. ajaxリクエストが処理されたら、JavaScriptを使用してウィンドウを開く必要があります。

<f:ajax>コンポーネントは本来javascriptメソッドを提供していませんが、oncompleteメソッドの能力を使用してonevent、ajaxリクエストの完了後にjavascriptコードを実行できます。この例は、JSF 2.0 javascript onload/oncompleteに基づいています。

<h:commandLink action="#{main.setClickedId(items.itemId)}" value="Hello">
    <f:ajax onevent="handleOnComplete" />
</h:commandLink>

<h:outputScript>
    function handleOnComplete(e) {
        if (e.status == 'success') {
            openWin2();
        }
    }
</h:outputScript>

<a4j:commandLink>これを行う別の方法は、RichFacesや<p:commandLink>PrimeFacesなどのサードパーティライブラリを使用することです。PrimeFacesコードを使用してサンプルを投稿します。

<p:commandLink action="#{main.setClickedId(items.itemId)}" value="Hello"
    oncomplete="openWin2()" />
于 2013-02-02T19:16:17.720 に答える
0

私は自分で失敗を見つけました。
問題は、JSFページがJSFタグを解析しなかったことです。
から:

<h:outputText value="#{items.itemId" />

出力として何も得られませんでした。
そのため、JSFページがメソッドの呼び出しに失敗したと思いました。
しかし、これは問題ではありませんでした。問題は私のURLでした。これが2ページ目を開くための私のコードです。

openWin2('immobilie.xhtml')

しかし、それは間違っています。それはする必要があります

openWin2('faces/immobilie.xhtml')

私はここから解決策を得ました。


Luiggi Mendozaは私を助けてくれて本当にありがとう!あなたは私をとても助けてくれました!


于 2013-02-05T21:14:50.220 に答える