2013-12-11 6 views
5

Ich baue eine Webanwendung mit Spring und Hibernate. Ich wollte die serverseitige Tabelle erstellen, für die ich eine Methode benötige, die in Dienstklasse geschrieben wird. Aber um es erfolgreich auszuführen, muss ich es an die repeated-Klasse senden, da es jetzt eine Nullzeiger-Ausnahme gibt, die auf die Tabelle zugreift.Können wir @autowired in jsp verwenden. Wenn ja, wie?

+1

Geben Sie Ihren Code auch –

+0

Wo in Ihrer Frage fragen Sie über JSP oder Spring MVC? Bitte geben Sie weitere Einzelheiten an. –

+1

Auch wenn Sie das tun, ist es immer noch eine schlechte Übung. Der richtige Weg besteht darin, alle Arbeiten in den Controllern durchzuführen und die Ergebnisse über das Modell zu übertragen. –

Antwort

5

Wenn Sie Spring MVC verwenden, können Sie Ihren Dienst dank ModelAndView an die JSP übergeben.

Angenommen, Sie haben: Controller

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

Aber wie Slava Semushin sagte, ist es eine schlechte Praxis. Wenn Sie die Ergebnisse Ihrer Methode ausschließen und in Ihrer JSP drucken, fügen Sie sie in Ihr Modell ein (ModelAndView)

+0

Übergeben Bean in Anfrage/mav.addObject ist nicht der ideale Weg ... sollte immer die Bean von ApplicationContext erhalten –

+0

Danke für die Hilfe .... – HVT7

0

NR. Sie können Beans nicht in JSP automatisch ausgeben. Bohnen werden in selbstbeschrifteten Klassen mit einem Autowirst versehen. Jede Klasse, die mit @Component oder Kind von @Component annotiert ist, kann andere Beans annotieren.

10

Nein, Sie können @autowired nicht in JSP verwenden. Wenn Sie eine Bohne in JSP benötigen, können Sie Folgendes verwenden:

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

Edited: -

Beispiel Bean:

@Component("abcBean") 
public Abc{ 

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

} 

In JSP:

Sie können dies nutzen Feder verwaltet Singleton Bean als:

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

Bitte posten, wenn etwas anderes benötigt wird.

+0

danke für die Hilfe. Aber es wäre großartig, wenn Sie mir mit einem Beispiel oder einem Link zu einem Beispiel helfen könnten. – HVT7

+0

Hallo HVT7, hast du dein Problem überwunden.? –

+0

Ohh Ja ... !! Danke für die Hilfe ..! – HVT7

0

Dies ist nicht der ideale Weg in einer MVC-Anwendung. Sie sollten einen HTTP-Aufruf an den Controller senden, wenn Sie müssen etwas aus dem Service holen.

Bohnen können nicht in der JSP autowired werden. Sie müssen die Klasse RequestContextUtils verwenden, um im Quellcontainer definierte Beans zu holen.

0

Wenn Sie Tomcat verwenden, ja, aber es braucht etwas Arbeit.

Die Lösung besteht darin, den normalen Tomcat-Instanzmanager zu umbrechen (was er zum Instanziieren von JSP-Instanzen verwendet) und dann die umbrochene Version über einen Listener zu injizieren.

Zuerst die Wrapping-Manager-Klasse. Es ist ziemlich einfach und injiziert nur Bohnen in neu erstellte Objekte, bevor Sie sie zurückgeben.

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

Und dann fügen wir einen Zuhörer auf Kontext Start zu injizieren:

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

Dann in den JSP-Seiten Sie so etwas wie diese

<%! @Autowired MyClass myClassInstance %> 

und es sollte richtig verwenden können, arbeiten .

Verwandte Themen