दिलचस्प पोस्ट
स्मृति में एक बाइट का आकार – जावा सीएसएस का उपयोग करके एचआईएल और ब्लू इम्ग एंड डिव का HTML Normalize.css और रीसेट सीएसएस के बीच अंतर क्या है? सेट सामग्री ऊंचाई 100% जेक्जरी मोबाइल के साथ मूल्य जोड़ने से पहले PHP सरणी को घोषित करना आवश्यक है? फ़ंक्शन रिटर्न मान कैश करने के लिए कोई डेकोरेटर है? मॉडल मैट्रिक्स को रूपांतरित करें IOS पर UISearchBar घटक के पृष्ठभूमि रंग के अंदर कैसे बदलना है एक उप-ग्रिड में ग्रिड डेटा पर jqGrid पुनरावृत्त सूची से इनहेरिट करना <टी> Utf8 और latin1 के बीच अंतर Html स्रोत से सभी लाइन ब्रेक निकालें Linux में pthread_create के लिए अनिर्धारित संदर्भ अन्य समान वर्गों पर हैंडलर का सर्वोत्तम उपयोग करें बूटस्ट्रैप 4 में लंबवत संरेखण

Struts2: मानचित्र के अंदर "ऑब्जेक्ट की सूची" के मूल्यों को अद्यतन करना

एक ऑब्जेक्ट ऑब्जेक्ट है जिसमें ऑब्जेक्टब की एक सूची है TreeMap अंदर एक ObjectB इस TreeMap में कुंजी के रूप में एक String और मूल्य के रूप में अन्य ऑब्जेक्ट ObjectC की एक List है। इस TreeMap और अंदर की list को jsp पर प्रदर्शित किया गया है s:iterator और s:textfield और यह ठीक से प्रदर्शित किया जा रहा है। यानी एस के अंदर "मान": टेक्स्टफील्ड सही हैं अब, समस्या तब होती है जब टेक्स्टफील्ड को संशोधित किया जाता है हम एक्शन क्लास में ऑब्जेक्ट के भीतर संशोधित मानों को कैसे कैद कर सकते हैं? यहां दिए गए कोड के साथ, कुंजी ("कुंजी 1") कार्रवाई में आती है लेकिन मान शून्य है।

जावा कोड

 public class ObjectA implements Serializable { private Integer attr1; private List<ObjectB> objB; //...getters and setters.... public class ObjectB implements Serializable { private Integer attr11; private TreeMap<String,List<ObjectC>> allPlainFields; // ...getters and setters.... public class ObjectC implements Serializable { private Integer attr111; public String attr112; // ...getters and setters.... 

जेएसपी कोड

 <s:iterator value="objA.objB" var="currentObjB" status="currentGroupStatus"> <s:iterator value="#currentObjB.allPlainFields" var="parentMap" status="headerStatus"> <s:iterator value="#parentMap.value" var="fieldList" status="fieldStatus"> <s:textfield name="objA.objB[%{#currentGroupStatus.index}].allPlainFields['%{#parentMap.key}'][%{#fieldStatus.index}].attr112"/> </s:iterator> </s:iterator> 

एचटीएमएल गाया गया: <input type="text" id="review-act1_objA_objB_0__allPlainFields_'Key1'__6__attr112" value="Correct Value" name="objA.objB[0].allPlainFields['Key1'][0].attr112">

ग्रहण के "VAriables" दृश्य में ऑब्जेक्ट संरचना दिखाती है :

 objA Object A (id=955) objB ArrayList<E> (id=966) elementData Object[10] (id=967) [0] ObjectB (id=968) allPlainFields TreeMap<K,V> (id=972) comparator null descendingMap null entrySet TreeMap$EntrySet (id=979) keySet null modCount 1 navigableKeySet null root TreeMap$Entry<K,V> (id=980) size 1 values null [1] ObjectB (id=969) [2] ObjectB (id=970) [3] ObjectB (id=971) [4] null [5] null [6] null [7] null [8] null [9] null modCount 4 size 4 

**** एक्लिप्स "वैरिएबल" दृश्य में, allPlainFields का मान है **: ** {Key1 =}

संपादित करें (27 फरवरी-2013) :

यह कोशिश की लेकिन काम नहीं किया मान jsp पर दिखाई देते हैं लेकिन जब सबमिट किया जाता है, तो वह कार्रवाई में नहीं आते हैं:

Action क्लास में:

 private TreeMap<String,ObjectCList> testTreeMap = new TreeMap<String,ObjectCList>(); //get,set and setting two keys in map "mykey1" and "mykey2" 

ObjectCList वर्ग में:

 private ArrayList<ObjectC> paramMdlList; //default constructor, get, set 

JSP :

 <s:form id="test-map" method="post"> <s:iterator value="testTreeMap" var="pMap" status="hStatus"> <li><label><s:property value="%{#pMap.key}" /></label> <s:iterator value="%{#pMap.value.paramMdlList}" var="pList" status="innerStatus"> <s:textfield name="testTreeMap['%{#pMap.key}'].paramMdlList[%{#innerStatus.index}].attr111"/> <s:textfield name="testTreeMap['%{#pMap.key}'].paramMdlList[%{#innerStatus.index}].attr112"/> </s:iterator> </li> </s:iterator> <s:submit value=" " type='button' id="btnh1" action="saveTreeMap"> <span>Save TreeMap</span> </s:submit> </s:form> 

जब फ़ॉर्म सबमिट किया जाता है, तो updateTreeMap विधि को कहा जाता है। नक्शा मुद्रित किया गया है जैसा कि यहां बताया गया है :

 public String updateTreeMap(){ for (Map.Entry<String, ObjectCList> entry : testTreeMap.entrySet()) { System.out.println(entry.getKey() + "/" + entry.getValue()); } return SUCCESS; 

}

"मुद्रित" क्या है: mykey1 / mykey2 / यानी शून्य मान

स्क्रीन नीचे जेएसपी में आने वाले मान दिखाती है स्क्रीन दिखा मूल्य jsp में आते हैं

वेब के समाधान से एकत्रित समाधान "Struts2: मानचित्र के अंदर "ऑब्जेक्ट की सूची" के मूल्यों को अद्यतन करना"

आपके नवीनतम अपडेट के अनुसार यदि आप TreeMap Struts2 का उपयोग कर रहे हैं, तो इसके अंदर तत्वों का प्रकार ठीक से निर्धारित नहीं किया जा सकता है। TreeMap से Map लिए testTreeMap घोषणा को बदलें।

 private Map<String,ObjectCList> testTreeMap = new TreeMap<String,ObjectCList>(); 

या testTreeMap साथ com.opensymphony.xwork2.util.Element एनोटेट करें। testTreeMap को बताने के लिए com.opensymphony.xwork2.util.Element एनोटेशन क्या प्रकार मानचित्र के अंदर तत्व हैं com.opensymphony.xwork2.util.Element

 @Element(value = ObjectCList.class) private TreeMap<String,ObjectCList> testTreeMap = new TreeMap<String,ObjectCList>(); 

मैं उत्सुक हो गया और अन्य प्रयोग किया।

मुझे पता चला कि नक्शाओं (और सभी इंटरपोलेशन्स) के भीतर न तो Map , न ही List को इंटरफेस ( List , Map ) के रूप में घोषित किया गया है या उनके कार्यान्वयन के रूप में ( XWork Converter , XWork Converter , XWork Converter ) सही तरीके से XWork Converter द्वारा नियंत्रित किया जाता है XWork Converter

सभी परीक्षण के मामले विफल रहे हैं

शायद यह मेरी गलती है, अगर हम वास्तव में यहाँ कुछ OGNL विशेषज्ञों की आवश्यकता है, क्योंकि पूरे वेब में इस बारे में कुछ भी बात नहीं है।

फिर मैंने कोशिश की जो मुझे पूरा यकीन हो गया था कि वह काम करेगा: कस्टम ऑब्जेक्ट्स में इस जानकारी को शुद्ध OOP रास्ते में OOP

और यह काम किया 🙂

के बजाय

 private ArrayList<ArrayList<String>> outerObjects; 

आप अपनी कार्रवाई में उपयोग कर सकते हैं

 private ArrayList<OuterObject> outerObjects; /* GETTERS AND SETTERS */ public ArrayList<OuterObject> getOuterObjects() { return outerObjects; } public void setOuterObjects(ArrayList<OuterObject> outerObjects) { this.outerObjects = outerObjects; } 

बाह्य ऑब्जेक्ट परिभाषा:

 /* ELSEWHERE IN YOUR PROJECT... */ public class OuterObject{ private ArrayList<InnerObject> innerObjects; /* GETTERS AND SETTERS */ public ArrayList<InnerObject> getInnerObjects() { return innerObjects; } public void setInnerObjects(ArrayList<InnerObject> innerObjects) { this.innerObjects = innerObjects; } } 

इनर ऑब्जेक्ट परिभाषा:

 public class InnerObject{ String innerField; /* GETTERS AND SETTERS */ public String getInnerField() { return innerField; } public void setInnerField(String innerField) { this.innerField = innerField; } } 

प्रीसेट मानों का परीक्षण करने के लिए अपनी क्रिया का वैकल्पिक निष्पादन () विधि:

  InnerObject innerObj1 = new InnerObject(); innerObj1.setInnerField("Inner Value 1"); ArrayList<InnerObject> innerObjArrayList = new ArrayList<InnerObject>(); innerObjArrayList.add(innerObj1); OuterObject outerObj1 = new OuterObject(); outerObj1.setInnerObjects(innerObjArrayList); outerObjects = new ArrayList<OuterObject>(); outerObjects.add(outerObj1); 

जेएसपी :

  <s:form> <s:textfield name="outerObjects[0].innerObjects[0].innerField" /> <s:submit/> </s:form> 

(जब [%{#stat.index}] , बस के लिए List ['%{#stat.index}'] और ['%{#stat.index}'] लिए [%{#stat.index}] उपयोग करें)

वही समाधान हर प्रकार की पुनरावृत्ति संरचना के लिए लागू होता है (संभवतः .create() सामान को छोड़कर .create() को लागू करने के लिए विधि की आवश्यकता होती है)।

बेशक यह हर मामले में आसान नहीं है, आपके उदाहरण में आपके पास पहले से ही एक विशाल संरचना है और यह लगभग दोगुना हो जाएगी , लेकिन यह काम करता है, यह ओओपी है, आपके ओजीएनएल स्पष्ट हो जाएगा (नामों की वजह से) और हालांकि केवल एक ही मार्ग।

नोट: कक्षाएं असली एकांत अकेली कक्षाएं होंगी, Inner Classes नहीं होंगी, एक और मामले जहां ओजीएनएल ऑब्जेक्ट्स को ऑटोवॉयर करने में विफल रहता है।

उम्मीद है की वो मदद करदे


संपादित करें

आपको तब क्या आवश्यकता है, केवल एक और स्तर है:

इसे बदलो:

 private TreeMap<String,List<ObjectC>> allPlainFields; 

इसके लिए

 private TreeMap<String,ObjectX> allPlainFields; 

और एक निजी फ़ील्ड जिसमें एक List<ObjectC> है एक List<ObjectC>

यह काम करेगा।