2010-09-14 11 views
40

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

आपके पास स्प्रिंग एमवीसी कंटेनर एक दिनांक का प्रतिनिधित्व करने वाले अनुरोध पैरामीटर को कैसे बांधता है?

किसके बारे में बात करते हुए, स्प्रिंग एमवीसी किसी दिए गए अनुरोध पैरामीटर के प्रकार को कैसे निर्धारित करता है?

धन्यवाद!

उत्तर

62

स्प्रिंग एमवीसी किसी दिए गए अनुरोध पैरामीटर के प्रकार को कैसे निर्धारित करता है?

वसंत ServletRequestDataBinder का उपयोग अपने मूल्यों को बांधने के लिए करता है। प्रक्रिया के रूप में

/** 
    * Bundled Mock request 
    */ 
MockHttpServletRequest request = new MockHttpServletRequest(); 
request.addParameter("name", "Tom"); 
request.addParameter("age", "25"); 

/** 
    * Spring create a new command object before processing the request 
    * 
    * By calling <COMMAND_CLASS>.class.newInstance(); 
    */ 
Person person = new Person(); 

इस प्रकार वर्णित किया जा सकता ...

/** 
    * And Then with a ServletRequestDataBinder, it bind the submitted values 
    * 
    * It makes use of Java reflection To bind its values 
    */ 
ServletRequestDataBinder binder = ServletRequestDataBinder(person); 
binder.bind(request); 

परदे के पीछे, DataBinder उदाहरणों आंतरिक रूप से एक BeanWrapperImpl उदाहरण है, जिसमें जिम्मेदार है के लिए आदेश वस्तु के मूल्यों की स्थापना का उपयोग करता है। getPropertyType विधि के साथ, यह संपत्ति प्रकार को पुन: प्राप्त

आप ऊपर (बेशक, एक नकली का उपयोग करके) प्रस्तुत अनुरोध देखते हैं, तो वसंत

BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person); 

Clazz requiredType = beanWrapper.getPropertyType("name"); 

और फिर

beanWrapper.convertIfNecessary("Tom", requiredType, methodParam) 
कॉल करेंगे

स्प्रिंग एमवीसी कंटेनर एक दिनांक का प्रतिनिधित्व करने वाले अनुरोध पैरामीटर को कैसे बांधता है?

आप डेटा जो विशेष रूपांतरण की जरूरत के मानव के अनुकूल प्रतिनिधित्व है, तो आप रजिस्टर करना होगा एक PropertyEditor उदाहरण के लिए, java.util.Date क्या 13/09/2010 है पता नहीं है, तो आप स्प्रिंग

बता

स्प्रिंग, निम्नलिखित PropertyEditor

binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { 
    public void setAsText(String value) { 
     try { 
      setValue(new SimpleDateFormat("dd/MM/yyyy").parse(value)); 
     } catch(ParseException e) { 
      setValue(null); 
     } 
    } 

    public String getAsText() { 
     return new SimpleDateFormat("dd/MM/yyyy").format((Date) getValue()); 
    }   

}); 
का उपयोग करके यह मानव के अनुकूल तिथि परिवर्तित

जब convertIfNecessary विधि बुला, स्प्रिंग किसी भी registere के लिए लग रहा है डी PropertyEditor जो सबमिट मूल्य को बदलने का ख्याल रखता है। अपने PropertyEditor रजिस्टर करने के लिए है, तो आप भी कर सकते हैं

स्प्रिंग 3,0

@InitBinder 
public void binder(WebDataBinder binder) { 
    // as shown above 
} 

पुरानी शैली स्प्रिंग 2.x

@Override 
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { 
    // as shown above 
} 
+0

आपको बहुत बहुत धन्यवाद। –

+1

वसंत 2.5.x में @InitBinder भी है: http://static.springsource.org/spring/docs/2.5.x/reference/mvc.html#mvc-ann-initbinder – Rihards

+2

धन्यवाद क्योंकि यह एक प्रतीत होता है व्यापक उत्तर लेकिन गैर-विशेषज्ञों के लिए यह वास्तव में एक साधारण व्यावहारिक उदाहरण शामिल करने में मदद करेगा। – Marquez

30

आर्थर की बहुत पूरा जवाब करने के लिए पूरक में: एक सरल तिथि के मामले में क्षेत्र, आपको पूरे PropertyEditor को लागू करने की आवश्यकता नहीं है। आप केवल CustomDateEditor का उपयोग कर सकते हैं, जिसमें आप बस उपयोग करने के लिए दिनांक प्रारूप पास करते हैं:

//put this in your Controller 
//(if you have a superclass for your controllers 
//and want to use the same date format throughout the app, put it there) 
@InitBinder 
private void dateBinder(WebDataBinder binder) { 
      //The date format to parse or output your dates 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
      //Create a new CustomDateEditor 
    CustomDateEditor editor = new CustomDateEditor(dateFormat, true); 
      //Register it as custom editor for the Date type 
    binder.registerCustomEditor(Date.class, editor); 
} 
+0

अपने कोड में कुछ टिप्पणियां जोड़ने से ओपी को आपके उत्तर प्रस्ताव को समझने में मदद मिलेगी। इसे जांचें [मेटाएसओ प्रश्न] (http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good-answer-to-a-question) और [जॉन स्कीट: कोडिंग ब्लॉग] (http://msmvps.com/blogs/jon_skeet/archive/2009/02/17/answering-technical-questions-helpfully.aspx) सही उत्तर देने के तरीके पर। – Yaroslav

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