2010-01-26 10 views
8

हम वर्तमान में एक पुराने वेबपैप में कुछ नई विशेषताएं जोड़ रहे हैं जो सामने के लिए किसी भी ढांचे के बिना केवल जेएसपी का उपयोग कर रहा था। हमने हाल ही में स्प्रिंग जोड़ा है, और हम अपने संशोधित जेएसपी में अपने सेम को ऑटोवायर करना चाहते हैं, जबकि स्प्रिंगएमवीसी, स्ट्रूट 2 या टेपेस्ट्री 5 का उपयोग करने के लिए सबकुछ फिर से लिखना नहीं है।जेएसपी में स्प्रिंग बीन्स को स्वचालित करने का सबसे साफ तरीका क्या है?

हम प्रकार से autowiring उपयोग कर रहे हैं तो यह JSP में इस तरह की कुछ कोड प्राप्त रहा है, जबकि पहले से वेब अनुप्रयोग संदर्भ ("वैप" के रूप में) हो रही है:

MyDao myDao = (MyDao) wap.getBeansOfType(MyDao.class).values().toArray()[0]; 

हम नहीं चाहते हैं इस तरह के कोड का उपयोग करने के लिए, बल्कि हमारे जेएसपी में सीधे हमारे बीन्स इंजेक्ट करें क्योंकि हम @Autowired एनोटेशन का उपयोग कर एक व्यापार बीन में करेंगे।

वास्तव में हम अपने जेएसपी में हमारे सेम इंजेक्ट करने के सबसे साफ तरीकों की तलाश में हैं। तुम क्या इस्तेमाल करते हो ?

+0

SpringMVC के बारे में अच्छी बात यह है कि आप पूरे गोली खाकर की जरूरत नहीं है कि है। आप वसंत के उन हिस्सों को चुन सकते हैं जिन्हें आप उपयोग करना चाहते हैं। स्टीफन सी ने जो संकेत दिया और रीफैक्टरिंग शुरू करने के लिए शायद यह क्लीनर होगा। – SWD

उत्तर

9

आप उपयोग कर सकते हैं वसंत के ContextExposingHttpServletRequest:

HttpServletRequest डेकोरेटर एक दिया में सभी वसंत सेम सुलभ WebApplicationContext अनुरोध के रूप में गुण, आलसी के माध्यम से एक विशेषता पहुँचा हो जाता है एक बार जाँच करता है कि।

यह आपके नियंत्रक कोड की आवश्यकता होती है एक ContextExposingHttpServletRequest में मूल HttpServletRequest रैप करने के लिए होगा, और फिर आगे कि JSP को। यह या तो विशिष्ट नामित सेम, या संदर्भ में हर बीन का पर्दाफाश कर सकता है।

बेशक, यह आपके जेएसपी से समस्या को आपके नियंत्रक कोड में बदल देता है, लेकिन शायद यह एक और अधिक प्रबंधनीय समस्या है।

+1

जेएसपी के शीर्ष पर फ़िल्टर (इसे सर्वलेट के बजाए) में बदलने के बारे में आप क्या सोचते हैं, जो वसंत संदर्भ से सभी बीन्स प्राप्त करते हैं और उन्हें सिमिल प्राप्त करने के लिए अपेक्षित इंटरफ़ेस द्वारा नामित अनुरोध स्कोप में डाल दिया जाता है? – temsa

+1

अच्छा विचार, काम करना चाहिए – skaffman

+0

(+1) अनुरोध-रैपर के साथ अच्छा पकड़। अभी भी, '@ ऑटोवायर' इस तरह प्रयोग योग्य नहीं होगा? – Bozho

7

आप सीधे @Autowired का उपयोग नहीं कर सकते हैं क्योंकि आपके जेएसपीएस और सर्लेट दोनों servlet conainer द्वारा तत्काल हैं। इसलिए वे वसंत संदर्भ का हिस्सा नहीं हैं और इसलिए उनकी निर्भरता इंजेक्शन नहीं दी गई है।

आप कर सकते हैं:

  1. चाल सभी कोड है कि शुद्ध सर्वलेट्स के बजाय JSPs में - JSPs में केवल प्रस्तुति छोड़ दें।
  2. अपने सर्वलेट्स पर
  3. उपयोग @Configurable (लिंक किए गए डॉक्स में वर्णित के रूप में और, एक javaagent जोड़ने)

एक और तरीका है, मैन्युअल रूप से वर्तमान संदर्भ के सर्वलेट हिस्सा बनाने के लिए है। यह दोनों JSPs और सर्वलेट में संभव है:

public void init() { 
    WebApplicationContext ctx = WebApplicationContextUtils 
     .getRequiredWebApplicationContext(getServletContext()); 

    AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory(); 

    bf.autowireBean(this); 
} 

यह @Autowired एनोटेट निर्भरता को हल करेंगे।

अब, मुझे यकीन नहीं है कि सर्वलेट कंटेनर को का उपयोग केवल एक सर्वलेट वर्ग का उदाहरण उपयोग करने की आवश्यकता है या नहीं। यदि नहीं, तो आप उपरोक्त कोड को निर्भरता (getDao()) के लिए गेटटर-विधि में बेहतर स्थान पर रखेंगे और @Autowired संपत्ति null है (यानी सर्वलेट-वर्ग का एक और उदाहरण कंटेनर द्वारा उपयोग किया जाता है) - उपर्युक्त ऑपरेशन करें।


सभी ने कहा कि, वास्तव में एक वेब रूपरेखा (जिन्हें आप सूचीबद्ध किसी भी) का उपयोग पर विचार करें। जेएसपीएस में तर्क रखना पूरी तरह से गलत है, समर्थन करना मुश्किल है, पढ़ने में मुश्किल है, आदि

+1

फ़िल्टर के लिए आधार के रूप में http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/filter/DelegatingFilterProxy.html का उपयोग कर सकते हैं I निश्चित रूप से जानते हैं, लेकिन आप कर सकते हैं नई सुविधाओं को जोड़ने के दौरान, 5 दिनों (पूरे विभाजन और व्यापार तर्क सहित) में एक संपूर्ण सॉफ़्टवेयर को फिर से लिखना नहीं है। वास्तव में हमें वहां डीएओ का उपयोग करने से बचना चाहिए और फिर केवल व्यापार वस्तु पर भरोसा करना चाहिए, लेकिन यह केवल कुछ पहले ही लिखित कोड है जिसे मैं कुछ समय में फिर से लिख नहीं सकता। घर के बने सिंगलेट्स और कंपनी के बजाय ऐप को स्प्रिंग/हाइबरनेट/जेपीए में बदलने के लिए आश्वस्त प्रबंधकों को पहले से ही एक बड़ा दर्द था। वे केवल एक लागत के रूप में देखते हैं ... – temsa

4

मुझे संदेह है कि एक जेएसपी में निर्भरता को इंजेक्ट करने का एक साफ तरीका है।

मुझे लगता है कि स्वच्छ समाधान, एसएसपीएमवीसी या आपके द्वारा उद्धृत विकल्पों में से एक का उपयोग करके जेएसपी से व्यापार तर्क प्राप्त करने के लिए अपने कोड को दोबारा शुरू करना होगा।

एक या अधिक न्यूनतम नियंत्रकों के साथ शुरू करें जो इंजेक्शन बीन्स के साथ विशेष रूप से जेएसपी के अनुरोध को पास करते हैं; @ स्काफमैन का जवाब ऐसा करने का एक तरीका देता है, या आप इसे अधिक चुनिंदा तरीके से कर सकते हैं। फिर जेएसपी से और नियंत्रकों में कोड को धीरे-धीरे माइग्रेट करें।

5

क्या अधिभावी jspInit() विधि और जोड़ने Autowiring समर्थन के बारे में:

<%@ page import="com.example.ExampleService"%> 
<%@ page import="org.springframework.beans.factory.annotation.Value"%> 
<%@ page import="org.springframework.beans.factory.annotation.Autowired"%> 
<%@ page import="org.springframework.web.context.support.SpringBeanAutowiringSupport"%> 
<%! 
    public void jspInit() 
    { 
     SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, 
     getServletContext()); 
    } 

    @Value("${example.property}") 
    private String someField; 

    @Autowired 
    private ExampleService exampleService; 
%> 

<% final Object data = exampleService.getSomething(someField); %> 
संबंधित मुद्दे

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