2017-04-11 1 views
1

Ich habe eine Java-Webapp, die eine Servlet DoPost hat, die einige Json POST akzeptiert. Lass es uns eine "Person" nennen. So bekommt es etwas wie {Name: "Joe", Alter: 35}. Dann gibt es auch eine databind Klasse für Jackson, die diese einfängt ... wieJava-Servlet und Persistenz-Struktur

public class Person { 
    public String name; 
    public int age; 
} 

ich derzeit der DB Sachen in der Servletklasse passiert haben. Wenn das Servlet die Anforderung empfängt, wird es zu einem Person-Objekt deserialisiert und nimmt dann das resultierende Objekt, erstellt eine JDBC-Verbindung und führt eine Einfügung aus. Was ist der beste Weg, dies zu strukturieren? Ist das in Ordnung? Ich denke, die Persistenz sollte mehr mit dem Objekt selbst als mit dem Servlet verknüpft sein. Soll ich die DB-Funktionalität in das Person-Obj einfügen? Oder erstellen Sie ein neues "Ding", um damit umzugehen?

Antwort

1

Ich fühle mich wie die Persistenz sollte mehr mit dem Objekt selbst verbunden werden als das Servlet.

Weder richtig sind, im Grunde müssen wir die Anwendung richtig dh der Schicht, sollten wir nicht beide Front-End (Benutzeroberfläche) mischen Anliegen und Geschäftslogik und unten für weitere Erklärung überprüfen auf die Web-Anwendung Layering .

Sollte ich die DB-Funktionalität in die Person obj? Oder erstellen Sie etwas neues "Ding", um damit umzugehen?

Nein, Sie müssen die Datenzugriffsebene separat behandeln, z. B. mit einem DAO- (Data Access Object) oder Repository-Layer.

Im Allgemeinen ist die Web-Anwendung-Architektur funktioniert wie folgt:

HTML/JSP -> Servlet & Controller-Klassen -> Service Layer -> DAO Ebene -> Datenbank

Jede dieser Schichten ist aus seinen eigenen Gründen gemeint und wir sollten die Sorgen nicht mischen.

Jetzt speziell über die DAO-Ebene sprechen (siehe hier, wie DAO Muster funktioniert), gibt es verschiedene Frameworks zur Verfügung, um die Dinge einfacher zu machen und ORM (Object Relational Mapping) ist das Konzept, das Sie interessieren könnte. Um nur einige zu nennen, Die beliebten ORM-Frameworks sind Hibernate und Spring data JPA.


UPDATE:

So, das Servlet akzeptiert die Anforderung, deserialisiert die Daten an einigen Daten binden Klassen, die die JSON-Schema entsprechen. Dann übergibt es diese an einige "Service-Schicht", die eine Art von Manipulation und generiert DAO-Objekte, die die Tabellenstrukturen entsprechen und speichert es ab?

Sie sind fast da, das einzige, was Sie fehlt, ist, dass DAO-Objekte sind Singleton-Klassen (sie die Daten nicht halten, nur bieten sie Methoden Zugriff auf die Datenbank) und die Modell/Entity Beans sind wirklich verwendet, um die Daten zu speichern.

Sie die folgenden einfachen Beispiel beziehen kann unter der Annahme, dass es die PRODUCT Tabelle in der Datenbank zugreift:

ProductDAOImpl Klasse (Singleton-Objekt):

public class ProductDAOImpl implements ProductDAO { //or ProductRepository 

    public boolean save(Product product) { 
     //add implementation 
    } 

    public List<Product> queryProducts() { 
     //add implementation 
    } 

    public Product queryUniqueProduct(String productId) { 
     //add implementation 
    } 

    //etc...any other methods you would like 
} 

Produktklasse (ein Objekt für jede Anfrage vom Kunden/Benutzer):

public class Product { //It is an Entity class 

    private String id; 

    private String name; 

    private int price; 

    //all other fields 

    //getters and setters 
} 

Was ist, wenn Sie eine Diskrepanz zwischen Anfrage und Datenmodell haben?

immer sicher, dass beide Präsentationsschicht-Beans und Entity (Datenbank) Modell Bohnen getrennt sein sollten, dh es ist keine gute Praxis, die Bohnen in diesen beiden Schichten zu teilen weil ein Business-Logik Griffe und andere Für die Benutzeroberfläche (Frontend) sollten beide lose gekoppelt sein.

+0

So nimmt das Servlet die Anfrage an und deserialisiert die Daten in einige Datenbankklassen, die dem JSON-Schema entsprechen. Dann übergibt es diese an eine "Service-Schicht", die irgendeine Art von Manipulation durchführt und DAO-Objekte generiert, die mit den Tabellenstrukturen übereinstimmen und sie speichern? – MichaelB

+0

Ein Beispiel hinzugefügt, siehe oben – developer

+0

Was ist, wenn Sie eine Diskrepanz zwischen Anfrage und Datenmodell haben ... So erhalten Sie eine POST von einer "Person" json wie, "{Name: Joe, Alter: 21, Adresse: {Straße : fake, city: seattle}} sende dies an eine "person" controller, die eine "Person" POJO und eine "PersonDAO" dann ein "AddressDAO" erstellt, um jede Datenbearbeitung zu tun? – MichaelB