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

Как передать атрибуты модели с одного контроллера Spring MVC на другой контроллер?

Я перенаправляю от контроллера к другому контроллеру. Но мне также нужно передать атрибуты модели второму контроллеру.

Я не хочу ставить модель в сеанс.

Пожалуйста, помогите.

4b9b3361

Ответ 1

Я думаю, что самый элегантный способ сделать это - реализовать пользовательский Flash Scope в Spring MVC.

Основная идея флэш-области - хранить данные с одного контроллера до следующего перенаправления во втором контроллере

Пожалуйста, обратитесь к моему ответу на вопрос пользовательской области:

Spring Пользовательская область MVC bean

Единственное, что отсутствует в этом коде, это следующая конфигурация xml:

<bean id="flashScopeInterceptor" class="com.vanilla.springMVC.scope.FlashScopeInterceptor" />
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  <property name="interceptors">
    <list><ref bean="flashScopeInterceptor"/></list>
  </property>
</bean>

Ответ 2

Я использую spring 3.2.3, и вот как я решил подобную проблему.
1) Добавлены redirectAttributes redirectAttributes в список параметров метода в контроллере 1.

public String controlMapping1(
        @ModelAttribute("mapping1Form") final Object mapping1FormObject,
        final BindingResult mapping1BindingResult,
        final Model model, 
        final RedirectAttributes redirectAttributes)

2) Внутри метода добавлен код для добавления атрибута flash в redirectAttributes redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);

3) Затем во втором параметре метода contoller, аннотированном с помощью @ModelAttribute, для доступа к атрибутам перенаправления

@ModelAttribute("mapping1Form") final Object mapping1FormObject

Вот пример кода из контроллера 1:

@RequestMapping(value = { "/mapping1" }, method = RequestMethod.POST)
public String controlMapping1(
        @ModelAttribute("mapping1Form") final Object mapping1FormObject,
        final BindingResult mapping1BindingResult,
        final Model model, 
        final RedirectAttributes redirectAttributes) {

    redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);

    return "redirect:mapping2";
}   

Из Contoller 2:

@RequestMapping(value = "/mapping2", method = RequestMethod.GET)
public String controlMapping2(
        @ModelAttribute("mapping1Form") final Object mapping1FormObject,
        final BindingResult mapping1BindingResult,
        final Model model) {

    model.addAttribute("transformationForm", mapping1FormObject);

    return "new/view";  
}

Ответ 3

Используя только redirectAttributes.addFlashAttribute(...) -> "redirect:...", также не нужно было "повторно вставлять" атрибут модели.

Спасибо, аборский!

Ответ 4

Вы можете решить эту проблему, используя org.springframework.web.servlet.mvc.support.RedirectAttributes.

Вот мой образец контроллера.

@RequestMapping(method = RequestMethod.POST)
    public String eligibilityPost(
            @ModelAttribute("form") @Valid EligibiltyForm form,
            Model model,
            RedirectAttributes redirectAttributes) {
        if(eligibilityService.validateEligibility(form)){
            redirectAttributes.addFlashAttribute("form", form);
            return "redirect:<redirect to your page>";
        }
       return "eligibility";
    }

читайте больше в своем блоге http://mayurshah.in/596/how-do-i-redirect-to-page-keeping-model-value

Ответ 5

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

Не используйте модель в первом контроллере. Храните данные в другом общем объекте, который затем может быть извлечен вторым контроллером.

Посмотрите этот и этот. Это о подобной проблеме.

P.S.

Вы могли бы использовать область сеанса bean для этих общих данных...

Ответ 6

Я использовал @ControllerAdvice, пожалуйста, проверьте, доступен ли в Spring 3.X; Я использую его в Spring 4.0.

@ControllerAdvice 
public class CommonController extends ControllerBase{
@Autowired
MyService myServiceInstance;

    @ModelAttribute("userList")
    public List<User> getUsersList()
    {
       //some code
       return ...
    }
}

Ответ 7

У меня была такая же проблема.

С RedirectAttributes после обновления страницы мои атрибуты модели от первого контроллера были потеряны. Я думал, что это ошибка, но потом я нашел решение. В первом контроллере я добавляю атрибуты в ModelMap и делаю это вместо "перенаправления":

return " forward:/nameOfView";

Это перенаправит ваш другой контроллер, а также сохранит атрибуты модели с первого.

Надеюсь, это то, что вы ищете. Извините за мой английский

Ответ 8

Если вы хотите просто передать все атрибуты для перенаправления...

public String yourMethod( ...., HttpServletRequest request, RedirectAttributes redirectAttributes) {
    if(shouldIRedirect()) {
        redirectAttributes.addAllAttributes(request.getParameterMap());
        return "redirect:/newPage.html";
    }
}

Ответ 9

Используя @ModelAttribute, мы можем передать модель с одного контроллера на другой контроллер

[Вход в первый контроллер] [1]

[]: https://i.stack.imgur.com/rZQe5.jpg со страницы jsp первый контроллер связывает данные формы с @ModelAttribute с пользовательским компонентом

@Controller
public class FirstController {
    @RequestMapping("/fowardModel")
    public ModelAndView forwardModel(@ModelAttribute("user") User u) {
        ModelAndView m = new ModelAndView("forward:/catchUser");
        m.addObject("usr", u);
        return m;
    }
}

@Controller
public class SecondController {
    @RequestMapping("/catchUser")
    public ModelAndView catchModel(@ModelAttribute("user")  User u) {
        System.out.println(u); //retrive the data passed by the first contoller
        ModelAndView mv = new ModelAndView("userDetails");
        return mv;
    }
}

Ответ 10

Добавьте все атрибуты модели в URL-адрес перенаправления в качестве строки запроса.