Ich war schon einmal mit .NET-bezogenen Webentwicklung in Kontakt, aber jetzt bin ich mit Javaweb immer noch sehr unwohl.
1. Sprechen Sie über Project Architecture <BR /> Ich bin zum ersten Mal mit der .NET-bezogenen Entwicklung in Kontakt gekommen, daher bin ich mit der .NET-bezogenen Entwicklung vertraut, aber ich habe Java in der Schule gelernt und plane, diese beiden Plattformen zu kombinieren. Steigen Sie auf, verwenden Sie Java als Backend, dh den Dienstanbieter, alle Geschäftslogik auf der Java -Plattform und verwenden Sie .NET, mit dem ich für die Webentwicklung besser vertraut bin. Auf diese Weise wird es Android-Apps und -Webseiten geben. Der Kunde ruft den Dienst einheitlich über ein verteiltes Framework auf. Nachdem ich lange gesucht hatte, entschied ich mich schließlich für HProse, einen leichten, branchensprachigen, plattformübergreifenden, nicht-invasiven, leistungsstarken dynamischen Remote-Objekt-Aufruf-Engine-Bibliothek. Der Grund, warum ich es ausgewählt habe, liegt an den niedrigen Lernkosten, und andererseits ist der plattformübergreifende Anruf sehr einfach und effizient, da wir .NET verwenden müssen, um das Web zu erstellen, um die von Java veröffentlichten Dienste aufzurufen! Nachdem ich die HPROSE-Dokumentation grob betrachtete, stellte ich fest, dass die Verwendung des integrierten HPROSERSERVLET-Release-Dienstes schneller und einfacher zu entwickeln ist. Ich plane, diese Methode zur Veröffentlichung des Dienstes zu verwenden. Das Problem ist jedoch, dass sich die traditionelle SSH -Architektur etwas schwer anfühlt und ich .NET zur Entwicklung der Webseite verwenden werde. Daher habe ich das Gefühl, dass es keine Notwendigkeit besteht .
2. Datenbankdesign
Es ist eine kleine Online -Buchhandlung, daher fehlt das Design immer noch und es ist hauptsächlich praktisch und übt hauptsächlich Java -Entwicklung ~~. Ich habe Navicat kurz gestaltet, um es kurz zu entwerfen, aber es gab keine Konstruktionstischkorrelation.
Tatsächlich können Sie die Tabellenkorrelation auf einen Blick sehen. Als nächstes wird einige Zuordnungen gewonnen und auch Plug-Ins zum Generieren von Modellen und Zuordnungsdateien verwenden.
Es ist so mit einer leichten Modifikation.
3. FRINDE3+Hibernate4 -Konfiguration <BR /> Da das Modell und die Zuordnungsdateien automatisch generiert werden, ist es besser, sie zu konfigurieren. Verbundmodell. Zum Beispiel der zusammengesetzte Primärschlüsseltyp der Produktüberprüfungstabelle :
Paket com.book.model; // generiert 2015-11-2 9:07:06 von Hibernate-Tools 4.0.0.Finalimport Java.util.date;/** * Kommentaresind generiert von Hbm2java */Publi C-Klassen-Kommentarsportungen Java Java . io.Serializable { private Book book; private User user; private Date commentsDate; public CommentsPk() { } public CommentsPk(Book book, User user, Date c omentsDate) { this.book = book; this.user = user; this .ComentsDate = Kommentare; Benutzer) {this.user = user; == andere) Return; castother.getbook ()) ||. ) == castother.getUser ()) || (this.getUser ()! .Getcom mentsDate () == castother.getComentsDate ()) || ;} public int Hashcode () {int result = 17; == null? Produktüberprüfungstabelle Modell :
Paket com.book.model; // generiert 2015-10-30 14:56:21 von Hibernate-Tools 4.0.0.Finalimport Java.sql.date;/** * Kommentare, die von Hbm2java */öffentliche Klassenkommentare implementiert werden, Java. IO.Serializable {private String -Inhalt; } public String GetPic () {return pic; ;} öffentliche Kommentare getId () {return id; Content = Inhalt; Die entsprechende Hibernate -Mapping -Datei:
<? . "Kommentare" catalog = "bookstore"> <composite-id name = "id"> <key-Many-to-One-Name = "Buch"> <Spaltenname = "bookId" /> < /key-Many-to- Eins> <Key-Many-One-Name = "Benutzer"> <Spaltenname = "userId" /> < /key-Many-to-One> <Key-Property name = "commentsDate" type = "timestamp"> <Spaltenname = "commentsDate" Länge = "19"/> </key-property> </composite-id> <Eigenschaft name = "content" type = "String"> <Spaltenname = "Inhalt" Länge "65535 " /> < /Eigenschaft> <Eigenschaft name =" pic "type =" string "> <columnname =" pic "Länge =" 65535 " /> < /Eigenschaft> <Eigenschaft name =" client "type =" java. lan g .Integer "> <columnname =" client "/> </property> </class> </hibernate-mapping>
Da es in der Produktüberprüfungstabelle zwei ausländische Schlüssel gibt, wird das Schlüssel-Many-to-One-Tag verwendet.
Da der Frühling 3.2+Hibernate4.1 verwendet wird, ist die Art und Weise, wie er SessionFactory auf Sessionfactory.getCurrentSession () beschränkt, aber die Dinge aktiviert werden:
<bean id = "transactionManager"> <Eigenschaft name = "sessionfactory" ref = "sessionfactory" /> < /bean> <!-Transaktionsverbreitungsmerkmale-> <tx: Rat ID = "txadvice" Transaction-Manager = "TransactionManager"> <tx: Attribute> <tx: method name = "add*" Propagation = "Erforderlich" /> <tx: method name = "delete*" propagation = "fordert" /> <tx: method name = " Ändern*"Propagation =" Erforderlich " /> <!-Hibernate4 muss konfiguriert werden, um Transaktionen zu aktivieren = "true"/> </tx: Attribute> </tx: Ratschläge>
Die oben genannten sind die Probleme, die aufgetreten sind, als ich sie konfiguriert habe. Hier ist die Frühlingskonfigurationsdatei:
<? /2001/xmlschemasinstance "xmlns: aop =" http://www.springframework.org/schema/aop "xmlns: context =" http://www.spingframework.org/schema/ context "xmlns: tx =" http://www.springframework.org/schema/tx "xsi: schemalocation =" http://www.springframework.org/schema/beans http://www.springframework.org/Schema/Beans/Beans- 3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-32.xsd http: //www.springframeWwore K.Org/Schema/Schema/Schema/ Kontext http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http: //www.springframework -Tx-3.2.xsd "> <!-Federannotation Unterstützung aktivieren-> <Context: Annotation-Config /> <bean id =" dataSource "Destroy-method =" close "> <Eigenschaft name =" driverClassnam e " value = "com.mysql.jdbc.driver"/> <Eigenschaft name = "url" value = "jdbc: mysql: //127.0.0.1/bookstore? useUnicode = true & charakteristischesCoding = utf-8"/> <Eigenschaft name = " Benutzername "value =" root " /> <Eigenschaft name =" password "value =" yangyang " /> < /bean> <!-Sie können die Konfiguration des sekundären Cache hinzufügen-> <bean id =" Sessionfactory " > <Eigenschaft name = "dataSource" ref = "dataSource"/> <Eigenschaft name = "mapingDirectoryLocations"> <list> <wert> classPath: config </value> </list> </property> <Eigenschaft name = "hibernateProperties "> <props> <prop key =" hibernate.dialect "> org.hibernate.dialect > true </prop> <prop kaste = "hibernat e.hbm2ddl.auto"> update </prop> <propt key = "hibernate.temp.use_jdbc_metadata_defaults"> false </prop> <propt key = "current_session_context_class"> thread "> thread"> thread "> thread"> thread "> false </prop> < </prop> </props> </property> </bean> <!-Konfiguration Transaktionsmanager-> <bean id = "transactionManager"> <Eigenschaft name = "sessionfactory" Ref = "SessionFactory"/> </ Bean> <!-Propagationsmerkmale von Transaktionen-> <tx: patce id = "txadvice" Transaction-Manager = "TransactionManager"> <Tx: Attribute> <Tx: Methodame = "add*" Propagation = "Erforderlich" /> <tx: method name = "delet e*" propagation = "fordert" /> <tx: method name = "modify*" Propagation = "Erforderlich" /> <!-Hibernate4 muss so konfiguriert sein, dass Transaktionen aktiviert werden, ansonsten getCurrentSession () kann nicht erhalten werden-> <tx: Methode name = "*" Propagation = "Erforderlich" schreibgeschützt = "True"/> </tx: Attribute> </tx: Ratschläge> <!-Diese Klassen und Methoden verwenden Transaktionen-> <AOP: config> <!-Nur Transaktionen werden für die Business Logic Layer implementiert-> <AOP: pointcut id = "AllManAgerMethod" Expression = "Execution (* com.book.test.* .*(..)) " /> <AOP: Berater pointcut-ref =" AllManAgerMethod "adv ice-ref =" txadvice " /> < /aop: config> <bean name =" basiertdao " /> <bean name = "orderdao" /> < /beans>
Nachdem alles fertig ist, verwenden wir den Servlet -Test:
<servlet> <servlet-name> test </servlet-name> <servlet-classe> com.book.test.test </Servlet-Klasse> </Servlet> <Servlet-Mapping> <Servlet-Name> Test </ Servlet-name> <URL-Muster>/index </url-pattern> </servlet-Mapping>
Protected Void Dodget (httpServletRequest-Anforderung, HttpServletResponse-Antwort) löst ServletException aus, IOException {// Todo automatisch generierter Methode stub Be anfactory faktor Orderdao.Da wir keine Strukturen verwenden, müssen wir die Beanfaktor der Frühling finden, um Dao Bean zu erhalten.
Auslaufergebnisse:
Erfolgreich geladene Bestellung Tabelle 1 Artikelbestellmenge.
Immerhin habe ich Java zum ersten Mal verwendet, um solche Projekte zu entwickeln.