क्लोजर में सर्वलेट कार्यान्वयन के उदाहरण के लिए आप रिंग्स जेटी एडाप्टर में देखना चाह सकते हैं। स्रोत here (1.1 रिलीज के लिए स्रोत से लिंक) उपलब्ध है। विशेष रूप से, उस नामस्थान में परिभाषित पहला फ़ंक्शन, proxy-handler
जेट्टी द्वारा प्रदान किए गए एक सार वर्ग के आधार पर एक हैंडलर देता है।
यदि आप एक समान दृष्टिकोण को लागू करना चुनते हैं (जावा क्लास पर अपने सर्वलेट को कुछ तैयार किए गए विधि इंप्रेशन प्रदान करते हैं), तो आपको proxy
का उपयोग करना होगा; अगर आपको केवल इंटरफेस को लागू करने की आवश्यकता है (बिना सबक्लासिंग के), तो आप शायद reify
चाहेंगे। मैक्रोज़ उपयोगी होंगे या नहीं, इस पर निर्भर करता है कि कार्यान्वयन के कौन से हिस्से तय किए जाएंगे; रिंग की जेट्टी एडाप्टर मैक्रोज़ के उपयोग से लाभ नहीं उठाएगा, लेकिन आप (उदाहरण के लिए यदि आप वर्ग को एक तर्क में लागू करने के लिए कक्षा/विस्तारित करना चाहते हैं, जैसा कि सवाल इंगित करता है)।
किसी भी मामले में, जो भी कार्यक्षमता आप कार्यान्वित करने के लिए चुनते हैं उसे इंटरफेस या प्रोटोकॉल का हिस्सा बनने की आवश्यकता होगी। तो, को लागू करने javax.servlet.Servlet
प्लस एक अतिरिक्त आपरेशन foo
इस प्रकार दिखाई देंगे:
(import (javax.servlet Servlet ServletRequest ServletResponse))
(defprotocol PFoo
(foo [this x y z]))
(reify
Servlet
(service [this ^ServletRequest req ^ServletResponse res]
...)
;; other Servlet methods here...
PFoo
(foo [this x y z]
...))
फिर आप एक मैक्रो में इस लपेट किसी भी वांछित वाक्यात्मक चीनी उपलब्ध कराने के लिए कर सकता है। ध्यान दें कि reify
वास्तव में, जिस तरह आप इंटरफ़ेस/प्रोटोकॉल के नाम और विधि परिभाषाओं बिछा अपने शरीर के अंदर के बारे में परवाह नहीं करता तो आप यह है कि अगर अधिक सुविधाजनक है अपने मैक्रो फेंकना
(reify
Servlet PFoo ... ; other interfaces & protocols
(service [...] ...)
(foo [...] ...)
;; other methods
)
हो सकता था।
एक मैक्रो का एक स्केच एक सर्वलेट इंटरफ़ेस का एक नाम लेने को लागू करने (संभवतः javax.servlet.Servlet
विस्तार) और कुछ अतिरिक्त तरीकों के साथ एक प्रोटोकॉल इंजेक्शन:
(defprotocol PFancyServlet
(do-get [this ...])
(do-post [this ...]))
(defmacro servlet [servlet-iface & meths]
`(reify ~servlet-iface PFancyServlet
[email protected]))
meths
do-get
और do-post
शामिल करने की आवश्यकता होगी और साथ ही servlet-iface
विधियां; यह सुनिश्चित करने के लिए कि आप यह मामला है, आप कुछ तर्क सत्यापन जोड़ सकते हैं। एक उदाहरण कॉल:
(servlet SomeServletInterface
(service [this ...] ...)
;; ...
(do-get [this ...] ...)
(do-post [this ...] ...))
बहुत बढ़िया! पहले पैरामीटर के रूप में 'इस' के बिना मैं कैसे कार्य कर सकता हूं? (सर्वलेट इंडेक्स सर्लेट (प्राप्त करें [अनुरोध प्रतिक्रिया]) – Chiron
आपको विधि निकायों में 'इस' का उपयोग करने की आवश्यकता हो सकती है (यदि विधियां एक-दूसरे को कॉल करती हैं, तो कहें)। ऐसा कहा जा रहा है कि, आपका मैक्रो मनमाने ढंग से 'मेथ' को प्रीप्रोसेस कर सकता है, विशेष रूप से यदि आप इसे उपयोगकर्ता-स्तरीय वाक्यविन्यास में छोड़ देते हैं तो 'यह' वापस जोड़ना: '([[मेथ-नाम पैराम्स और बॉडी] मेथ] \ ' (~ मेथ-नाम ~ (वीसीसी (विपक्ष 'यह पैरा)) ~ @ शरीर))' या कुछ समान है। इससे एक विस्तार उत्पन्न होगा जिसमें 'यह' प्रत्येक विधि के शरीर में "जादू पैरामीटर" के रूप में उपलब्ध होगा। या यदि आप यही चाहते हैं तो "इस" को 'छुपाएं' 'के विस्तार में '' इस 'के स्थान पर' (gensym "this __") का उपयोग कर सकते हैं। –
इसके अलावा, 'प्रॉक्सी' पहले से ही 'यह' अंतर्निहित बनाता है ('' dter प्रॉक्सी) 'देखें), 'definterface',' gen-interface 'और' gen-class 'के रूप में; 'reify',' deftype', 'defrecord', 'defprotocol' नहीं। (पुन: 'जीन-क्लास', यह 'जीन-क्लास' फॉर्म में विधि घोषणा है जो 'इस' को छोड़ देता है; कार्यान्वयन कार्यों को इसे स्पष्ट करना चाहिए।) –