2012-08-30 3 views
4

봄에 익숙하지 않아 JSP 뷰에서 양식의 데이터를 수집하고 컨트롤러에 양식을 제출할 수있었습니다. 보기에서 aquired 데이터에서, 나는 다른 모델 객체를 포함하는 모델 객체를 인스턴스화하고 있습니다 :많은 @RequestParam 인수에서 Spring Controller 메소드의 @ModelAttribute로 전환하는 방법

@RequestMapping(value = "/updateEntry", method = RequestMethod.GET) 
public RedirectView updateAction(ModelAndView model, 
@RequestParam(value = "name", defaultValue = "none") String selectedWaveName, 
@RequestParam(value = "id", defaultValue = "-1") int id, 
@RequestParam(value = "function", defaultValue = "none") String function, 
@RequestParam(value = "evidence", defaultValue = "none") String evidence, 
@RequestParam(value = "action", defaultValue = "none") String action, 
@RequestParam(value = "topicId", defaultValue = "-1") int topicId, 
@RequestParam(value = "topic", defaultValue = "none") String topic, 
@RequestParam(value = "topicDesc", defaultValue = "none") String topicDesc, 
@RequestParam(value = "waveId", defaultValue = "-1") int waveId, 
@RequestParam(value = "waveStart", defaultValue = "none") String waveStart, 
@RequestParam(value = "waveEnd", defaultValue = "none") String waveEnd) 
throws ParseException { 

DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy"); 
Date dateStart = formatter.parse(waveStart);; 
Date dateEnd = formatter.parse(waveEnd); 

waveDAO.updateFormResults(new FormResults(id, 
new Topic(topicId, topic, topicDesc), 
new Wave(waveId, selectedWaveName, dateStart, dateEnd), 
evidence, action, function)); 
return new RedirectView("/hr/?name=" + selectedWaveName); 
} 
내가 @ModelAttribute를 사용하여 적은 수의 라인 전체 @RequestParam 라인을 대체 할 수있는 방법

? 모델 클래스 (FormResults, Topic, Wave)에 @ModelAttribute 주석을 추가해야합니까?

감사합니다.

답변

1

이이 주석을 사용하는 경우, 변수 당신이 '나는이 모든 데이터를 포함하는 객체는 일반적으로 할 (하지만 어쩌면 당신의 사건에 대한 좋지 않은) 무엇 필자의 경우 JSP 페이지에서 프런트 엔드를 통과하면 모델 클래스에서 선언 한 속성과 정확히 같은 이름을 가져야합니다!

public class FormResults { 

private int id; 
private Topic topic; 
private Wave wave; 
private String evidence; 
private String action; 
private String manager; 
... } 

는 또한 모든 클래스 속성에 대한 getter와 setter 메소드를해야하고, 기본 생성자 : 예를 들어

당신은 같은 모델 클래스가 있다면!

당신이 @ModelAttribute 어노테이션을 사용하는 컨트롤러 방법, JSP 페이지에서 보내는 변수는이 같은 이름을 지정해야합니다 :

<input type="text" name="id"  ... 
<input type="text" name="evidence" ... 
<input type="text" name="action" .... 
<input type="text" name="manager" ... 

그리고 이것은 또한 복잡한을 가지고있는 경우에 작동 (예 : Topic, Wave와 같은) 속성으로 다른 객체를 가진 객체. ex : topic, wave, id, wave.id 등의 클래스 이름 앞에 다음과 같이 입력합니다.

여기 내 컨트롤러 메서드의 서명 :

@RequestMapping(value = "/updateEntry", method = RequestMethod.GET) 
public ModelAndView updateAction(ModelAndView model, 
     @ModelAttribute("fr") FormResults fr) throws ParseException { 
...} 

스프링은 자동으로 FormResults 개체를 만듭니다. 그게 다야! :)

+0

향후 독자를위한 팁 : Spring을 통해 자동으로 호출되는 매개 변수 (예 : *'public void setAction (private String action) {}')와 같은 이름의 setter를 만들 수도 있습니다. 이렇게하면 요청 객체 (* 즉 *'FormResults')의 요청 매개 변수 이름에 제약을받지 않습니다. 예를 들어, 대신에'private String lastAction'을 사용할 수 있습니다 - setter에서 적절하게 설정하십시오. –

3

@ModelAttribute 여기에 실제로 필요하지 않습니다.

ModelAttribute 모 데르 주석이 작업은 결국, 내가 발견 않았다
@RequestMapping(value = "/updateEntry", method = RequestMethod.GET) 
public RedirectView updateAction(ModelAndView model, Options options) throws ParseException { 
    ... 
} 

public static class Options { 
    private String selectedWaveName, 
    private int id, 
    ... 
    // Getters and setters 
} 
+0

안녕하세요, 게시 주셔서 감사합니다, 내 질문은 여기에 : 어떻게 jsp 페이지에서 개체 옵션 옵션을 보낼 수 있습니까? 내가 게시 한 컨트롤러가 jsp 뷰에서/updateEntry 요청을 처리하고 있기 때문에 양식에서 보낸 데이터를 처리하고 있는데 어떻게 작동하는지 알 수 없습니까? –

+0

@adrianbob :'/ updateEntry? id = 4 & selectedWaveName = xxx'와 같은 것이 작동 할 것입니다. – sinuhepop