11

我正在使用 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 链接以从我们的站点获取信息,我想设置另一个处理程序来处理该请求。它将创建该命令对象 ( 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

我的问题是如何将我的命令/数据持有者对象转发到第一个控制器函数,这样我就不必以任何方式将代码更改为第一个控制器函数?

4

3 回答 3

17

您可以使用RedirectAttributesSpring 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

于 2012-08-14T21:15:00.397 回答
7

您应该能够在 ModelAttribute 中设置 ssdh 并简单地将其转发回来,这样,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";         

}
于 2012-08-14T21:38:33.680 回答
0

利用

org.springframework.web.servlet.view.RedirectView

spring 包中的类重定向到 spring MVC 控制器中的不同页面。Baeldung 博客页面有更多详细信息

示例代码:

@RequestMapping(value = "/", method = RequestMethod.GET)
public RedirectView mainMethod() {
    return new RedirectView("/login");
}

@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView mainLogin() {
    ModelAndView model = new ModelAndView("login");
    return model;
}
于 2018-10-28T17:40:31.600 回答