2012-08-14 17 views
11

Spring 3.1 kullanıyorum. Bazı işleme bir FORM üzerinden gönderilen bir komut nesnesi (veri tutucu) alır ve yapan bir kontrolör fonksiyonu var:Spring-MVC 3.1: Bir Denetleyici İşlevinden Bir İsteğin İletilmesi

@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 
Bazı kullanıcı programlı GET bağlantılar üzerinden sitesinden bilgi elde etmek ve isterim yapmak istiyorum

Bu isteği yerine getirecek başka bir işleyiciyi kurmak ister. Komut nesnesinin (ssdh) yeni bir örneğini oluşturur ve bunu GET isteği ile gönderilen parametrelerle doldurur. Sonra yukarıdaki işleyiciye iletirdi. Böyle bir şey:

@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 

Sorum ben herhangi bir şekilde ilk denetleyici funciton kodu değiştirmek gerekmez, öyle ki birinci kontrolör işlevine Komuta/veri tutucu nesnesini iletebilirsiniz nasıl?

cevap

17

Spring MVC 3.1'de tanıtılan RedirectAttributes nesnesini kullanarak yeniden yönlendirmek istediğiniz verileri doldurun. PRG (POST/Yönlendirme/GET) modelini çağırdı.

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

Nasıl kullanılacağı ile ilgili bazı teknik makaleler yazdım.

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

+0

+1 Büyük sen bozuldu sağladık danny.lesnik bağlantı http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31 @ bana çok – Jayanth

+1

yardımcı . Bunu çalışma linki ile günceller misiniz? – OO7

+0

Bu olayı neden bir iletmeyle yapmalıyım? – FelipeKunzler

7

Sen, geri basitçe öne bu şekilde bir ModelAttribute içinde ssdh kurmak ve mümkün olmalıdır, RequestDispatcher /results geri eşlemek mümkün olmalıdır: Ben size daha fazla bilgi verecektir inanıyoruz işleyicisi:

@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

Bunu denedim. POST isteklerini işlemek için iletmek istediğim denetleyici işlevi. Yukarıdaki örnekte, GET'in istediği işlevi iletmeye çalıştığımda. GET isteklerinin desteklenmediğini belirten bir hata mesajı alıyorum. Sanırım bir GET isteğini bir POST işlevine iletemiyorum. Aynı URL'de bitmesini sağlamak için iletmeden önce istek türünü değiştirmem için bir yol var mı? – Steve

+0

Evet, haklısınız, istek noktasında istek yöntemini biraz okudum - orijinal istek ile aynı istek yöntemini kullanmaya devam edecek, bu yüzden, bu durumda, HTTP GET üzerinden çağırarak/yayınladığınız için Bu, iletilen istekte de korunacaktır - http://stackoverflow.com/questions/4374548/does-jspforward-or-requestdispatcher-forward-use-get-or-post. Bir geçici çözüm bulunup bulunmadığından emin değilseniz, eğer uygunsa her ikisi için de aynı RequestMethod var. –

İlgili konular