2013-02-05 12 views
5

में दिनांक प्रारूप को कैसे सत्यापित करें मैं वसंत के लिए नया हूं, और मैं एक प्रारूप बनाने की कोशिश कर रहा हूं जो दिनांक प्रारूप को मान्य करता है (यानी: यह उपयोगकर्ता को MM/dd/yyyy "प्रारूप के साथ केवल तारीख स्वीकार करता है यदि उपयोगकर्ता रखता है "mm-dd-yyyy" यह एक त्रुटि संदेश दिखाना चाहिए)।स्प्रिंग फॉर्म

मैं इसे वसंत के साथ कैसे प्राप्त कर सकता हूं?

मैं पोस्ट और this और this आदि के उत्तर, कि नियंत्रक में @InitBinder उपयोग करने की अनुशंसा (मैंने कोशिश की लेकिन यह btw काम नहीं कर सके) का एक बहुत पढ़ा है। लेकिन क्या होगा यदि मेरे पास अलग-अलग तिथियों के साथ एक फॉर्म है? या यदि मेरा नियंत्रक विभिन्न रूपों से एकाधिक पोस्ट अनुरोध प्रबंधित करता है, और प्रत्येक को अलग-अलग दिनांक सत्यापन की आवश्यकता होती है?

वर्तमान में मैं इस फार्म है:

<form:form action="getReportFile.html" commandName="staticReportForm"> 
      <table> 
       <tr> 
        <td>Reports:</td> 
       </tr> 
       <tr> 
        <td><form:select path="report" items="${staticReports}"/>       
        </td> 
       </tr> 
       <tr> 
        <td>Date (MM/DD/YYYY) (empty for most recent possible):<FONT color="red"><form:errors 
           path="date" /></FONT></td> 
       </tr> 
       <tr> 
        <td><form:input path="date" /></td> 
       </tr> 
       <tr> 
        <td><input type="submit" value="Submit" /></td> 
       </tr> 
      </table>    
     </form:form> 

और यह सेम प्रपत्र समर्थन होगा (@DateTimeFormat एनोटेशन केवल यदि आप सही प्रारूप डाल यह काम कर):

public class StaticReportForm { 
     @NotEmpty   
     private String report;  
     @DateTimeFormat(pattern="MM/dd/yyyy") 
     private Date date; 

    public String getReport() { 
     return report; 
    } 

    public void setReport(String report) { 
     this.report = report; 
    } 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 


} 

उत्तर

7

मैं पता नहीं है कि वसंत में ऐसा करने का सीधा तरीका है, लेकिन जिस तरह से मैंने इसे किया है वह jQuery की डेटपिकर और इनिटबिंडर का संयोजन है। जे एस में फिर

<form:input cssClass="datepicker" path="someProperty" readonly="true" /> 

:

जे एस पक्ष में, आप एक बनाने के

$(document).ready(function() { 
    $('.datepicker').datepicker(); 
}); 

नियंत्रक तरफ, इस प्रकार की तरह एक विधि बनाने के लिए:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 
    sdf.setLenient(true); 
    binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true)); 
} 

यहां से आप एक अच्छा, सुंदर संदेश बनाने के लिए अपने संसाधन बंडल में टाइपमिस्मेच संदेश बना सकते हैं। उपयोगकर्ता मैन्युअल रूप से फ़ील्ड में टाइप नहीं कर पाएगा, बल्कि इसके बजाय केवल jQuery डेटपिकर का उपयोग करने में सक्षम होगा, जो आवश्यकतानुसार दिनांक को प्रारूपित करेगा (मुझे लगता है कि डिफ़ॉल्ट एमएम/डीडी/yyyy है)। जिस स्थिति में वे एक तिथि दर्ज करने में कामयाब होते हैं, वसंत स्ट्रिंग को दृश्य से स्ट्रिंग को अपेक्षित तिथि में बदलने के लिए कॉन्फ़िगर किया जाएगा। यदि यह विफल हो जाता है, तो आपको बाइंडिंग रीसेट्स में एक त्रुटि मिलती है (यदि आप इसे अपने विधि हस्ताक्षर में शामिल करते हैं)। जैसा कि मैंने पहले बताया था, आप इस विधि को कस्टमाइज़ कर सकते हैं, लेकिन अपने संसाधन बंडल में एक कस्टम प्रकार मिस्चैच संदेश सेट अप कर सकते हैं।

संपादित करें: मेरी explaination के रूप में अतिरिक्त विवरण जोड़ने स्पष्ट रूप से पर्याप्त स्पष्ट नहीं था ऊपर ...

सबसे पहले, एक बीन या कुछ और अपने मॉडल गुण के रूप में कार्य करने के लिए (है कि व्यू से करने के लिए इधर-उधर भेजे बनाने नियंत्रक)। सुनिश्चित करें कि इसमें कम से कम एक तिथि है।

public class SomeBean { 
    private Date someDate; 
    // ...additional properties, getters, setters... 
    public Date getSomeDate() { return someDate; } 
    public void setSomeDate(Date date) { somedate = date; } 
} 

अब आपको नियंत्रक की आवश्यकता है।मैं अपने मॉडल

@SessionAttribute. 
@Controller 
@RequestMapping("/somePath") 
@SessionAttributes({"someFormBean"}) 
public class SomeController { 
    /** 
    * Handler method 
    */ 
    @RequestMapping() 
    public String defaultView(@ModelAttribute("someFormBean") SomeBean someFormBean, Model uiModel) { 
     // Do something in your default view 
     return "someDefaultView"; // Assuming you have a ViewResolver, like JspViewResolver or Tiles 
    } 

    /** 
    * Submission Handler method 
    */ 
    @RequestMapping(method = RequestMethod.POST 
    public String submit(
     @ModelAttribute("someFormBean") SomeBean someFormBean, 
     BindingResult bindingResults, 
     Model uiModel) { 
     // bindingResults will have your errors from binding 
     if(bindingResults.hasErrors()) { 
      return "errorView"; 
     } else { 
      return "successView"; 
     } 
    } 

    /** 
    * Will be called to create your Model Attribute when its missing 
    */ 
    @ModelAttribute("someFormBean") 
    public SomeBean createSomeBean() { 
     return new SomeBean(); 
    } 

    /** 
    * register property editors 
    */ 
    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 
     sdf.setLenient(true); 
     binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true)); 
     // You can register other Custom Editors with the WebDataBinder, like CustomNumberEditor for Integers and Longs, or StringTrimmerEditor for Strings 
    } 
} 

तो फिर तुम कुछ दृश्य ("someDefaultView" ऊपर नियंत्रक में, मेरे कोड इस उदाहरण में JSP है, स्प्रिंग JSTL टैग लाइब्रेरी का उपयोग कर)

जरूरत के माध्यम से सत्र गुणों गुण बनाने के लिए करना
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt" %> 
<%@ taglib prefix="fn"  uri="http://java.sun.com/jsp/jstl/functions" %> 
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
<html> 
    <head> 
     <script type="text/javascript" src="/resources/jquery/1.7.1/jquery-1.7.1.min.js"></script> 
     <script type="text/javascript" src="resources/jquery.ui/1.8.13/jquery.ui.min.js"></script> 

     <script type="text/javascript"> 
      $(document).ready(function() { 
       $('.datepicker').datepicker(); 
      }; 
     </script> 
    </head> 
    <body> 
     <form:form modelAttribute="someFormBean"> 
      <form:input cssClass="datepicker" path="someDate" readonly="true" /><br /> 
      <form:errors path="a"/><br /><br /> 
      <input type="submit" value="Submit" /> 
     </form:form> 
    </body> 
</html> 

फिर से, मैं Google'ing स्प्रिंग इनिट बाइंडर्स, बाध्यकारी त्रुटियों (टाइपमिस्मैच), और जेएसआर 303 को सत्यापन के लिए अतिरिक्त विकल्पों के लिए अनुशंसा करता हूं, जिनमें से अधिकांश दस्तावेज here है। साथ ही, यदि आप नीचे की त्रुटि को फ़ील्ड में नहीं चाहते हैं, जैसा कि मैंने यहां किया है, तो एक ही स्थान पर सभी त्रुटियों को फिर से शुरू करने के तरीके हैं, जैसे पृष्ठ के शीर्ष पर सभी त्रुटियां डालना। इसकी बहुत विन्यास योग्य है, और मैं गहराई से इसे सब कुछ पर जाने के लायक शायद 20 अन्य पेज टाइप कर सकता हूं। अच्छे उदाहरण और दस्तावेज खोजने में आपको शुरू करने के लिए यह बहुत होना चाहिए।

+0

आपके समय के लिए धन्यवाद! और हाँ, लेकिन ब्राउज़र में जेएस अक्षम होने पर यह असफल हो सकता है, क्या मैं गलत हूं? एकमात्र तरीका मैं देख सकता हूं कि मैं इसे "पुराने स्कूल" के साथ नियंत्रक में पैरामीटर प्राप्त कर रहा हूं और इसे वहां सत्यापित कर सकता हूं। मेरी अज्ञानता में मुझे बैकिंग बीन या सत्यापनकर्ता का उपयोग करके ऐसा करने का एक उपयोगी तरीका नहीं मिल रहा है। तो यदि आपके पास एकाधिक तिथियों के साथ एक बड़ा रूप है और आप इसे वापस करने और उसे सत्यापित करने के लिए एक बीन का उपयोग करना चाहते हैं तो आपको हमेशा नियंत्रक में दिनांक प्रारूप को सत्यापित करना होगा? (मुझे उम्मीद है कि मैं गलत हूं) –

+0

इनटबिंडर क्या करता है। वसंत पंजीकृत संपादक का उपयोग कर स्ट्रिंग को तिथि में बदलने का प्रयास करेगा। यदि यह विफल रहता है, तो यह एक त्रुटि संदेश के साथ बाइंडिंग रीसेट में भर जाता है। डिफ़ॉल्ट एक बहुत बुरा है, लेकिन जैसा कि बताया गया है, आप इसे आसानी से ओवरराइड कर सकते हैं। अपने हैंडलर विधि में, आप बस यह देखने के लिए देखते हैं कि क्या आपको बाइंडिंग रीसेट में त्रुटियां हैं, और यदि आप उन्हें फॉर्म पेज पर वापस भेजते हैं। वसंत आपके फॉर्म पर बाध्यकारी रीसेट त्रुटियों को संभालने का था, और इसकी सुंदर अच्छी तरह से प्रलेखित। यहां तक ​​कि फ़ील्ड को लाल और संदेश छेड़छाड़ करने के लिए सीएसएस भी सेट अप करता है। – CodeChimp

+0

मैं यह कैसे कर सकता हूं? क्या आप मेरे दिए गए प्रश्न के लिए वह उत्तर पोस्ट कर सकते हैं? –

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