Spring -MVC 3.1: пересылка запроса от одной функции контроллера к другому

Я использую Spring 3.1. У меня есть функция контроллера, которая принимает объект команды (держатель данных), отправленный через FORM, и выполняет некоторую обработку:

@RequestMapping(value = "/results", method = RequestMethod.POST)
public String toResultsScreen(@ModelAttribute("ssdh") SearchScreenDataHolder ssdh,
                                  BindingResult bindingResult,    
                                  ModelMap model,                
                                  HttpSession session) {

    if (bindingResult.hasErrors()) {
        logger.debug("Error returning to /search screen");
        return "search";
    }

    netView = "results";

    // do stuff

    return nextView;         

} // end function

Некоторые пользователи хотели бы программно сделать ссылки GET для получения информации с сайта, и я хотел бы настроить другой обработчик, который будет обрабатывать этот запрос. Это создаст новый экземпляр объекта command (ssdh) и заполнит его параметрами, отправленными с помощью запроса GET. Затем он передал бы это обработчику выше. Что-то вроде этого:

@RequestMapping(value = "/pubresult")
public String toPublicResultsScreen(ModelMap model,    
                                   HttpSession session,             
                                   @RequestParam (required=true) String LNAME,   
                                   @RequestParam (required=false)String FNAME){

    Search search = new Search(usertype);

    // Capture the search parameters sent by HTTP
    ssdh.setLast_name(LNAME);
    ssdh.setFirst_name(FNAME);

    // To Do:  "forward this data holder, ssdh to the controller function quoted first

    return nextView;         

} // end function

Мой вопрос заключается в том, как я могу перенаправить свой объект для хранения команд/данных на первую функцию контроллера, так что мне не нужно каким-либо образом изменять код на первый контроллер?

Ответ 1

Вы можете использовать объект RedirectAttributes, который был введен в Spring MVC 3.1, и заполнить его данными, которые вы хотите сохранить для перенаправления. Он назывался шаблоном PRG (POST/Redirect/GET).

@RequestMapping(value="/saveUserDetails.action", method=RequestMethod.POST)
public String greetingsAction(@Validated User user,RedirectAttributes redirectAttributes){
    //setting attributes 
    redirectAttributes.addFlashAttribute("firstName", user.getFirstName());
    redirectAttributes.addFlashAttribute("lastName", user.getLastName())
    return "redirect:success.html";
} 

Я написал техническую статью о том, как ее использовать. Я верю, что это даст вам более подробную информацию:

http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31

Ответ 2

Вы должны иметь возможность установить ssdh в ModelAttribute и просто переслать его обратно, таким образом, RequestDispatcher должен иметь возможность сопоставить его с обработчиком /results:

@RequestMapping(value = "/pubresult")
public String toPublicResultsScreen(ModelMap model,    
                                   HttpSession session,             
                                   @RequestParam (required=true) String LNAME,   
                                   @RequestParam (required=false)String FNAME, Model model){

  Search search = new Search(usertype);
  // Capture the search parameters sent by HTTP
  ssdh.setLast_name(LNAME);
  ssdh.setFirst_name(FNAME);
  model.addAttribute("ssdh", ssdh);

  return "forward:/results";         

}