1

JSF 2 で Bean から JavaScript を条件付きで呼び出すにはどうすればよいですか?

ユーザーファイルを特定のフォルダーにアップロードする PrimeFaces を使用するクラスがありますが、ユーザーが既に存在するファイルと同じ名前のファイルをアップロードしようとすると、この場合は JavaScript が画面上のボックスを開く必要があります古いファイルを上書きするか、操作をキャンセルするかをユーザーに尋ねます。その名前のファイルが存在しない場合、JavaScript は呼び出されません。

フォルダーに特定のファイルが含まれていることをテストする方法は知っていますが、条件付きで JavaScript を呼び出す方法を知る必要があるだけです。

これに関するアドバイスをいただければ幸いです。


さまざまなリソースをオンラインで調べましたが、アプリケーションを正しく動作させることができません。基本的に、これは私が行ったことです。含まれているxhtmlページには、ファイルアップロード用の次のコードがあります。

<p:fileUpload id="fileUpload" fileUploadListener="#{filters.upload}"
   allowTypes="#{filters.uploadTypes}" invalidFileMessage="#{filters.uploadBadType}"
   sizeLimit="#{filters.uploadSize}" invalidSizeMessag="#{filters.uploadBadSize}"
   update="fileUpload fileTable uploadMessage" description="Select Text File"
   disabled="#{filters.disableFileUploadButton}"/>

<!--- Then further in the same file is this: -->

<p:remoteCommand name="remoteCommandOverwrite" actionListender="#{filters.execOverwrite}"/>

上記を含む親 xhtml ページには、愚かな JavaScript があります。

<script type="text/javascript">
  function popupConfirm() {
    var overwrite = confirm('Warning: This will overwrite the existing file - Do you confirm this?');
    if (overwrite) remoteCommandOverwrite([{name: overwrite, value: true}]);
  }
</script>

私の Bean には、3 つのメソッドで次のコードがあります。

    public void upload(FileUploadEvent event) {
    FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded.");  
    FacesContext.getCurrentInstance().addMessage(null, msg);
    overwrite = false;
    // Do what you want with the file        
    try {
        copyFile(event.getFile().getFileName(), event.getFile().getInputstream());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

    public void copyFile(String fileName, InputStream in) {

     // Initialization etc.

                    File file = new File(uploadFull + fileName);
        if (file.exists()) {
            RequestContext.getCurrentInstance().execute("popupConfirm()");

// Then test to see if overwrite is true or false, and act accordingly

}

// Then I am supposed to get the value of overwrite here:
public void execOverwrite() {
    System.out.println("### execOverwrite() ###");
    FacesContext context = FacesContext.getCurrentInstance();
    Map<String, String> map = context.getExternalContext().getRequestParameterMap();
    String soverwrite = (String) map.get("overwrite");
    if (soverwrite.equals("true")) {
        overwrite = true;
        System.out.println("overwrite: true");
    }
}

私がやろうとしているのは、最初に JavaScript 関数 popupConfirm() を条件付きで呼び出すことです。条件が true の場合に呼び出される [アップロード] ボタンをクリックすると、これが必要になります。これは次に呼び出すことになっています

これは機能し、confirm() ボックスが表示されますが、呼び出されないため、Bean のメソッド execOverwrite() も呼び出されず、戻り値を取得してメソッド内のコードに渡すことができません copyFile( )。何がうまくいかないのですか?


私はこの問題を約 1 週間後回しにして、やっと戻ってきました。私はそれを機能させ、値を Bean に戻すことができましたが、どういうわけか JavaScript が呼び出された場所から実行を再開する必要があります。

要約すると、私の JavaScript には次のコードが含まれています。

<script type="text/javascript">
  function popupConfirm() {
    var overwrite = confirm('Warning: This will overwrite the existing file - Do you confirm this?');
    if (overwrite) remoteCommandOverwrite([{name: 'overwrite', value: 'true'}]);
  }
 </script>

そして、私が持っているxhtmlコードで:

<p:fileUpload id="fileUpload" fileUploadListener="#{filters.upload}" ...../>

<!-- Other code -->

<p:remoteCommand name="remoteCommandOverwrite" actionListener="#{filters.execOverwrite}"/>

次に、ファイルの選択ボタンをクリックした後にファイルのアップロード ボタンをクリックすると、上記の JavaScript のコードが実行されます。

RequestContext.getCurrentInstance().execute("popupConfirm()");

次に、ダイアログ ボックスで [OK] をクリックすると、同じ Bean 内の次のメソッドが呼び出されます。

public void execOverwrite() {
    FacesContext context = FacesContext.getCurrentInstance();
    Map<String, String> map = context.getExternalContext().getRequestParameterMap();
    String soverwrite = map.get("overwrite");
    if (soverwrite.equals("true")) {
        overwrite = true;       }
    }
}

フラグ「上書き」が最終的にテストされ、それが真であるかどうかが確認されます。

さまざまな印刷ステートメントを使用して、これが機能することを確認します。ただし、次のステートメントに遭遇した後、コードは実行を再開しません。 RequestContext.getCurrentInstance().execute("popupConfirm()"); ダイアログに「OK」または「キャンセル」を入力するかどうかに関係なく、これは私がやりたいことです。何らかのタイプのコールバックが必要であるかのように見えますが、いくつかのアイデアを歓迎します。

4

1 に答える 1

2

タグによると、PrimeFaces を使用しているため、ブラウザがサーバー応答の処理を完了したときに、サーバー側のイベント マネージド Bean メソッドから JavaScript 関数を呼び出す簡単な方法があります。PrimeFaces は、 というユーティリティ クラスを提供しますRequestContext

public void doActionListenerMethod() {
  if (!isValid()) {
    RequestContext.getCurrentInstance().execute("MyJSObject.doClientSideStuff()");
  }
}

以下は、JSF がクライアントでのレンダリングを終了したときに、文字列引数を Javascript として実行します。

于 2013-03-07T19:39:41.323 に答える