2015-08-23 2 views
3

Использование тегаAttribute = "" и тега path = "" не имеет для меня смысла, когда есть только одна строка, которая должна быть передана к контроллеру. Однако, когда форма имеет несколько текстовых полей, на самом деле имеет смысл иметь для них объектную модель. Таким образом, тег modelAttribute представляет объект, т. Е. «Employee», а теги пути представляют поля, то есть «firstName», «lastName», «зарплата».Spring JSP: проблема с пружинной формой с modelAttribute = "" и path = ""

Что вы будете делать, если хотите только одну строку? Мне не нужно было создавать класс «Ключ» с полем «ключ» с getKey() и setKey() или любым из этого безумия, чтобы передать строку методу контроллера, правильно? Какова конвенция в этом случае?

Если я просто model.addAttribute("key", "") при загрузке страницы, я получаю:

org.springframework.beans.NotReadablePropertyException: Invalid property 'key' 
of bean class [java.lang.String]: Bean property 'key' is not readable or has an invalid 
getter method: Does the return type of the getter match the parameter type of the setter? 

Если я удаляю modelAttribute = "ключ" тег я получаю:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for 
bean name 'command' available as request attribute 

JSP

<form:form method="post" action="myAction" modelAttribute="key"> 
    <td> 
     <form:input path="key" value="${myValue}"/> 
     <input type="submit" value="Submit"/> 
    </td> 
</form:form> 

Контролер

@RequestMapping(value = "/myAction", method = RequestMethod.POST) 
public String handleMyActionRequest(@ModelAttribute("key") String key, Model model) { 

    // do stuff with key string. 

    return HOME_PAGE_REDIRECT; 
} 

Что такое соглашение для передачи одной строки к методу контроллера при отправке формы, без того, чтобы создать новый класс?

ответ

1

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

В вы резервном боб, добавьте строку в модели, как это:

@RequestMapping(value = "/", method = RequestMethod.GET) 
public ModelAndView home(Locale locale, Model model) { 

    Object theTempBean = new Object(){ 
     public String key = "blahblahblah"; 

     public String getKey() { 
      return key; 
     } 

     public void setKey(String key) { 
      this.key = key; 
     } 
    }; 

    model.addAttribute("theTempBean", theTempBean); 

    String viewName = "home"; 
    return new ModelAndView(viewName, "command", model); 
} 

СПЯ должен выглядеть следующим образом:

<form:form action="/myAction" modelAttribute="theTempBean"> 

     <form:input path="key" /> 
      <input 
       type="submit" value="Submit" /> 
    </form:form> 

Затем полотно контроллер, который обрабатывает сообщение формы, должен выглядеть примерно так:

@RequestMapping(path = "/myAction") 
public String myAction(@RequestParam("key") String param){ 
    logger.info(param); 
    return "home"; 
} 

Я тестировал этот простой пример, и он работает, как и ожидалось, с версией Spring версии 4.2.0.RELEASE и плагином Jetty Maven версии 9.3.2.v20150730.

EDIT

Существует ошибка. Если вы решите сделать это, вы должны установить «theTempBean» в любом запросе (возможно, это может стать @ModelAttribute. Опять же, это просто встроенная версия дополнительного компонента). Это метод обработчика фиксированных действий:

@RequestMapping(path = "/myAction") 
public String myAction(@RequestParam("key") String param 
     , Model model){ 
    logger.info(param); 

    Object theTempBean = new Object(){ 
     public String key = param; 

     public String getKey() { 
      return key; 
     } 

     public void setKey(String key) { 
      this.key = key; 
     } 
    }; 

    model.addAttribute("theTempBean", theTempBean); 

    return jspViewName("home"); 
} 
Смежные вопросы