Я перенаправляю от контроллера к другому контроллеру. Но мне также нужно передать атрибуты модели второму контроллеру.
Я не хочу ставить модель в сеанс.
Пожалуйста, помогите.
Я перенаправляю от контроллера к другому контроллеру. Но мне также нужно передать атрибуты модели второму контроллеру.
Я не хочу ставить модель в сеанс.
Пожалуйста, помогите.
Я думаю, что самый элегантный способ сделать это - реализовать пользовательский 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>
Я использую 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:..."
, также не нужно было "повторно вставлять" атрибут модели.
Спасибо, аборский!
Вы можете решить эту проблему, используя 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
Возможно, вы могли бы сделать это следующим образом:
Не используйте модель в первом контроллере. Храните данные в другом общем объекте, который затем может быть извлечен вторым контроллером.
Посмотрите этот и этот. Это о подобной проблеме.
P.S.
Вы могли бы использовать область сеанса bean для этих общих данных...
Я использовал @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 ...
}
}
У меня была такая же проблема.
С RedirectAttributes после обновления страницы мои атрибуты модели от первого контроллера были потеряны. Я думал, что это ошибка, но потом я нашел решение. В первом контроллере я добавляю атрибуты в ModelMap и делаю это вместо "перенаправления":
return " forward:/nameOfView";
Это перенаправит ваш другой контроллер, а также сохранит атрибуты модели с первого.
Надеюсь, это то, что вы ищете. Извините за мой английский
Если вы хотите просто передать все атрибуты для перенаправления...
public String yourMethod( ...., HttpServletRequest request, RedirectAttributes redirectAttributes) {
if(shouldIRedirect()) {
redirectAttributes.addAllAttributes(request.getParameterMap());
return "redirect:/newPage.html";
}
}
Используя @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;
}
}
Добавьте все атрибуты модели в URL-адрес перенаправления в качестве строки запроса.