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?
risposta
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)
Passare il bean in request/mav.addObject non è il modo ideale ... si dovrebbe sempre ottenere il bean da ApplicationContext –
Grazie per l'aiuto .... – HVT7
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.
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.
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.
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 .
Inserisci il tuo codice anche –
Dove nella tua domanda chiedi informazioni su JSP o Spring MVC? Si prega di fornire maggiori dettagli. –
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. –