2010-11-11 14 views
17

एक सामान्य सामान्य उपयोग केस होता है जहां जावा ऑब्जेक्ट्स की एक सूची होती है, जिससे चयन वेब फॉर्म पर किया जा सकता है - आमतौर पर आप प्राथमिक कुंजी का उपयोग करेंगे ऑब्जेक्ट के रूप में ऑब्जेक्ट करें ताकि नियंत्रक या तो लुकअप कर सके, या जो भी ऑब्जेक्ट बनाया/अपडेट किया गया हो, उस कुंजी को बस बांधें।स्प्रिंग एमवीसी - ऑब्जेक्ट चयन ड्रॉप डाउन - कोई प्राथमिक पहचानकर्ता

मेरी समस्या यह है कि चुनने की सूची लगातार, कुंजी वाली वस्तुएं नहीं होती है, वे एक ऐसे सेवा से व्यवसाय मॉडल हैं जिनके पास निहित डेटा के आधार पर उन्हें पुनर्प्राप्त करने का कोई उचित तरीका नहीं है। नीचे कुछ psuedo कोड है जहां पृष्ठ पर फू की एक सूची दी गई है, और हम आसानी से नियंत्रक को संवाद कर सकते हैं कि Foo का नाम सबमिट करें, लेकिन अगर फू के अन्य फ़ील्ड सबमिट किए जाने की आवश्यकता है तो क्या होगा?

नियंत्रक:

referenceData() { 
    ... 
    List foos = fooService.getFoosForBar(bar) 
    return { 'foos', foos } 
} 

jsp:

<form> 
    ... 
<spring:bind path="formData.foo"> 
    <select name="<c:out value="${status.expression}" />"> 
     <c:forEach items="${foos}" var="foo"> 
      <option value="<c:out value="${foo.name}"/>"> 
       <c:out value="${foo.name}"/> 
      </option> 
     </c:forEach> 
    </select> 
</spring:bind> 
    ... 
</form> 

कुछ उदाहरण समाधान फू की अन्य संपत्तियों सबमिट करें और उन्हें चयन के रूप में सिंक में रखने के लिए छिपा क्षेत्रों का उपयोग किया जाएगा बदल गया है, लेकिन मैं पसंद करते हैं ऐसी स्थिति में जावास्क्रिप्ट का उपयोग न करें जहां यह संभवतः भ्रम जोड़ देगा। निश्चित रूप से इसे पूरा करने के अन्य तरीके भी हैं।

मेरा प्रश्न यह है कि इसे पूरा करने के लिए कोई मानक अभ्यास मौजूद है? या मुझे बस ऐसा करने के अपने तरीके से आना चाहिए? यदि संभव हो तो मैं पहियों को पुन: आविष्कार नहीं करना चाहूंगा, और यह इतना आम बात है कि यह सिर्फ विंग करने का सबसे अच्छा तरीका नहीं हो सकता है।

उत्तर

7

अपनी सीमाओं के आधार पर, आपको विकल्प के मूल्य के रूप में foos के अन्य डेटा memebers एन्कोड करना होगा।
<option label="${foo.name}" value="${foo.encodedValues}"/>
encodedValues विधि कुछ इस तरह दिख सकता है:

 

    private String SEPARATOR = ","; 

    public String getEncodedValues() 
    { 
     final StringBuffer returnValue = new StringBuffer(); 

     returnValue.append(field1); 
     returnValue.append(SEPARATOR); 
     returnValue.append(field2); 
     returnValue.append(SEPARATOR); 
     returnValue.append(field3); 

     return returnValue.toString(); 
    } 
 

आप चयन की जरूरत है कि मूल्यों इनकोडिंग की है, के एक नंबर है, तो आप एक वर्ग है कि एन्कोडिंग और डिकोडिंग करता है बना सकते हैं कोड को केंद्रीकृत करने के लिए इन मानों में से।

+0

मैंने स्ट्रिंग से प्रतिनिधि ऑब्जेक्ट में जाने के लिए नियंत्रक में एक कस्टम बाइंडर पंजीकृत करके इस दृष्टिकोण का उपयोग किया है (जो केंद्रीकृत है कोड जो dwb सुझाव देता है)। – Nate

3

आप पोस्ट अनुरोध में वापस लाने के लिए सूची में तत्व के सूचकांक का उपयोग कर सकते हैं।

<spring:bind path="formData.fooIndex"> 
    <select name="<c:out value="${status.expression}" />"> 
    <c:forEach items="${foos}" var="foo" varStatus="i"> 
     <option value="<c:out value="${i.index}"/>"> 
      <c:out value="${foo.name}"/> 
     </option> 
    </c:forEach> 
    </select> 
</spring:bind> 

अपनी पोस्ट हैंडलर में, का उपयोग foos.get(formData.getFooIndex()) कम महत्वपूर्ण चीज़ें प्राप्त और पोस्ट अनुरोध के बीच बदल सकते हैं, तो आप सत्र में foos डाल करने के लिए इतना है कि आप निश्चित रूप से अपने पद हैंडलर में एक ही वस्तु संदर्भ के रूप में आप में किया था की जरूरत है हैंडलर प्राप्त करें।

+0

मुझे सूची फिर से नहीं मिल सकती है और उम्मीद है कि इसे सत्र में डालना आदर्श नहीं है - अगर फॉर्म पोस्ट नहीं किया गया है, और यहां तक ​​कि यदि यह भी हो, तो यह संभव है कि सूची बस रहेगी सत्र समाप्त होने तक सत्र। पोस्ट हैंडलर की सूची रखने की अनुमति देने के लिए मैं और क्या कर सकता हूं? अनुरोध बहुत छोटा शब्द है, लेकिन सत्र बहुत लंबा शब्द – walnutmon

+0

है, फिर आप

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