2011-11-07 13 views
7

मेरे पास कई कक्षाओं में फैले कई नियंत्रक विधियां हैं। प्रत्येक विधि Model ऑब्जेक्ट लेती है और मेरी सभी विधियां मॉडल में कुछ साझा गुणों को पॉप्युलेट करती हैं (अधिकतर नेविगेशन बार डिस्प्ले को नियंत्रित करें)। क्या वसंत में 'आधार' विधि को प्लग करने का कोई तरीका है? मुझे एक तरीका चाहिए जो मेरी साझा संपत्तियों को पॉप्युलेट कर सकता है और फिर विशिष्ट नियंत्रक विधि (या उस मामले के लिए उलट) में जा सकता है। क्या कोई जानता है कि ऐसा कैसे करें?स्प्रिंग फ्रेमवर्क एमवीसी बेस कंट्रोलर विधि

उत्तर

3

HandlerIntercepto आर की तरह लगता है एक अच्छा दृष्टिकोण हो सकता है।

यह थोड़ा एओपी जैसा है - आप एक कक्षा को परिभाषित कर सकते हैं जिसमें PreHandle या PostHandle विधि है, और कॉन्फ़िगर करें कि यह कौन से अनुरोध चलेंगे। आपके मामले में आप शायद PostHandle चाहते हैं, क्योंकि इससे आपको ModelAndView तक पहुंच मिल जाएगी, ताकि आप इसे साझा किए गए आइटमों के साथ पॉप्युलेट कर सकें।

+0

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

2

ले जा सकते हैं वसंत और वसंत MVC में कई विस्तार अंक के होते हैं:

  • HandlerInterceptor - प्रत्येक हैंडलर विधि
  • Spring AOP अवरोधन करने का आसान तरीका - इससे पहले कि/सलाह के बाद सभी अपने नियंत्रकों मिलान
  • WebArgumentResolver - शायद आप किसी भी तरह से तर्कों को हल करने और नियंत्रक को कॉल करने से पहले उन्हें संसाधित कर सकते हैं?
1

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

org.springframework.web.servlet.HandlerInterceptor में 'पोस्टहैंडल' विधि है जो आपको अनुरोध, नियंत्रक जिसने अनुरोध को संभाला है, और मॉडलमैप तक पहुंच प्रदान करता है। आपको बस इतना ही चाहिए। यदि आपको नियंत्रक से कुछ नियंत्रण की आवश्यकता है, तो आप हमेशा मेटा-डेटा को इंगित कर सकते हैं, उदाहरण के लिए, हेडर का कौन सा वर्ग इसका उपयोग करता है (फिर भविष्य में जब आपको इसे बदलना होगा, यह एक एक्सएमएल या एनोटेशन में एक स्ट्रिंग है, । बजाय बदल रहा है क्या वर्ग आप से विरासत और सभी कि इसके संदर्भ में)

आप उन्हें इस तरह चालू करें:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <list> 
      <bean class="a.package.MyHandlerInterceptor"/> 
     </list> 
    </property> 
</bean> 
संबंधित मुद्दे