2013-12-11 5 views
5

मैं वसंत और हाइबरनेट का उपयोग कर एक वेब अनुप्रयोग बना रहा हूं। मैं सर्वर साइड टेबल बनाना चाहता था जिसके लिए मुझे सेवा कक्षा में लिखी गई एक विधि की आवश्यकता है। लेकिन इसे सफलतापूर्वक निष्पादित करने के लिए मुझे इसे अपेक्षित वर्ग में स्वत: करने की आवश्यकता है क्योंकि अब यह तालिका तक पहुंचने वाला एक नल पॉइंटर अपवाद दे रहा है।क्या हम jsp में @autowired का उपयोग कर सकते हैं। यदि हां तो कैसे?

+1

अपना कोड भी पोस्ट करें –

+0

जहां आप अपने प्रश्न में जेएसपी या स्प्रिंग एमवीसी के बारे में पूछते हैं? कृपया अधिक जानकारी प्रदान करें। –

+1

भले ही आप ऐसा करेंगे कि यह अभी भी एक बुरा अभ्यास है। उचित तरीके से नियंत्रकों में सभी काम करना और मॉडल के माध्यम से देखने के लिए परिणाम पास करना है। मदद के लिए –

उत्तर

5

यदि आप स्प्रिंग एमवीसी का उपयोग कर रहे हैं तो आप मॉडल और व्यू के लिए जेएसपी धन्यवाद के लिए अपनी सेवा पास कर सकते हैं।

मान लीजिए आप है: नियंत्रक

@Controller 
public void MyController { 

    @Autowired 
    private MyServiceInterface myService; 

    @RequestMapping(value="myUrl") 
    public ModelAndView displayPage() { 
     //do some stuff 
     return new ModelAndView("myView").addObject("myService", myService); 
    } 
} 

JSP:

<html> 
. 
${myService.myMethodIWantToUse} 
. 
</html> 

लेकिन जैसे Slava Semushin ने कहा, यह एक बुरा व्यवहार है। यदि आप अपनी विधि से परिणामों को छोड़ रहे हैं और उन्हें अपने जेएसपी में प्रिंट कर रहे हैं, तो उन्हें अपने मॉडल (मॉडल एंड व्यू) में रखें

+0

अनुरोध में बीन पास करना/mav.addObject आदर्श तरीका नहीं है ... किसी को हमेशा मदद के लिए आवेदनकॉन्टेक्स्ट –

+0

से बीन प्राप्त करना चाहिए .... – HVT7

0

नहीं। आप जेएसपी में बीन्स को ऑटोवायर नहीं कर सकते हैं। बीन्स कक्षाओं में स्वायत्त हैं जो खुद को एनोटेट कर रहे हैं। @Component या @Component के बच्चे के साथ एनोटेटेड कोई भी वर्ग अन्य बीन्स को एनोटेट कर सकता है।

10

नहीं, आप जेएसपी में @autowired का उपयोग नहीं कर सकते हैं।

उदाहरण बीन:

@Component("abcBean") 
public Abc{ 

    public void sysout(){ 
     System.out.printn("Hello world"); 
    } 

} 

JSP में:

आप इस का उपयोग कर सकते हैं -:

ApplicationContext ac = RequestContextUtils.getWebApplicationContext(request); 
ac.getBean("yourBeanName"); 

को संपादित: आप JSP में एक सेम की जरूरत है, तो आप निम्न का उपयोग कर सकते वसंत प्रबंधित सिंगलटन बीन के रूप में:

ApplicationContext ac = RequestContextUtils.getWebApplicationContext(request); 
Abc abc = (Abc) ac.getBean("abcBean"); 
abc.sysout(); 

अगर कुछ और आवश्यक है तो कृपया पोस्ट करें।

+0

धन्यवाद। लेकिन यह बहुत अच्छा होगा अगर आप एक उदाहरण के साथ मेरी मदद कर सकते हैं, या एक उदाहरण के लिए एक लिंक। – HVT7

+0

हाय एचवीटी 7, क्या आपने समस्या को दूर किया है? –

+0

ओह हाँ ... !! मदद के लिए धन्यवाद ..! – HVT7

0

यह एमवीसी एप्लिकेशन में करने का आदर्श तरीका नहीं है, तो आपको नियंत्रक को HTTP कॉल करना चाहिए आपको सेवा से कुछ लाने की जरूरत है।

बीएसएस को जेएसपी में स्वचालित नहीं किया जा सकता है। वसंत कंटेनर में परिभाषित बीन्स लाने के लिए आपको RequestContextUtils कक्षा का उपयोग करना होगा।

0

यदि आप टोमकैट का उपयोग कर रहे हैं, हाँ, लेकिन इसमें कुछ काम लगता है।

समाधान सामान्य टोमकैट इंस्टेंस मैनेजर (जो जेएसपी इंस्टेंस को चालू करने के लिए उपयोग करता है) को लपेटना है और फिर श्रोता के माध्यम से लिपटे संस्करण को इंजेक्ट करना है।

सबसे पहले, रैपिंग प्रबंधक वर्ग। यह बहुत आसान है और उन्हें वापस करने से पहले नव निर्मित वस्तुओं में सेम इंजेक्ट करता है।

public class SpringInstanceManager implements InstanceManager { 

    ServletContext ctx; 
    InstanceManager manager; 

    public SpringInstanceManager(ServletContext ctx, InstanceManager manager){ 
     this.ctx = ctx; 
     this.manager = manager;   
    } 

    public Object processAnnotations(Object o) throws IllegalAccessException, InvocationTargetException, NamingException { 
     if (o != null && o.getClass().getName().endsWith("_jsp")){    
      SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(o, ctx); 
     } 
     return o; 
    } 

    @Override 
    public Object newInstance(Class<?> clazz) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException { 
     return processAnnotations(manager.newInstance(clazz)); 
    } 

    @Override 
    public Object newInstance(String className) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, ClassNotFoundException { 
     return processAnnotations(manager.newInstance(className)); 
    } 

    @Override 
    public Object newInstance(String fqcn, ClassLoader classLoader) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, ClassNotFoundException { 
     return processAnnotations(manager.newInstance(fqcn, classLoader)); 
    } 

    @Override 
    public void newInstance(Object o) throws IllegalAccessException, InvocationTargetException, NamingException { 
     manager.newInstance(o); 
    } 

    @Override 
    public void destroyInstance(Object o) throws IllegalAccessException, InvocationTargetException { 
     manager.destroyInstance(o); 
    } 
} 

और फिर हम संदर्भ स्टार्टअप पर इसकी सुई एक श्रोता जोड़ें:

public class SpringJSPEnablerListener implements ServletContextListener { 
    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     ServletContext context = sce.getServletContext(); 
     InstanceManager oldManager = ((InstanceManager) (context.getAttribute(InstanceManager.class.getName()))); 
     if (!(oldManager instanceof SpringInstanceManager)) { 
      InstanceManager springInjectingInstanceManager = new SpringInstanceManager(context,oldManager); 
      context.setAttribute(InstanceManager.class.getName(), springInjectingInstanceManager); 
     } 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) {} 
} 
तो JSP पृष्ठों आप इस

<%! @Autowired MyClass myClassInstance %> 

की तरह कुछ का उपयोग कर सकते में

और इसे सही ढंग से काम करना चाहिए ।

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

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