2011-09-12 208 views
27

我見過的例子,其中一個控制器返回一個字符串(表示視圖)Spring MVC控制器返回類型

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET) 
public String findOwner(@PathVariable String ownerId, Model model) { 
    Owner owner = ownerService.findOwner(ownerId); 
    model.addAttribute("owner", owner); 
    return "displayOwner" 
} 

而且我也看到例子,其中一個控制器返回「的ModelAndView」對象類型

public ModelAndView helloWorld() { 
    ModelAndView mav = new ModelAndView(); 
    mav.setViewName("helloWorld"); 
    mav.addObject("message", "Hello World!"); 
    return mav; 
} 

兩者之間的區別是什麼?我應該使用哪一個?不管怎樣,我可以讓我的視圖得到解決。

+0

其中Spring MVC的版本是,我們在談論什麼? –

+0

這裏是答案:https://stackoverflow.com/questions/29365833/what-are-valid-return-types-of-a-spring-mvc-controller-method/29366138#29366138 – Rajeev

回答

15

如果我們在談論MVC 3,那麼兩者都是正確的。但直接返回ModelAndView是舊的方式,更多的口頭。

如果你只是返回一個字符串(沒有@ResponseBody這是別的東西),這個字符串被視爲視圖名稱,並且彈簧將其推送到查看解析器 - 所以,你不必擔心(至少,當你正在編寫控制器),你將使用什麼類型的視圖渲染器(讓它成爲jsp或速度,這並不重要)。您只傳播Model實例,然後返回提示接下來如何處理它。對象稍後在內部通過字符串進行合適的ModelAndView對象。

一般來說,spring 3給你更多的參數和返回類型的靈活性(參見Spring documentaton中的Defining @RequestMapping handler methods部分)。

+1

在較新的MVC 3方法(返回一個'String')中,'Model'實例如何進入視圖?在控制器中,我們使用'model.addAttribute(..)'來添加屬性,但最終只返回'String',那麼視圖解析器如何知道'Model'對象呢?謝謝! – user2490003

+0

我相信它是由RequestMapping完成的某種依賴性注入(即模型是由解析器給你的) - 但說實話,我不確定,因爲我在過去的5年中沒有與Spring聯繫^^ –

1

如果您使用類似freemarker或velocity的模板語言來創建響應,那麼您可以返回ModelAndView

如果你想返回一個json/xml或者一些字符串作爲響應(例如:ajax requests),那麼你可以使用第一種方法。我認爲它應該是public @ResponseBody String findOwner(@PathVariable String ownerId, Model model),您需要添加一個名爲@ResponseBody的註釋,以指示返回的值應該轉換爲響應文本。使用@ResponseBody將使您能夠使用像JacksonJaxB這樣的庫分別創建json/xml響應。

這些返回值將使用messageConverters轉換成AnnotationMethodHandlerAdapter註冊。

編號:http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/

+1

你錯過了這一點。如果你定義了正確的'view resolver',則返回的字符串將被視爲視圖的名稱(jsp,template等)。 '@ ResponseBody'與它無關。 –

+0

@AdamJurczyk所以我如何使用'@ ResponseBody'(我想爲jQuery調用返回JSON)如果我已經定義了'view resolver'?謝謝 – MyTitle

6

在Spring MVC,你應該返回的ModelAndView如果要呈現的JSP頁面

例如:

@RequestMapping(value="/index.html", method=RequestMethod.GET) 
    public ModelAndView indexView(){ 
     ModelAndView mv = new ModelAndView("index"); 
     return mv; 
    }  

這個函數將返回的index.jsp當你擊中/index.html

此外,您可以使用@ResponseBody批註和序列化程序返回任何JSON或XML對象。

例如:

@RequestMapping(value="/getStudent.do",method=RequestMethod.POST) 
    @ResponseBody 
    public List<Student> getStudent(@RequestParam("studentId") String id){ 
     List<Student> students = daoService.getStudent(id); 
     return students; 
    } 

在這個例子中,你會在情況下返回列表,JSON和已啓用傑克遜串行器。爲了使您需要以下內容添加到你的Spring XML:

<context:annotation-config/> 

以及串行化本身:

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
<property name="messageConverters"> 
    <list> 
    <ref bean="jacksonMessageConverter"/> 
    </list> 
</property> 
</bean> 

希望它能幫助。

+2

沒有必要直接創建並返回MAV。除此之外,如果使用'context:annotation-config',則不必手動放置序列化程序,如果'jackson'位於類路徑中,則自動完成。 –

+0

完美,簡單的例子非常有用。 – Tastybrownies

17

這是相同的邏輯,但它不是相同版本的彈簧。

ModelAndView對象是處理模型和視圖的spring 2.x方法。 在您給出的示例中,modelandview對象將在模型中加載「helloWorld」視圖(取決於您的模板引擎可能是helloWorld.jsp,或helloWorld.html,...),並帶有一條數據「消息」。

另一種方式是彈簧3.x方式。你可以寫出與你的helloworld完全相同的例子。

@RequestMapping(value="/helloWorld", method=RequestMethod.GET) 
public String helloWorld(Model model) { 
    model.addAttribute("message", "Hello World!"); 
    return "helloWorld"; 
} 

該模型根據請求自動填充。

我們可以簡化這種表示法,因爲url映射「helloWorld」是直接的視圖名稱。

@RequestMapping(value="/helloWorld", method=RequestMethod.GET) 
public void helloWorld(Model model) { 
    model.addAttribute("message", "Hello World!"); 
} 

了HelloWorld視圖將全自動裝

5

返回的ModelAndView或字符串做相同的工作。它解析成一個視圖(一個jsp頁面)並給出一個模型對象在視圖中渲染。如果你返回一個字符串,Spring使用viewResolver在內部解析爲一個視圖,創建一個ModelAndView對象並返回它。 ModelAndView對象的返回來自舊版本。你可以根據你的方便來做任何一種。

看一看這個question

而且一堆答案都指向了以@RequestBody。它與你的問題不完全相關。但請記住,它將使用可用的轉換器基於內容類型轉換對象,並且結果將成爲文檔正文的一部分。

1
public String findOwner(@PathVariable String ownerId, Model model) { 
    Owner owner = ownerService.findOwner(ownerId); 
    model.addAttribute("owner", owner); 
    return "displayOwner" 
}      
在該方法

返回類型爲字符串,我們添加模型作爲參數,以便添加與模型的值,我們將添加像

modelparam.addAttribute("obj",value); 

,並返回到displayowner到JSP作爲每次觀看解析器

public ModelAndView helloWorld() { 
    ModelAndView mav = new ModelAndView(); 
    mav.setViewName("helloWorld"); 
    mav.addObject("message", "Hello World!"); 
    return mav; 
} 

在這個方法的返回類型是ModelAndView的,所以我們將返回模型 和這裏的MAV是ModelAndView中的對象,因此在這裏我們應該廣告像

model.addObject("object","value"); 

d這裏的視圖名返回的helloWorld.jsp爲每ViewResolver的

相關問題