3

コントローラに、要求されたものに応じてHTMLまたはJSONを返すメソッドがあります。これは、この質問で見つけたこれを行う方法に関する情報をモデルにした、そのようなメソッドの簡略化された例です。

@RequestMapping(value="callback")
public ModelAndView callback(@RequestParam("c") String c) {
    Map response = new HashMap<String, String>();
    response.put("foo", "bar");
    return new ModelAndView("fake", "data", new JSONPObject(c, response));
}

JSONPObjectをモデルに配置したのは、HTMLが要求された場合にレンダリングするビューからJSONPObjectに到達できるようにする必要があるためです。しかし、これは、コールバックを使用してJSONをレンダリングするときに問題を引き起こします。

curl 'http://localhost:8080/notes/callback.json?c=call'
{"data"call(:{"foo":"bar"})}

ご覧のとおり、モデルの「データ」スロットにデータを配置しているため、モデルがJSONとしてレンダリングされると、余分なラッピングが発生します。私が探しているのは、次のようにレンダリングされたJSON(技術的にはJSONP)です。

call({"data":{"foo":"bar"}})

レンダリング中にJSONPObjectにアクセスするビューを返す機能を壊すことなく、私が行こうとしている場所に到達する方法を誰かが見ることができますか?

4

2 に答える 2

8

これが私がSpringMVCでJSONPを使用している方法です。必要に応じて変更してください。

サーバー側:

@RequestMapping(value="/notes/callback.json", method=RequestMethod.GET)
public void jsonpCallback(@RequestParam("callback") String callback, HttpServletResponse response) {
   response.setContentType("text/javascript; charset=UTF-8");
   PrintWriter out = response.getWriter();
   out.print(callback + "(" + jsonDataString + ")");
}

クライアント側:

<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
<script type="text/javascript">

function yourfunction() {
    jQuery.getJSON("http://localhost:8080/notes/callback.json?callback=?", 
        function(data) {
            alert(data.someParam);
        });
}

</script>
于 2012-04-26T06:29:56.797 に答える
0

私はこれを理解しました。JSONをレンダリングするとき、Springは私の構成に従ってMappingJacksonJsonViewを使用しています。そのビューには、マップ内の単一のアイテムを検索し、レンダリングする前にそれを抽出するように指示するプロパティがあります。そのプロパティを設定すると、これが機能するようになります。

    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" >
                <property name="extractValueFromSingleKeyModel" value="true" />
            </bean>
        </list>
    </property>
于 2012-04-26T12:27:31.380 に答える