我正在使用spring和hibernate構建一個web應用程序。 我想構建服務器端表,因爲我需要一個寫在Service類中的方法。但爲了成功執行它,我需要將它自動裝載到受到關注的類中,因爲它現在正在給出一個空指針異常來訪問表。我們可以在jsp中使用@autowired嗎?如果是,那麼如何。?
回答
如果您使用的是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)
在請求/ mav.addObject中傳遞bean不是理想的方法...應該總是從ApplicationContext獲取bean –
感謝您的幫助.... – HVT7
NO。您不能在JSP中自動調用bean。豆類是在自己註釋的類中自動裝配的。任何用@Component
或@Component
的孩子註解的類都可以註釋其他的bean。
不,您不能在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();
如果需要其他東西,請發佈。
這不是在MVC應用程序中執行的理想方法,您應該對控制器進行HTTP調用if你需要從服務中獲取一些東西。
Bean無法在JSP中自動裝配。您將不得不使用RequestContextUtils
類來獲取spring容器中定義的bean。
如果你使用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頁面,它應該正常工作。
- 1. 我可以在Vaadin中實施分頁嗎?如果是,那麼如何?
- 2. 我們可以在android中使用svg圖像嗎?如果我們可以使用然後如何在android
- 3. 我們可以在PHP中設置變量大小嗎?如果是,那麼如何?
- 4. 我們可以通過php在cookie中保存圖像。如果是,那麼
- 5. JSP如果是,那麼增量
- 6. 如果我們使用JavaScript MVC,那麼我們如何仍然可以爲視圖提供動畫?
- 7. 如果我使用append生成HTML元素,那麼我可以使用jQuery影響它們嗎?
- 8. 我們可以像我們在名稱空間中那樣使用類名嗎?
- 9. 我們可以嵌套嗎? :使用C語言運算符。解釋如果是,那麼
- 10. 我們可以將數據集傳遞給Web服務方法嗎?如果是,那麼如何?
- 11. VisualVM可以用於剖析Maven項目嗎?如果是,那麼如何?
- 12. 我們可以在iPhone中使用Google Plus API將數據發佈到Google Plus嗎?如果是,那麼我們該怎麼做?
- 13. 如果O(n)和Big omega(1)那麼我們也可以說是theata(log n)?
- 14. lua源文件可以在Nginx HttpLuaModule中使用時進行模糊/加密嗎?如果是,那麼如何?
- 15. 如果使用URL掩碼,我們可以在經典ASP中使用Request.QueryString嗎?
- 16. 如果我們是有效的用戶,我們可以克隆存儲庫嗎?
- 17. 如果我在JSP中有html元素,那麼執行的順序是什麼?
- 18. 我可以在@Bean方法中使用@Autowired變量嗎?
- 19. 我們可以在mac OSX上運行xcowsay嗎?如果是,如何?
- 20. 什麼是MDAC以及如何我們可以在程序中使用
- 21. 如果我使用plist,可以嗎? iOS
- 22. 我可以在Node.js控制檯中使用Git嗎?如果是,如何安裝?
- 23. 我可以在內嵌html中使用JQuery嗎?如果是這樣如何?
- 24. 我可以在Android開發中使用javax.script嗎?如果是的話,怎麼樣?
- 25. 我可以在IOS上使用mach_star/mach_override嗎?如果不是,我該怎麼辦?
- 26. 我們可以使用PrintWriter類將字符串保存在Android應用程序的文件中嗎?如果是,那麼如何?
- 27. 我們可以在不創建活動的情況下運行服務嗎?如果是,爲什麼?或者如果不是那麼爲什麼不呢?
- 28. 我們能夠將linq連接到Ionic框架中的sql服務器連接嗎?如果我們可以那麼我們如何做到這一點?
- 29. 如何讓Nodejs調用同步,那麼我可以輕鬆使用它嗎?
- 30. 我可以我們如何使用python
發佈你的代碼也 –
在你的問題中,你問關於JSP或Spring MVC?請提供更多細節。 – 2013-12-11 11:54:04
即使你會這樣做,這仍然是一個不好的做法。正確的方法是在控制器中完成所有工作並傳遞結果以查看模型。 –