2010-11-12 105 views
1

我正在做一個使用spring mvc框架的網站。 我想做一個調用ajax並直接從我的Web控制器接收一個json對象。 什麼是最好的方式/方式/插件來做到這一點? 我已經看過keith donald的教程,但它看起來有些複雜。 感謝您的任何建議。從Web控制器獲取json對象的最佳方式是什麼?

我已將jakson json映射器放入我的pom文件中。 我的控制器看起來像:

@RequestMapping(value = "m015", method = RequestMethod.GET) 
public @ResponseBody String list(@RequestParam(value = "type", required = true) String type){ 
    List<Mail> mails = mailService.getUserMails((Long) WebHelper.getPrincipal().getUser().getId(),type); 
    logger.info("yeah"); 
    return mails.toString(); 
} 

,但我得到這個我的javascript:[email protected]]

我Ajax調用的樣子:

var xhrArgs = { 
url: "${ctx}/portal/mail/m015.do", 
content: { type: id }, 
headers: {'Content-Type':'application/json'}, 
handleAs: 'text', 
sync: true, 
load: function(data) { 
    alert(data); 
}, 

}; dojo.xhrGet(xhrArgs);

請問我錯過了什麼?

+0

可以使用例如庫如jQuery做AJAX調用簡單。 – Javi 2010-11-14 16:12:49

回答

0
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="order" value="0" /> 
    <property name="interceptors"> 
     <list> 
      <ref bean="localeChangeInterceptor" /> 
     </list> 
    </property> 
</bean> 

<!-- Enables annotated POJO @Controllers --> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonConverter" /> 
     </list> 
    </property> 
</bean> 

1

春天3.0它是那樣簡單:

@RequestMapping("/ajax/foo") 
@ResponseBody 
public Foo foo(){ 
    return new Foo(); 
} 

請確保您有傑克遜JSON庫在您的應用程序和春季會自動的序列化JSON作爲結果。

0

博客中描述的方式其實非常簡單和優雅。你可以重新使用控制器方法來獲得JSON,XML等響應...

你所做的只是用@ResponseBody註釋該方法,並在你的項目中包含一個JSON jar。我自己用的行家,並通過添加這種依賴性做到這一點:

<!-- Jackson JSON Mapper --> 
<dependency> 
<groupId>org.codehaus.jackson</groupId> 
<artifactId>jackson-mapper-asl</artifactId> 
<version>1.5.4</version> 
</dependency> 

在這樣做的好處是那麼控制器方法可以返回一個POJO(最好是一個DTO)和映射器將在映射到JSON,只要對服務器的請求具有正確的頭文件,其中包含accept-encoding:application/json(或其它)。它甚至可以將正確的內容類型的傳入請求轉換爲方法簽名中的dto類型。美麗!方法的

例子:

@RequestMapping(value ="/service/status", method = RequestMethod.GET) 
public @ResponseBody Status getServiceStatus() { 

    return new Status("Online", 60, "Nothing to report"); 
} 

使用這種方法,你可以重用你的方法(我用這一個REST API)的JSON,Web服務等...

+0

我還有一個問題,我有更新我的問題,請看看。謝謝 – 2010-11-12 20:00:17

+0

跳過.toString()並返回類型列表。 – 2010-11-12 20:52:50

+0

當我這樣做,我得到一個錯誤,導致控制器正試圖返回視圖m015不存在 – 2010-11-14 04:13:26

相關問題