1

特定のコーディングソリューションよりもアドバイスを求めていると思います。シナリオは次のとおりです。

  • 新しいユーザーを作成できるフォームがあります
  • このフォームには、Springコントローラーを介したGETリクエストを介してアクセスします

    @RequestMapping(value = "/secure/clients", method = RequestMethod.GET)
    public String prepareNewClient(final Principal principal, final ModelMap map) {
        map.addAttribute("client", new Client());
        return "secure/clients";
    }
    
  • フォームが表示され、すべて正常に機能し、次を使用して新しいクライアントを送信します$.ajax({})

  • 送信により、コントローラー上の次のメソッドへの同じURLを使用してPOSTリクエストがトリガーされます

    @RequestMapping(value = "/secure/clients", method = RequestMethod.POST)
    public @ResponseBody JsonResponse saveClient(
        @ModelAttribute("client") final Client client,
        final BindingResult result,
        final Principal principal,
        final ModelMap map) {
    
        // validate input
        // save client
        // prepare JsonResponse object
    
        return jsonResponse;
    }
    

完了後、ユーザーを同じ画面に表示し、フォームでPOSTではなくPUTをトリガーするようにします。これは問題ありません。jQueryでそれを実現できますが、フォームを再度送信するとすぐに、クライアントはもう存在しModelMapません。

保存したクライアントをModelMapPOSTメソッドに追加しようとしましたが、それでも機能しませんでした。

私はそれを正しい方法でやっているかどうか完全にはわかりません。正直なところ、私が見たすべてのチュートリアルは、多かれ少なかれ私が行っていることを使用していますが、 PUT要求を持っているものはありません-ほとんどの場合、オブジェクトの作成を扱っていますが、問題はありません。

私が念頭に置いているのは、コントローラーメソッドをとにマッピングし、別のコントローラーメソッドをとマッピングする必要があるかもしれない/secure/clients/{clientId}というHTTP.GETこと/secure/clients/{clientId}ですHTTP.PUT

しかし、それが理にかなっているかどうかはわかりませんので、少し迷っています。

  • コントローラを完全にJSON呼び出しで作成する必要がありますか?
  • このシナリオでは、ユーザーをリダイレクトしてAJAX呼び出しを忘れる必要がありますか?

提案は大歓迎です。ありがとうございました!

4

3 に答える 3

2

HttpMethodは、Webブラウザでは完全にはサポートされていません。PUT requesrは、2つのアプリケーションがRestfull APIで動作している場合にうまく機能しますが、ブラウザーの互換性のために、POSTまたはGETリクエストに制限することをお勧めします。

フォームにオーバーライドパラメータを設定して、投稿を目的のメソッドとして処理するようにWebサーバーに指示することもできます。

<input type="hidden" name="_method" value="put"/>仕事をします。

Spring sf名前空間は、その隠しフィールドを処理します。

<sf:form method="put">
....
</sf:form>

さらに、restclient-uiを使用してコントローラーをテストし、問題がWebサーバーまたはクライアントにあるかどうかを確認できます。

于 2012-05-12T07:08:27.243 に答える
1

@Danielに同意します。

ただし、Springで利用可能なHiddenHttpMethodFilterを使用できます。それはあなたの仕事を簡単にするはずです。毎回隠しファイルを置く必要がなくなります。

お役に立てば幸いです。乾杯。

于 2012-05-12T09:10:43.033 に答える
0

@Danielと@Japanはご回答ありがとうございます。

私はあなたが@Danielと言ったことを理解しました、そして私は箱から出て、違った考え方をすることになりました-そしてそれはうまくいきました。

あなたにアイデアを与えるためだけに:

  • ページにとどまる代わりに、新しいクライアントが挿入されたときに、実際にブラウザを更新します
  • 関数が呼び出された後、ユーザーは/ secure / clients/{clientId}にリダイレクトされます
  • そこから、新しいPOSTリクエストとともに新しい関数がマップされます

それは私のために働いた。また、Knockout.JSを活用することも大いに役立ちました。

再度、感謝します!

于 2012-05-13T07:41:02.277 に答える