【问题标题】:Spring-MVC 3.1: Forwarding A Request From One Controller Function To AnotherSpring-MVC 3.1:将请求从一个控制器功能转发到另一个
【发布时间】:2018-10-29 10:00:50
【问题描述】:

我正在使用 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

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

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    您可以使用 Spring MVC 3.1 中引入的 RedirectAttributes 对象,并使用您要保留以进行重定向的数据填充它。它称为 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】:

    您应该能够在 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";         
    
    }
    

    【讨论】:

    • 我试过了。我要转发以处理 POST 请求的控制器功能。当我尝试从上面示例中的函数转发时,它会执行 GET 请求。我收到一条错误消息,指出不支持 GET 请求。我猜我无法将 GET 请求转发到 POST 函数。有没有办法让我在转发之前更改请求类型以使其以相同的 URL 结束?
    • 是的,你是对的,我在转发点读了一点请求方法 - 它将继续与原始请求相同的请求方法,所以在这种情况下,因为你正在通过 HTTP GET 调用 /pubresult,这也将在转发的请求中维护 - stackoverflow.com/questions/4374548/…。不确定是否有解决方法,如果可行的话,两者都有相同的 RequestMethod
    【解决方案3】:

    使用

    org.springframework.web.servlet.view.RedirectView

    来自 spring 包的类以重定向到 spring MVC 控制器中的不同页面。 The Baeldung blog page has more details

    示例代码:

    @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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 2012-10-13
      • 2021-12-20
      • 2017-02-04
      • 2014-06-07
      相关资源
      最近更新 更多