Spring MVC Controllers Возвращаемый тип - PullRequest
29 голосов
/ 12 сентября 2011

Я видел примеры, когда контроллер возвращает строку (которая указывает на представление)

@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;
}

В чем разница между этими двумя и которые я должен использовать?В любом случае, я смогу разрешить свое мнение.

Ответы [ 6 ]

18 голосов
/ 12 сентября 2011

Это та же логика, но это не та же версия пружины.

Объект 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 будет автоматически загружено

15 голосов
/ 12 сентября 2011

Если мы говорим о MVC 3, то оба они верны. Но прямой возврат ModelAndView - это старый и более устный способ.

Если вы возвращаете только строку (без @ResponseBody, которая является чем-то другим), эта строка обрабатывается как имя представления, а Spring выдвигает ее для просмотра распознавателей - поэтому вам не нужно беспокоиться (по крайней мере, пока вы написание контроллеров), какой тип рендеринга представлений вы будете использовать (пусть это будет JSP или скорость, это не имеет значения). Вы распространяете только экземпляр Model и получаете подсказку, что делать с ним дальше. Правильный ModelAndView объект создается позже внутри строки.

Как правило, Spring 3 дает вам больше гибкости с аргументами и типами возвращаемых данных (см. Определение методов-обработчиков @RequestMapping в документации Spring).

6 голосов
/ 12 сентября 2011

Возвращение ModelAndView или строки выполняет ту же работу.Он преобразуется в представление (страницу jsp) и дает объект модели, который будет отображаться в представлении.Если вы возвращаете строку, Spring внутренне разрешает представление, используя viewResolver, создает объект ModelAndView и возвращает его.Возвращение объекта ModelAndView происходит из более старой версии.Вы можете сделать что-либо из этого, основываясь на своем удобстве.

Взгляните на этот вопрос

Также куча ответов указывает на @RequestBody.Это не совсем связано с вашим вопросом.Но имейте в виду, что он преобразует ваш объект на основе типа контента с использованием доступных конвертеров, и результат будет частью тела документа.

6 голосов
/ 12 сентября 2011

В 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

Кроме того, вы можете вернуть любой объект JSON или XML, используя @ResponseBody аннотацию и сериализатор.

Например:

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

В этом примере вы вернете Listкак 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>

Надеюсь, это поможет.

1 голос
/ 11 августа 2015
public String findOwner(@PathVariable String ownerId, Model model) {
  Owner owner = ownerService.findOwner(ownerId);  
  model.addAttribute("owner", owner);  
  return "displayOwner"
}                       

в этом методе тип возвращаемого значения - String, и мы добавляем Model в качестве параметра, поэтому для добавления значения с моделью мы добавим как

 modelparam.addAttribute("obj",value);  

и вернитесь владельцу экрана в 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");

здесь имя представления возвращается в helloworld.jsp согласно viewResolver

1 голос
/ 12 сентября 2011

Если для создания ответа вы используете язык шаблонов, такой как freemarker или speed, вы можете вернуть ModelAndView.

Если вы хотите вернуть json / xml или некоторую строку в качестве ответа (например, ajax-запросы), тогда вы можете использовать первый метод. Я думаю, это должно быть public @ResponseBody String findOwner(@PathVariable String ownerId, Model model), вам нужно добавить аннотацию с именем @ ResponseBody , чтобы указать, что возвращаемое значение должно быть преобразовано в текст ответа. Использование @ResponseBody позволит вам использовать библиотеки, такие как Jackson или JaxB , для создания ответов json / xml соответственно.

Эти возвращенные значения будут преобразованы с использованием messageConverters, зарегистрированного с AnnotationMethodHandlerAdapter.

Ссылка: http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...