Java - Welche Technik sollte man verwenden?



  • Hi,

    ich schreibe gerade eines unserer internen Java Programme für das Intranet um. Da ich noch recht unerfahren mit "Java im WWW" bin, würde ich gerne wissen wie man am einfachsten Layout und Code trennt.

    In PHP war dies einfach - Templateengine. In Java habe ich nun mehr Möglichkeiten. Zum einen mit Templateengines oder z. B. JSP als View und Servlets als Controller.

    Wie kann man aber auf einfache Art eine JSP als View benutzen und ein Servlet als Controller? Ich würde auf komplexe Frameworks wie struts gerne verzichten.

    Eine weitere Frage die ich noch hätte: Muss man beim Servlet etwas beachten? Ich habe mal gehört das nur eine Instanz gebildet wird und das die Servlets threadsicher sein müssen.

    Vielen lieben Danke! 🙂



  • JSP-Seiten sind Servlets! Es kann allderdings ein Servlet/JSP seinen Request weitergeben an ein anderes Servlet und dessen Antwort in seine eigene Antwort mit einbauen. Sonst sehe ich auch nicht sehr viel mehr Möglichkeiten als eine Templateengine.
    Bei Servlets ist zu beachten, dass Instanz-Datenelemente und statische Datenelemente nicht Thread-safe sind! Am besten möglichst viele statische Methoden haben und keine Datenelemente als Parameter übergeben. Sachen wie des out (Antwort-Writer), request und session sind lokale Variablen also für jede Anfrage in sich Thread-safe.



  • Vielen Dank Optimizer!

    Optimizer schrieb:

    Bei Servlets ist zu beachten, dass Instanz-Datenelemente und statische Datenelemente nicht Thread-safe sind! Am besten möglichst viele statische Methoden haben und keine Datenelemente als Parameter übergeben. Sachen wie des out (Antwort-Writer), request und session sind lokale Variablen also für jede Anfrage in sich Thread-safe.

    Du meinst nur die Instanzelemente der von HttpServet abgeleiteten Klasse, oder? Wenn ich z. B. in dem Servlet weitere Objekte erzeuge(lokal in processRequest() oder doPost()), die meine jeweiligen Seiten beschreiben muss ich doch nicht mehr auf thread-safe achten, oder? Die werden dann doch innerhalb des von HttpServlet ausgelösten Threads erst instanziert. Oder bin ich auf dem Holzweg? 🙂

    Besipiel:

    public class Index extends HttpServlet {
    
    //Alle Klassenvariablen sollten static sein und müssen thread-safe sein.
    
        protected void processRequest(HttpServletRequest request, 
                                                      HttpServletResponse response)
                                                      throws ServletException, IOException {
    
          //Hier muss ich nicht mehr auf thread-safe achten, oder?
          SiteA sA = new SiteA();
    
        }
    }
    

    Danke nochmals! 🙂



  • Der Punkt ist nur der, dass ein und die selbe Servlet-Instanz für mehrere Anfragen gleichzeitig benutzt werden kann.
    Aber zu jeder Anfrage gehört natürlich ein eigenes out und session, usw.
    Wenn du während dem Antworten Objekte erzeugst und auf diese nur lokale Referenzen hast (lokal also innerhalb von doGet() beispielsweise), ist das Thread-safe, weil natürlich jeder Thread seine eigenen lokalen Variablen hat. Damit bist du also nicht auf dem Holzweg.
    Du musst halt wie gesagt auf Datenelemente der Klasse achten, es ist ein typischer Anfänger-Fehler, anzunehmen, dass für jeden Request ein eigenes Servlet zur Beantwortung konstruiert wird.


Anmelden zum Antworten