Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Объектом ModelAndView является spring 2.x способ обработки модели и представлений. В примере, который вы указали, объект modelandview загрузит представление "helloWorld" (в зависимости от вашего механизма шаблонов может быть helloWorld.jsp, или helloWorld.html,...) с одним "сообщением" данных в модели.

Другим способом является путь spring 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 будет автоматически загружен

Ответ 3

В 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 в случае, и вы включили сериализатор Jackson. Чтобы включить это, вам нужно добавить следующее в свой 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>

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

Ответ 4

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

Посмотрите на question

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

Ответ 5

Если вы используете язык шаблонов, например freemarker или скорость, чтобы создать ответ, вы можете вернуть 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/

Ответ 6

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