2013-12-11 14 views
5

Sto creando un'applicazione Web utilizzando la molla e la sospensione. Volevo costruire la tabella lato server per questo ho bisogno di un metodo che è scritto in classe di servizio. Ma per eseguirlo con successo ho bisogno di autowire alla classe reputa dato che ora sta dando un'eccezione Pointer Null che accede al tavolo.Possiamo usare @autowired in jsp. Se sì allora come?

+1

Inserisci il tuo codice anche –

+0

Dove nella tua domanda chiedi informazioni su JSP o Spring MVC? Si prega di fornire maggiori dettagli. –

+1

Anche se lo farai, è ancora una cattiva pratica. Il modo corretto è fare tutto il lavoro nei controllori e passare i risultati per vedere attraverso il modello. –

risposta

5

Se si utilizza Spring MVC, è possibile passare il servizio al JSP grazie a ModelAndView.

Supponiamo di avere: Controllore

@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> 

Ma come Slava Semushin detto, è una cattiva pratica. Se stai escludendo i risultati dal tuo metodo e li stampi nel tuo JSP, inseriscili nel tuo modello (ModelAndView)

+0

Passare il bean in request/mav.addObject non è il modo ideale ... si dovrebbe sempre ottenere il bean da ApplicationContext –

+0

Grazie per l'aiuto .... – HVT7

0

NO. Non puoi eseguire l'autowire dei bean in JSP. I fagioli sono autowired in classi che sono annotati loro stessi. Qualsiasi classe annotata con @Component o child di @Component può annotare altri bean.

10

No, non è possibile utilizzare @autowired in JSP. Se avete bisogno di un fagiolo in JSP, è possibile utilizzare il seguente:

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

A cura di: -

Esempio Bean:

@Component("abcBean") 
public Abc{ 

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

} 

In JSP:

È possibile utilizzare questa singleton bean gestito da primavera:

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

Si prega di postare se qualcos'altro è richiesto.

+0

grazie per l'aiuto. Ma sarebbe bello se tu potessi darmi una mano con un esempio o un link ad un esempio. – HVT7

+0

Ciao HVT7, hai superato il tuo problema? –

+0

Ohh Sì ... !! Grazie per l'aiuto ..! – HVT7

0

Questo non è il modo ideale di fare in un'applicazione MVC, dovresti effettuare una chiamata HTTP al controller se devi recuperare qualcosa dal servizio.

I bean non possono essere avviati automaticamente nel JSP. Dovrai utilizzare la classe RequestContextUtils per recuperare i bean definiti nel contenitore spring.

0

Se si utilizza Tomcat, sì, ma ci vuole un po 'di lavoro.

La soluzione è di avvolgere il normale gestore di istanze di tomcat (che cosa utilizza per istanziare istanze JSP) e quindi di iniettare la versione avvolta attraverso un listener.

In primo luogo, la classe di gestione wrapping. È piuttosto semplice e inietta i bean negli oggetti appena creati prima di restituirli.

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); 
    } 
} 

E poi ci aggiungiamo un ascoltatore per iniettare il contesto di avvio:

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) {} 
} 

Poi nelle pagine JSP è possibile utilizzare qualcosa di simile

<%! @Autowired MyClass myClassInstance %> 

e dovrebbe funzionare correttamente .

Problemi correlati