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?
Antwort
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)
Übergeben Bean in Anfrage/mav.addObject ist nicht der ideale Weg ... sollte immer die Bean von ApplicationContext erhalten –
Danke für die Hilfe .... – HVT7
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.
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.
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.
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 .
- 1. Können wir xcowsay auf Mac OSX ausführen? Wenn ja, wie?
- 2. Warum verwenden wir pthread_exit(), wenn wir return verwenden können?
- 3. Können wir & in URL verwenden?
- 4. Wie können wir Master-Prozess konfigurieren, wenn PM2 verwenden
- 5. JSP - Können wir zwei DB connectios auf der gleichen JSP öffnen, indem wir jede
- 6. Können wir reactJS mit amCharts verwenden
- 7. Wie können wir MSHTML mit VBA verwenden?
- 8. Können wir Union im Ruhezustand verwenden?
- 9. Können wir wie das Keyword Documentdb verwenden?
- 10. Können wir Helper im Controller Laravel verwenden?
- 11. Wie können wir Daten auswählen, wenn wir Schlüsselworte als Zugriffsdatenbanktabellennamen und Feldnamen in Delphi verwenden
- 12. Können wir Regex in Symfony2 Zugriffskontrolle verwenden?
- 13. Können wir Core-PHP in Codeigniter verwenden?
- 14. Können wir cardView im relativen Layout in Android Studio verwenden?
- 15. Wie können wir Ausdrücke wie Teilzeichenfolge (...) in jsrender verwenden
- 16. Verwenden Sie BizTalk? Wenn ja, wie verwenden Sie es?
- 17. Können wir NSFileManager in iphone verwenden?
- 18. Können wir verwenden? Operator in sql
- 19. Können wir den Vererbungsinhalt in Sitecore verwenden?
- 20. C#: Warum verwenden Generika nicht den allgemeinsten Typ, den wir verwenden können, wenn wir keinen angeben?
- 21. Warum verwenden wir abroll segue, wenn wir Segmente verwenden können, um zu einem View-Controller zurückzukehren?
- 22. Wie können wir Popup in FitNesse hinzufügen?
- 23. Wie können wir CTE in Unterabfrage in SQL-Server verwenden?
- 24. Wie können wir Genymotion mit Eclipse und Appium verwenden
- 25. Warum verwenden wir Cookies in Asp.net, wenn wir Sitzungen haben?
- 26. Wann können wir ClearAllPools-Methode verwenden?
- 27. Wie können wir das smb-Protokoll in Qt verwenden?
- 28. Wie können wir eine Batch-Datei in C++ verwenden?
- 29. Können wir JMX in VM-Konfiguration wie Heap-Größe verwenden?
- 30. Wie können wir Array-Elemente als Zähler in Java verwenden?
Geben Sie Ihren Code auch –
Wo in Ihrer Frage fragen Sie über JSP oder Spring MVC? Bitte geben Sie weitere Einzelheiten an. –
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. –