2013-02-07 10 views
5

हमारी वेब ऐप्लिकेशन में, वसंत MVC 3.2 का उपयोग कर हम विभिन्न वस्तुओं के कई पृष्ठवार सूचियों, और सूची में अन्य पृष्ठों के लिंक प्रदर्शित इस तरह निर्माण कर रहे हैं:नक्शा वसंत MVC में एक वस्तु के लिए अनुरोध पैरामीटर के सबसेट

/servlet/path?pageNum=4&resultsPerPage=10&sortOrder=ASC&sortBy=name 

हालांकि URL में अतिरिक्त अनुरोध पैरामीटर भी हो सकते हैं (उदाहरण के लिए, खोज फ़िल्टर)।

तो हम इस तरह नियंत्रक तरीकों:

@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list") 
public String ajaxlistGroups(Model model, 
    @RequestParam(value="pageNumber",required=false,defaultValue="0") Long pageNumber, 
    @RequestParam(value="resultsPerPage",required=false,defaultValue="10") int resultsPerPage, 
    @RequestParam(value="sortOrder",required=false,defaultValue="DESC") String sortOrder, 
@RequestParam(value="orderBy",required=false,defaultValue="modificationDate")String orderBy) { 
// create a PaginationCriteria object to hold this information for passing to Service layer 
// do Database search 
// return a JSP view name 

} 

तो हम इस अनाड़ी विधि हस्ताक्षर के साथ खत्म, बार-बार अनुप्रयोग में कई बार, और प्रत्येक विधि पृष्ठांकन जानकारी धारण करने के लिए एक PaginationCriteria वस्तु बनाने के लिए की जरूरत है , और इनपुट मान्य करें।

क्या इन अनुरोध पैराम मौजूद हैं, तो हमारे पेजिनेशनक्रिटिया ऑब्जेक्ट को स्वचालित रूप से बनाने का कोई तरीका है? उदाहरण के लिए, की जगह के साथ ऊपर:

@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list") 
public String ajaxlistGroups(Model model, @SomeAnnotation? PaginationCriteria criteria, 
) { 
... 
    } 

Ie, वहाँ वसंत में एक तरह से एक नियमित रूप से GET अनुरोध से requestParams का एक परिभाषित सबसेट लेते हैं, और उन्हें स्वचालित रूप से एक वस्तु में बदलने के लिए है, इसलिए इसे में उपयोग के लिए उपलब्ध है नियंत्रक हैंडलर विधि? मैंने पहले ही @ModelAttribute का उपयोग किया है, और यह यहां सही चीज़ नहीं लग रहा है।

धन्यवाद!

उत्तर

6

वसंत 3.2 स्वचालित रूप से अनुरोध जावा पैरामीटर को कस्टम जावा बीन में मैप करना चाहिए।

@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list") 
public String ajaxlistGroups(Model model, PaginationCriteriaBean criteriaBean, 
) { 
//if PaginationCriteriaBean should be populated as long as the field name is same as 
//request parameter names. 
} 

मुझे यकीन है कि कैसे स्प्रिंग जादुई इस (@ModelAttribute के बिना) को प्राप्त नहीं कर रहा हूँ, लेकिन कोड ऊपर मेरे लिए काम करता है।

एक ही लक्ष्य प्राप्त करने का एक और तरीका है, आप वास्तव में अधिक प्राप्त कर सकते हैं, जो वसंत एओपी है।

<bean id="aspectBean" class="au.net.test.aspect.MyAspect"></bean> 
<aop:config> 
    <aop:aspect id="myAspect" ref="aspectBean"> 
    <aop:pointcut id="myPointcut" 
     expression="execution(* au.net.test.web.*.*(..)) and args(request,bean,..)" /> 
    <aop:before pointcut-ref="myPointcut" method="monitor" /> 
    </aop:aspect> 
</aop:config> 
आवेदन संदर्भ में

, हम सलाह है, जो अपने मामले में सलाह से पहले है के साथ पहलू सेम के साथ-साथ Pointcut घोषित

पीछा कर रहा है स्रोत कोड

public class PaginationCriteriaBean { 

     private String id; 
     private String name; 

     public String getId() { 
      return id; 
     } 

     public void setId(String id) { 
      this.id = id; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 
    } 
//custom Aspect 
public class MyAspect { 

    public void monitor(HttpServletRequest request,PaginationCriteriaBean bean){ 
     //populate your pagination bean 
     bean.setId(request.getParameter("id")); 
     bean.setName("my new name"); 
    } 
} 

    @RequestMapping(value="/app") 
    public String appRoot(HttpServletRequest request,PaginationCriteriaBean bean){ 
     System.out.println(bean.getId()); 
     System.out.println(bean.getName()); 
     return "app"; 
    } 

ऐसा करके, पहलू वसंत नियंत्रण को रोक देगा अनुरोध पैरामीटर के आधार पर raginationCriteriaBean populate, और आप अनुरोध में मूल मान भी बदल सकते हैं। इस एओपी कार्यान्वयन के साथ आपको पेजिंग के खिलाफ अधिक तर्क लागू करने के लिए अधिकार दिया गया है, जैसे कि लॉगिंग और सत्यापन आदि।

+0

व्यापक उत्तर के लिए धन्यवाद! आपका पहला समाधान मेरे लक्ष्यों को पूरा करता है, ऑब्जेक्ट को अनुरोध-स्कोप्ड बीन के रूप में जोड़ता है। एओपी समाधान दिलचस्प लग रहा है लेकिन मुझे पिछले लपेटने वाले नियंत्रकों में वसंत-इकाई परीक्षणों में दखल देने वाले पहलुओं के साथ समस्याएं आई हैं ... मैंने 3.2 में कोशिश नहीं की है, शायद यह अभी तय है। – otter606

संबंधित मुद्दे