2010-01-01 5 views
5

비즈니스 로직을 수행하고 모델을 생성하는 컨트롤러를 만들었습니다. 뷰 이름과 모델이있는 ModelAndView를 반환하여이 모델을 직접 전달하면 모든 것이 효과적입니다. 하지만 이제 결과를 다른 페이지에 표시하고 싶습니다. 그래서 "redirect :"접두사를 사용하여 다른 컨트롤러로 리디렉션하지만 모델은 손실됩니다.스프링 MVC - 컨트롤러 간 모델

무엇이 누락 되었습니까? redirect: 접두사가 다른 컨트롤러를 실행

감사합니다, 올렉산드르

답변

0

때문에, 당신은 이전 컨트롤러에서 ModelAndView 내 가졌던 잃게됩니다. 비즈니스 로직 컨트롤러는 컨트롤러가 아니어야합니다. 아마도 일반 클래스로 만들고 결과 컨트롤러에서 호출해야합니다. 그런 다음 결과 컨트롤러가 데이터를 모델에 저장할 수 있습니다.

+1

예, 다른 클래스에서 비즈니스 로직을 분리 할 수 ​​있습니다. 그러나이 논리를 만들기 위해 입력 매개 변수가 필요합니다. 내가 첫 번째 컨트롤러에서 사용자로부터 얻는 방법을 알려주고, 결과를 다른 컨트롤러로 전달하여 나중에 비즈니스 논리 클래스를 호출 할 방법이 필요합니다. 필자의 어려움은 컨트롤러 (입력 데이터 컨트롤러와 결과 컨트롤러)간에 일부 데이터 (이 경우 입력 매개 변수)를 전달하는 것입니다. – Oleksandr

4

옵션 1 : 모델을 세션에 넣고 다시 컨트롤러로 가져 와서 세션에서 무효화 할 수 있습니다.

옵션 2 : 당신은 두 개의 컨트롤러가 있어야하는데, 먼저 사용자 입력을 검색하고 비즈니스 로직을 수행하고 다른 로직으로 리디렉션 할 것이라고했습니다. 내 제안은 두 컨트롤러에 배치 된 비즈니스 로직을 클래스로 이동시키고 모델 및 뷰를 사용자에게 반환하는 컨트롤러가 하나만있는 것입니다.

+1

그러나 Spring MVC와 주석을 사용하여 세션에서 모델을 저장하는 방법. 예를 들어 줄 수 있습니까? – Oleksandr

+4

ModelAndView mv = new ModelAndView(); mv.addObject ("key1", "value1"); mv.addObject ("key2", "value2"); mv.addObject ("key3", "value3"); request.getSession(). setAttribute ("model", mv.getModelMap()); – novice

+0

답변 해 주셔서 감사합니다. 우리는 거의 다 왔어. 내가 이해하지 못하는 유일한 것은 annotation을 가진 HttpSession에 parametres를 저장하는 방법이다. 예를 들어 @SessionAttributes는 컨트롤러 내부의 요청 사이에 데이터를 저장합니다.데이터를 세션에 영구 저장하는 주석이 있습니까? 또는 @RequestParam을 사용하여 HttpSession에 액세스하는 방법은 무엇입니까? 광석에는 다른 방법이 있습니까? – Oleksandr

0

스프링의 이후 릴리스에서 변경 될 수 있으므로 @SessionAttributes는 사용하지 않을 것입니다.) (접두사 궁극적으로 RequestDispatcher.forward을 수행 을 : 나는 올렉산드르 어떻게 든

위의 이전 게시물을 당신을 보여하지만 어쩌면 다른 사람이

11

당신이 앞으로 사용할 수를 유용 찾을 수 옛날 방식을 고수 것이다 insted of the redirect : 접두어.

+0

이 솔루션은 저에게 효과적이었습니다. 감사합니다 @ Niraj – will824

2

리디렉션 중 : url에 매개 변수가 추가 된 GET 메소드를 사용하여 요청이 전송됩니다. 컨트롤러에 @RequestParameter 주석을 사용하여 요청 매개 변수를 수신하는 새로운 메소드를 바로 사용할 수 있습니다. 요청 간단한 문자열로

e.g ModelAndView mv = new ModelAndView(); 
mv.setViewName(redirect:/your/url); 
mv.addObject("param1", string_param); 
. 
. 
. 

이 방법을 모든 매개 변수를 추가 리디렉션 동안 성공적으로 리디렉션 할 수 있습니다.