1

Spring MVC アノテーション駆動型プロジェクトがあり、うまく機能しています。この時点で、私のフォームの多くは小さく、Ajax リクエストを使用してそれらを処理する傾向がありました。私はこのプラグインを使用しています: http://jquery.malsup.com/form/ Ajax リクエストを処理し、それもうまく機能しています。しかし、私は問題に遭遇しました。Jackson を使用して @ResponseBody アイテムを json にシリアル化しています。うまく機能しましたが、ファイルをアップロードする必要がある最初のフォームに遭遇しました。AjaxForm は、iframe 送信トリックを使用して古いブラウザーでこれを処理しますが、応答を<textarea></textarea>すべての情報が確実に届くようにするためです。私は狂ったように見回しており、オブジェクトのカスタムシリアライザーを作成できることがわかりましたが、リクエストタイプがそうであるかどうかを確認してから、レスポンスをタグXHRで囲む方法を考えられません。<textarea></textarea>何か案は?

これが私のコードの一部です:

    public @ResponseBody
    JsonResponse setReferenceNumber(@ModelAttribute("referenceNumber") 
    @Valid ReferenceNumberBean referenceNumber, 
    BindingResult result, 
    HttpServletResponse response)
    {
      //Do some stuff
      //Theoretically here I would call upon some logic to surround the response?
      return jsonResponse;
    }

前もって感謝します!

更新- 具体的にはSpringに新しいインターセプターを追加することで、問題を修正したとほとんど思っていました。

    <mvc:interceptors>
      <bean class="edge.portal.vendor.web.interceptor.MultipartAjaxInterceptor"></bean>
    </mvc:interceptors>

次に、インターセプター テストで X-Requested-with かどうかを確認し、javascript が呼び出しに Ajax のフラグを立てたが、ヘッダーにこの変更が反映されていない場合はタグを追加し、iframe ajax 投稿を意味します。

    @Component
    public class MultipartAjaxInterceptor extends HandlerInterceptorAdapter
    {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
    {
    if(request.getParameter("isAjax") != null && request.getHeader("X-Requested-With") == null)
        response.getWriter().write("<textarea>");

    return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
       {
       if(request.getParameter("isAjax") != null && request.getHeader("X-Requested-With") == null)
           response.getWriter().write("</textarea>");
       }
    }

明らかに、私が遭遇した問題は、応答の getWriter または OutputStream を複数回呼び出すことができないということです。これを解決するための正しい軌道に乗っているように感じますが、ここからどこに行くべきかわかりません。

4

3 に答える 3

1

私がこの問題をどのように解決したかを投稿させてください(私にはわかりませんが、適切かどうかはわかりません)。フロントエンドでDojoを使用dojo.io.iframe.sendし、ファイルのアップロードにDojoを使用しています。フォームポストを処理するJS関数は次のとおりです。(handleAs私が設定した ""プロパティは' json'として表示されます)を見てください

function ioIframeGetJson(){
    var td = dojo.io.iframe.send({
        url: "${pageContext. request. contextPath}/switch/add",
        form: "frmSwitchTypeAdd",
        method: "post",
        preventCache: true, 
        handleAs: "json",
         load: function(response, ioArgs){
                clearSwitchTypeForm();
            },

            error: function(response, ioArgs){
            }
    });
}

私の場合、アップロードされたファイルも含むフォーム送信を処理するコントローラーメソッドは次のとおりです(リターンタイプを文字列に保持しているように見えます)

@RequestMapping(value="/add",method=RequestMethod.POST)
    @ResponseBody
    public String add(HttpServletRequest request) {
        . . . . .
        //I call the toString method of the model I want to return in Response
        return fromModel(switchType).toString();
}

そして、toString()メソッドは以下のようにコード化されています、私はJson文字列を囲まれています<textarea>

public String toString() {
        return "<textarea>{name:'" + name + "', code:'" + code
                + "', className:'" + className + "', dynamic:" + dynamic+"}</textarea>";
    }
于 2012-06-15T06:25:55.983 に答える
0

これが私がたどり着いた答えです.Raviの答えに似ていますが、私のセットアップには少し良いようです. 最初のことは、私@ResponseBodyの を Strings に変更することでした。<textarea />これは、応答をタグで手動で囲むことを想定して行われました。JsonResponseSerializer次に、次のような新しいクラスを作成しました。

public class JsonResponseSerializer
{
private HttpServletRequest request;

public JsonResponseSerializer(HttpServletRequest request)
{
    this.request = request;
}

public String serialize(JsonResponse jsonResponse) throws IOException
  {
    String response = "";

    ObjectMapper mapper = new ObjectMapper();

    response = mapper.writeValueAsString(jsonResponse);

    if(request.getParameter("isAjax") != null && request.getHeader("X-Requested-With") == null)
    {
        response = "<textarea>" + response + "</textarea>";
    }

    return response;
  }
}

次に、応答の return ステートメントを次のように変更しました。

    return new JsonResponseSerializer(request).serialize(jsonResponse);

基本的に、ServletRequest が注入されたユーティリティ メソッドを作成し、Jackson にオブジェクトをシリアル化するように要求し、必要に応じてそれを で囲みます<textarea />

于 2012-06-15T17:18:21.627 に答える