1

ユーザーが外部リンクにデータを送信できるJSFページがあります。ただし、その前に、バッキング Bean からローカル アクションを呼び出す必要があります。どのような方法でこれを達成できますか?

これは私のフォームの例です (外部リンク アクションのためにバニラ HTML を使用しています):

<form method="POST" action="https://EXTERNAL-LINK.com/">
    <input type="hidden" ... />
    <button>Submit</button>
</form>

要するに、これは私の場合です:

  1. ボタンを押してフォームを送信する
  2. Bean からのローカル メソッドの呼び出し
  3. フォームを外部リンクに送信する

これを達成する方法についてのアイデアはありますか?

4

2 に答える 2

2

最初に舞台裏で AJAX を介して JSF フォームを送信し、応答が到着したら、プレーンな HTML フォームを外部 URL に送信します。

例:

<script type="text/javascript">
    function jsf(data) {
        if(data.status == 'success') {
            document.getElementById('plain-submit').click();
        }
    }
    function normal() {
        document.getElementById('jsf-submit').click();
    }
</script>
...
<h:form prependId="false">
    ...
    <h:commandButton id="jsf-submit" action="#{bean.action} value="Submit" style="display:none">
        <f:ajax execute="@form" ... onevent="jsf"/>
    </h:commandButton>
</h:form>
<form method="POST" action="https://EXTERNAL-LINK.com/">
    ...
    <input id="button-submit" type="button" onclick="normal()" ...>Submit</input>
    <input id="plain-submit" type="submit" style="display:none">Submit</input>
</form>

または、プレーンな HTML フォームを非表示にして、JavaScript 操作の数を減らすことで状況を逆転させることはさらに簡単です。(表示されている) JSF フォームを AJAX 経由で送信し、応答が正常に戻ってきたら (非表示の) プレーンな HTML フォームを送信します。

于 2013-07-15T14:46:09.387 に答える
2

<form>to<h:form>およびその他の HTML コンポーネントを JSF コンポーネントに変更し、それらの値をマネージド Bean にバインドして、ユーザーがデータを送信できるようにします。次に、メソッドでデータを評価し、 Apache HttpClientactionなどのライブラリを使用して、必要な URL に POST 要求を送信します。

これは、これの生の例かもしれません(あなたの例に基づいて)。

JSF コード

<h:form >
    <h:inputHidden value="#{bean.aField}" />
    <h:commandButton value="Submit" action="#{bean.anAction}" />
</h:form>

マネージド Bean コード

@ManagedBean
@RequestScoped
public class Bean {
    private String aField;
    //constructor, getter and setter...
    public void anAction() {
        //do your form processing...
        HttpRequestHandler httpRequestHandler = new HttpRequestHandler();
        httpRequestHandler.handlePost(...); //send the arguments here
    }
}

public class HttpRequestHandler {
    public void handlePost(String ... parameters) {
        //you do the Apache HttpClient POST handling here
        //always create a class between your application and your third party libraries
        //code adapted from HttpClient examples: http://hc.apache.org/httpcomponents-client-ga/examples.html
        HttpClient httpclient = new DefaultHttpClient();
        try {
            HttpPost httpPost = new HttpPost(...);// your URL goes here
            //do as you please with the HttpPost request

        } finally {
            httpclient.getConnectionManager().shutdown();
        }
    }
}

このジョブに Apache HttpClient ライブラリを追加したくない場合は、次のようURLConnectionにネイティブ Java クラスを使用できます: Java.net.URLConnection を使用して HTTP 要求を起動および処理する

于 2013-07-15T14:46:48.427 に答える