2013-12-11 88 views
5

我正在使用spring和hibernate構建一個web應用程序。 我想構建服務器端表,因爲我需要一個寫在Service類中的方法。但爲了成功執行它,我需要將它自動裝載到受到關注的類中,因爲它現在正在給出一個空指針異常來訪問表。我們可以在jsp中使用@autowired嗎?如果是,那麼如何。?

+1

發佈你的代碼也 –

+0

在你的問題中,你問關於JSP或Spring MVC?請提供更多細節。 – 2013-12-11 11:54:04

+1

即使你會這樣做,這仍然是一個不好的做法。正確的方法是在控制器中完成所有工作並傳遞結果以查看模型。 –

回答

5

如果您使用的是Spring MVC,那麼您可以通過ModelAndView將您的服務傳遞給JSP。

假設您有:控制器

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

但像斯拉瓦Semushin說,這是一個不好的做法。如果除了方法的結果並在JSP中打印它們,請將它們放入模型中(ModelAndView)

+0

在請求/ mav.addObject中傳遞bean不是理想的方法...應該總是從ApplicationContext獲取bean –

+0

感謝您的幫助.... – HVT7

0

NO。您不能在JSP中自動調用bean。豆類是在自己註釋的類中自動裝配的。任何用@Component@Component的孩子註解的類都可以註釋其他的bean。

10

不,您不能在JSP中使用@autowired。如果您需要在JSP一個bean,你可以使用以下命令:

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

編輯於: -

實例豆:

@Component("abcBean") 
public Abc{ 

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

} 

在JSP:

您可以使用此春天管理單身豆:

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

如果需要其他東西,請發佈。

+0

感謝您的幫助。但是,如果你可以通過一個例子或者一個例子的鏈接來幫助我,那將是非常好的。 – HVT7

+0

嗨HVT7,你克服了你的問題。? –

+0

哦是的... !! 感謝您的幫助..! – HVT7

0

這不是在MVC應用程序中執行的理想方法,您應該對控制器進行HTTP調用if你需要從服務中獲取一些東西。

Bean無法在JSP中自動裝配。您將不得不使用RequestContextUtils類來獲取spring容器中定義的bean。

0

如果你使用Tomcat,是的,但它需要一些工作。

解決方案是包裝普通的tomcat實例管理器(它用來實例化JSP實例),然後通過監聽器注入包裝版本。

首先,包裝管理器類。它非常簡單,只是在返回新創建的對象之前注入bean。

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

然後你可以使用這樣的事情

<%! @Autowired MyClass myClassInstance %> 

JSP頁面,它應該正常工作。

相關問題