2012-08-14 28 views
11

Tôi đang sử dụng Spring 3.1. Tôi có một chức năng điều khiển mà mất trong một đối tượng lệnh (một người giữ dữ liệu) gửi qua một MẪU và hiện một số chế biến:Spring-MVC 3.1: Chuyển tiếp yêu cầu từ một chức năng điều khiển đến

@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 

Một số người dùng muốn để lập trình tạo liên kết GET để lấy thông tin từ trang web ra và tôi sẽ muốn thiết lập một trình xử lý khác có thể xử lý yêu cầu đó. Nó sẽ tạo ra một phiên bản mới của đối tượng lệnh (ssdh) và điền nó với các tham số được gửi qua yêu cầu GET. Sau đó, nó sẽ chuyển nó cho người xử lý ở trên. Một cái gì đó như thế này:

@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 

Câu hỏi của tôi là làm thế nào tôi có thể chuyển tiếp đối tượng giữ lệnh/dữ liệu của tôi với chức năng điều khiển đầu tiên như vậy mà tôi không cần phải thay đổi mã để các funciton điều khiển đầu tiên trong bất kỳ cách nào?

Trả lời

17

Bạn có thể sử dụng đối tượng RedirectAttributes được giới thiệu trong Spring MVC 3.1 và điền dữ liệu đó vào dữ liệu bạn muốn giữ lại để chuyển hướng. Nó được gọi là mẫu 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"; 
} 

Tôi đã viết một số bài viết kỹ thuật về cách sử dụng nó. Tôi tin rằng nó sẽ cho bạn biết thêm chi tiết:

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

+0

+1 vĩ đại đã giúp tôi rất nhiều – Jayanth

+1

@ danny.lesnik liên kết http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31 bạn đã cung cấp được chia . U sẽ cập nhật này với liên kết làm việc? – OO7

+0

Tại sao tôi cần phải thực hiện sự kiện này với tiền đạo? – FelipeKunzler

7

Bạn sẽ có thể thiết lập các ssdh trong một ModelAttribute và chỉ đơn giản là chuyển tiếp nó trở lại, theo cách này, các RequestDispatcher sẽ có thể để ánh xạ nó trở lại /results handler:

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

} 
+0

Tôi đã thử điều này. Hàm điều khiển mà tôi muốn chuyển tiếp để xử lý các yêu cầu POST. Khi tôi cố gắng chuyển tiếp từ hàm trong ví dụ trên, nó thực hiện các yêu cầu GET. Tôi nhận được thông báo lỗi nói rằng yêu cầu GET không hỗ trợ. Tôi đoán tôi không thể chuyển tiếp yêu cầu GET đến một hàm POST. Có cách nào để tôi thay đổi loại yêu cầu trước khi chuyển tiếp để làm cho nó kết thúc tại cùng một URL không? – Steve

+0

Có, bạn nói đúng, tôi đọc một chút về phương thức yêu cầu tại thời điểm chuyển tiếp - nó sẽ tiếp tục là phương thức yêu cầu giống như yêu cầu ban đầu, vì vậy trong trường hợp này, vì bạn đang gọi/pubresult qua HTTP GET , điều này sẽ được duy trì trong yêu cầu được chuyển tiếp cũng - http://stackoverflow.com/questions/4374548/does-jspforward-or-requestdispatcher-forward-use-get-or-post. Không chắc chắn nếu có một workaround, nếu khả thi có cùng RequestMethod cho cả hai –

Các vấn đề liên quan