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

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

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

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

10 ответов


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

основная идея области flash-хранения данных с одного контроллера до следующего перенаправления во втором контроллере

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

Spring MVC custom scope 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>

я использую 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";  
}

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

спасибо, aborskiy!


вы можете решить его с помощью org.springframework.сеть.сервлет.в MVC.поддержка.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


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


может быть, вы могли бы сделать это вот так:

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

посмотреть этой и этой пост. Речь идет об аналогичной проблеме.

П. С.

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


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

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

возвращения "вперед:/nameOfView";

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

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


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

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

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

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

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

С помощью @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;
        }
    }