Vorwort
Heute werde ich den Bau von SpringMVC+Hibernate überprüfen. Ich dachte ursprünglich, dass das Rahmen für die Berechnung des Frühlingssicherheit auch darin enthalten sein wird, aber ich stellte fest, dass es zu viel Inhalt gibt. Lassen Sie es den nächsten Artikel überlassen. Dieser Artikel baut hauptsächlich SpringMVC4.1.4 und Hibernate4.3.8 auf. Ich habe auch schon viel SpringMVC verwendet. Dieser Teil ist damit sehr vertraut. Immerhin wird SpringMVC seit mehr als einem Jahr entwickelt. Dieses Mal verwendet die Persistenzschicht Hibernate, die Datenquelle verwendet C3P0 und die Datenbank verwendet mySQL vorübergehend. Ich möchte Hibernate hauptsächlich überprüfen. Die Idee, den Rahmen von SpringMVC+Hibernate aufzubauen, lautet wie folgt:
1. Entwurfsdatenbank: Entwerfen Sie die Tabellenstruktur, es ist am besten, 3NF zu treffen und Hibernate -Tools zu verwenden, um die entsprechende Entitätsentität automatisch zu generieren.
1. Erstellen Sie ein Maven -Projekt und geben Sie nach Bedarf die Abhängigkeiten des Maven -Pakets ein.
2. Bauen Sie die Feder: Konfigurieren Sie die Federinjektion von Kontrollschichtbohnen.
3..
V.
5. Eingabe SpringMVC: Konfigurieren Sie die Konfigurationsinformationen der SpringMVC.
6. Konfigurieren Sie Web.xml Container
7. Testen Sie die Integration von drei Frameworks: Maven Compiles, Pakete und Bereitstellen von Servern und Tests.
1. Datenbankdesign
Entwerfen Sie eine Tabelle mit Berechtigungen, Rollen und Benutzern. Wenn ein Benutzer mehrere Rollen spielen kann, besitzt eine Rolle natürlich mehrere Benutzer. Eine Rolle hat mehrere Berechtigungen, und eine Berechtigung entspricht mehreren Rollen. Daher benötigen nach dem Design der Datenbanktabelle Struktur, wenn sie 3NF erfüllt, 5 Tabellen, um zu existieren. Die spezifischen Informationen der Tabelle sind nicht aufgeführt (Sie können sie im Quellcode herunterladen, und es gibt auch eine Datenbank), und die Tabellenbeziehung lautet wie folgt:
Nur in dieser ID wird die UUID (36-Bit) verwendet
2. Erstellen Sie ein Maven -Projekt und schreiben Sie eine pom.xml -Datei
Erstellen Sie ein Maven WebApp -Projekt, schreiben Sie eine POM.xml -Datei und stellen Sie die erforderlichen Paketabhängigkeiten ein. Ich werde alle erforderlichen hier zuordnen.
Der Inhalt der Datei pom.xml lautet wie folgt:
<project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.andy.sh</groupId> <artifactId>springmvc_hibernate_demo</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <Name> springmvc_hibernate_demo maven webapp </name> <url> http://maven.apache.org </url> <properties> <projekt.build.sourceEncoding> utf-8 </project.build.SourceCoding> <Version> 4.1.1.4. <hibernate.version>4.3.8.Final</hibernate.version> <jackson.version>2.5.0</jackson.version> </properties> <dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-Spring-> <De vorstellen> <gruppe> org.springFramework </Groupid> <artifactId> Spring-Core </artifactId> <version> $ {Spring.version} </Version> </abhängig> <depelzie <version> $ {Spring.version} </Version> </abhängig> <depeopy> <gruppe> org.springFramework </Groupid> <artifactid> Spring-Context </artifactId> <version> $ {Spring.version} </Version> </abhängig> <gruppe <GroupID> oderg.springFramework </gruppen> oderg. <artifactId> Spring-tx </artifactId> <version> $ {Spring.version} </Version> </abhängig> <depeopych> <gruppe> org.springFramework </Groupid> <artifactID> Spring-Web </artifactId> <version> $ {Spring.version} </Version> </vl. <gruppeId> org.springFramework </Groupid> <artifactId> Spring-Test </artifactId> <version> $ {Spring.version} </Version> <Scope> test </scope> </abhängig> <!-Konfigurieren mit SpringMvc-> <Deponcy> <gruppe> </gruppramework </gruppieren </gruppieren </Groupid> <artifactId> Spring-webmvc </artifactid> <version> $ {Spring.version} </Version> </abhängig> <!-Bei der Integration einer relationalen Datenbank müssen Sie wie Hibernate-JPA konfigurieren. --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version> $ {hibernate.version} </version> </abhängig> <depeaponcy> <GroupId> org.hiberNate </GroupId> <artifactid> hibernate-EHCache </artifactID> <version> $ {hibernate.version} </Version> </abhängig> Abhängigkeit> <! <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.9.0</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- mysql connection--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <!-- c3p0 data source--> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5-pre10</version> </dependency> <!-- json --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- aop --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.4</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <finalName>springmvc_hibernate_demo</finalName> <plugins> <!-- Run the JUnit unit tests in an isolated classloader --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.2</version> <configuration> <Kiptests> true </skiptests> </configuration> </plugin> <plugin> <gruppe.apache.maven.plugins </Groupid> <artifactId> maven-krieg-Plugin </artifactid> <version> 2.3 </Version> </Version> </Version> <Konfiguration> <webXml>src/main/webapp/WEB-INF/web.xml</webXml> </configuration> </plugin> <!-- generate java doc --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>2.9.1</version> <configuration> <javadocDirectory>target/javadoc</javadocDirectory> <reportOutputDirectory>target/javadoc</reportOutputDirectory> <charset>UTF-8</charset> <encoding>UTF-8</encoding> <docencoding>UTF-8</docencoding> <show>private</show> </configuration> </plugin> <!-- Bereitstellung für native-> <plogin> <GroupId> org.codeehaus.cargo </GroupId> <artifactId> Cargo-maven2-Plugin </artifactid> <version> 1.0 </Version> <Configuration> <Container> <Containerid> Tomcat6x </containid> <home> d: /weserver/apache-tomcat-6.0.0.0./Webserver/apache-6.0.0. </container> <configuration> <typs3.. Federkonfiguration einführen
Schreiben Sie eine Konfigurationsdatei und platzieren Sie die Konfigurationsdatei in das Verzeichnis SRC/Main/Ressourcenressourcen (unten).
Konfigurationsinformationen, die von der Projektkonfiguration erforderlich sind. Properties
#Application configs#jdbc c3p0 configjdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc: mysql: // localhost: 3306/work? confighiberNate.dialect = org.hiberNate.dialect TruhiberNate.cache.region.factory_class = org.hibernate.cache.ehcache.ehcacheregionFactoryHiberNate.cache.provider_Configuration_File_Resource_path = EHCache.xml
3.1. Federkonfiguration
Die Konfigurationsdatei von Spring.xml lautet wie folgt:
<? xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.spingframework.org/schema/beans http://www.springframework.org/schems/beans- http://www.springframework.org/schema/context http://www.springFramework.org/schema/context/spring-context-4.1.xsd "> <!-Ladekonfigurationsdatei-> <context: Property-Placex-SPLACED-SPACED-SPLACTER-SCACTER-SPRACT-SPRACT-SPASSPACK. bean-> <context: component-scan base-package = "org.andy.work.service.impl, org.andy.work.dao.impl" /> < /beans>
Die obige Feder konfiguriert das automatische Bean -Injektionsmanagement der entsprechenden Komponentenbohnen unter dem Paket. Wir müssen die Implementierungsklasse von DAO und Service zu Frühling übergeben, um zu verwalten, z. B. (@repository, @Service).
3.2. Log -Dateikonfiguration log4j einführen
Die Konfigurationsdatei von log4j.properties lautet wie folgt: ### Log -Ebenen ### log4j.rootlogger = info, c, d, e ### console ### log4j.appender.c = org.apache.log4j.consoleAppenderlog4j.appender.c.target = system.outlog4j.appender.C.C.C.TARGE = System.outlog4j.Appenders org.apache.log4j.patternLayoutLog4j.appender.c.layout.ConversionPattern = [SpringMvc_HiberNate_Demo] [%p] [%-D {YYYY-MM-DD HH: MM: SS}]%C.%m (%l) | %M%N ### Protokolldatei ### log4j.appender.d = org.apache.log4j.dailyrollingFileAppenderLog4j.appender.d.File = ../logs/springmvc_hibernate_demo.loglog4j.appender.d.append = truelog4j.Appenders log4j.appender.d.layout = org.apache.log4j.patternLayoutLog4j.appender.d.Layout.ConversionPattern = [SpringMvc_HiberNate_DEMO] [%p] [%-D {Yyyy-mm-dd hh: mm: mm: ss}]%c. %M%N ### Ausnahme ### Log4j.appender.e = org.apache.log4j.dailyrollingFileAppenderLog4j.Appender.e.File = ../logs/springMvc_hibernate_demo_error.loglog4j.appendendrang = Furog4j. log4j.appender.e.layout = org.apache.log4j.patternLayoutLog4j.appender.e.layout.ConversionPattern = [SSPRINGMVC_HIBERNATE_DEMO] [%p] [%-D {yyyyym-mm-dd hh: mm: mm: ss}]%c.%C.%C.%C.%C.%M (%l) | %m%n 4. Hibernate -Konfiguration
Die Konfiguration von Hibernate umfasst hauptsächlich: Konfigurieren der Datenquelle C3P0, Konfigurieren von SessionFactory, Konfigurieren von Transaktionsmanager und Konfiguration der Transaktionsmanagement. Die Datei feder-hiberNate.xml lautet wie folgt:
<? xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: aop = "http://www.spingframework.org/schema/aop" xsi: Schemalocation = "http://wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww.- http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/sping-tx- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-4.1.xsd "> <! id = "dataSource" zerstören-method = "close"> <Eigenschaft name = "triverClass" value = "$ {jdbc.driver}" /> <Eigenschaft name = "jdbcurl" value = "$ {jdbc.url}}" /> <Property name "user" $ "$ {jdbc.usern}" /< value = "$ {jdbc.password}" /> <!-Timeout anfordern-> <Eigenschaft name = "checkoutTimeout" value = "30000" /> <!-Überprüfen Sie alle Leerlaufverbindungen im Verbindungspool alle 60 Sekunden. Standardwert: 0, nicht prüfen-> <Eigenschaft name = "idleconnectionTestPeriod" value = "30" /> <!-Maximale Leerlaufzeit für Verbindungsdatenbankverbindungspool-> <Eigenschaft name = "maxidletime" value = "30" /> <!-Anzahl der Verbindungen initialisierte Verbindungen im Anschluss Pool-> <'Property ". /> <Eigenschaft name = "maxpoolsize" value = "20" /> <!- Anzahl der von C3P0 erhaltenen Verbindungen gleichzeitig zu einem Zeitpunkt, wenn die Verbindung im Verbindungspool erschöpft ist. Standardwert: 3-> <Eigenschaft name = "AccireIncrement" value = "5" /> < /bean> <!-Konfigurieren Sie Hibernate SessionFactory-> <bean id = "sessionFactory"> <! name = "hibernateProperties"> <props> <prop key = "hibernate.dialect"> $ {hibernate.dialect} </prop> <prop key = "hibernate.show_sql"> $ {hibernate.show_sql} </prop> <Prop> <Prop> <Prop> <Prop> <Prop> <Prop> <Prop> <Prop> <Prop> <Prop> <Prop> <Prop> <Prop> <Prop> <propus> <propus> <Prop> <Prop> <Prop> <Prop> <Prop. key = "hibernate.format_sql"> $ {hibernate.format_sql} </prop> <prop key = "hibernate.hbm2ddl.auto"> $ {hibernate.hbm2ddl.auto} </prop> <!-Turn 2 Cache Ehcache-> <prop. key = "hibernate.cache.use_second_level_cache"> $ {hibernate.cache.use_second_level_cache} </prop> <prop key = "hibernate.cache.use_query_cache"> $ {hibernate.cache.use_query_cache} </propus} </propus} </propus} </propus} </propus} </propus key = "hibernate.cache.region.factory_class"> $ {hibernate.cache.region.factory_class} </prop> <prop key = "hibernate.cache.provider_configuration_File_File_resource_path"> {Hibernate.cache.cache.provider_conider_filaation_file_file_file_file_file_file_file_file_file_file_file_file_file_resource_resource_resource_resource_resource_resource_resource_file_resource_datpa..provisation </props> </property> <!-- Scan the entity of the hibernate annotation configuration --> <property name="packagesToScan" value="org.andy.work.entity" /> </bean> <!-- Configure transaction manager --> <bean id="transactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- Configure transaction enhancement Bearbeiten von Beans und Geben Sie den Transaktionsmanager an-> <tx: rating id = "transactionAdvice" Transaktionsmanager = "TransactionManager"> <!!-DETADIERTE Transaktionsverarbeitungssemantik konfigurieren-> <tx: Attribute> <tx: method name = "einfügen Propagation = "Erforderlich" /> <tx: method name = "get*" propagation = "unterstützt" schreibgeschützt = "true" /> <tx: method name = "find*" propagation = "unterstützt" rese-only = "true" /> <tx: method name = "find*" Propagation = "Support". </tx: Attribute> </tx: Ratschläge> <!-Spring AOP-Transaktionsmanagement-> <AOP: config> <!-pointcut-> <AOP: pointcut id = "transactionPointCut" Expression = "Ausführung (*org.andy.work.work. <AOP: Advisor pointcut-ref = "transactionPointCut" Ratschläge-ref = "transactionAdvice"/> </aoP: config> </beans> Das obige ist mit dem sekundären Cache und dem EHCache konfiguriert. Die relevanten spezifischen Informationen finden Sie im vorherigen Artikel Hibernate Secondary Cache und EHCache Construction Configuration. Das Folgende ist die Konfiguration des sekundären Cache.
4.1. Ehcache.xml Konfiguration
<? Standardcache -Einstellung. -> <defaultCache maxelementsInmemory = "1000" eternal = "False" Timetoidleseconds = "120" TimetoliveSeconds = "120" maxelementsondisk = "1000000" Überlauf überlaufen. -> <cache name = "org.andy.work.entity.acctuser" MaxelementSinMemory = "2" MemorySevictionPolicy = "lru" eternal = "true" diskPersistent = "false" overlowtodisk = "false" maxelementsDisk = "1000000" /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> <-
Der obige Winterschlafsekundärcache EHCache ist D:/EHCache
5. Geschäftseinheit generieren
Nach dem Entwerfen der Datentabelle lassen Hibernate -Entitäten die Tool -Hibernate -Tools automatisch generiert. Eclipse erfordert die Installation des Hibernate-Tools-Plug-Ins (ich habe es mehrmals online installiert, aber es ist nicht erfolgreich. Es wird empfohlen, Links zur Installation von Offline zu verwenden, und der Anhang wird es vorstellen). Daher müssen man nicht manuell schreiben. Hier ist eine Entität mit Benutzerinformationen, Acctuser.java
Paket org.andy.work.entity; // generiert 2015-2-3 10:43:00 von Hibernate-Tools 4.0.0import java.util.date; import Java.util.hashset; Importe Java.util.set; javax.persistence.id; import Javax.Persistence.Joincolumn; Import Javax.Persistence.jointable; Import Javax.Persistence.Manytomany; Import Javax.Persistence.table; org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;import com.fasterxml.jackson.annotation.JsonIgnoreProperties;/** * AcctUser generated by hbm2java */@Entity@Table(name = "acct_user", catalog = "work")@Cache(usage = CacheConcurrencyStrategy.read_write) öffentliche Klasse Acctuser implementiert java.io.serializable { / ** * * / private statische endgültige lange Serialversionuid = 6980093847795726310l; private String -ID; privater String -Spitzname; privates Zeichenfolgen Telefon; privates Datumsregister; private set <Acctrol> acctroles = new Hashset <Acctrol> (0); public Acctuser () {} public Acctuser (String -ID, String -Spitzname) {this.id = id; this.nickname = Spitzname; } public acctuser (String -ID, String -Spitzname, String -Telefon, Datumsregister, Set <Acctrol> Acctroles) {this.id = id; this.nickname = Spitzname; this.telephone = Telefon; this.registerTime = RegisterTime; this.acctroles = Acctroles; } @Id @column (name = "id", eindeutig = true, nullable = false, length = 36) public String getId () {return this.id; } public void setID (String -ID) {this.id = id; } @Column (name = "nick_name", nullable = false) public String getNickName () {return this.nickname; } public void setNickName (String -Spitzname) {this.nickname = spitzname; } @Column (name = "telefon") public String getTelephone () {return this.telephone; } public void settelephone (String telefon) {this.telephone = telefon; } @Temporal (temporAltype.timestamp) @Column (name = "Register_time", Länge = 19) öffentliches Datum getRegisterTime () {return this.registerTime; } public void setRegisterTime (Datumsregister) {this.registerTime = RegisterTime; } @JsonignoreProperties (value = {"Acctusers", "AcctaThorities"}) @Manytomany (fetch = fetCttype.lazy) @cache (useage = cacheConcurcurrencyStrategy.Read_Write) @jointable (name = "accT_User_role, Catalog =" Work ", joincolum =", joincolns.User_role ", catalog =", "Workingable", joincolns = ", joincolns =", ", catalog =", "Workelable", joincolns = ", joincolns =", ", catalog =", "Workolable", joincolns = ", joincolns = {oder @Joincolumn (name = "user_id", nullable = false, updatable = false)}, InverseJoColumns = {@joincolumn (name = "rollen_id", nullable = false, updatable = false)}) public set <Acctrol> getAcctroles () {return this.acctroles; } public void setAcctroles (set <Acctrol> acctroles) {this.acctroles = Acctroles; }} Es gibt einige Dinge oben zu beachten:
Die meisten der oben genannten werden automatisch durch Hibernate -Tools erzeugt, es gibt jedoch mehrere, die manuell hinzugefügt werden müssen:
1. Wenn diese Entität Stufe 2 -Cache verwendet, müssen Sie die @Cache -Annotation hinzufügen.
2. Wenn es in der Entität festgelegte Elemente (Set, Map, List) gibt und die Entität einen sekundären Cache verwenden möchte, müssen diese festgelegten Elemente auch mit @Cache -Annotation hinzugefügt werden.
3. @JsonignoreProperties Annotation besteht darin, zu verhindern, dass SpringMVC beim Rückkehr von JSON die Schleifenausgabe erzeugt. Wenn es nicht konfiguriert ist, tritt JSON Dead Loop (und viele eins-zu-Many-Eigenschaften) auf.
4. @Jsonignore konvertiert in JSON, um diese Eigenschaft zu ignorieren, während @JsonignoreProperties (value = {"Acctusers", "Accttauthorities"}) die Acctusers und Accttthorities -Eigenschaften in Acctroles ignoriert.
6. Erstellen Sie eine Dao -Schicht
6.1DAO -Schnittstelle
Wir müssen die Idee der Facial Interface -Programmierung in der DAO -Ebene und in der Serviceschicht übernehmen. Daher definieren wir zunächst eine allgemeine DAO -Schnittstelle, GenericDao.java
Paket org.andy.work.dao; Import Java.io.Serializable; Import Java.util.List;/** * Erstellte Zeit: 2015-2-6 2:26:42 PM * * @Author Andy * @Version 2.2 * * Dao General Interface */Schnittstelle genericdao <t, pk erweitert, Pk Ids, Pk Ids, Pk id). T GET (PK ID); Liste <T> findAll (); void persist (t Entity); PK Save (t Entity); void SaveorUpdate (t Entity); void Delete (PK ID); void Flush ();}
Definieren Sie die spezifische Benutzeroberfläche userdao.java
Paket org.andy.work.dao; import org.andy.work.entity.acctuser;/** * Erstellungszeit: 2015-2-6 2:43:50 PM * * @Author Andy * @Version 2.2 * * Benutzer Dao Interface */Public Interface Userdao erweitert Genericdao <Acctuser, String> {} {}6.2. DAO -Schicht -Implementierungsklasse
Wir müssen die Implementierungsklasse der DAO -Ebene in Bohnen einfügen. Daher müssen wir die @Repository -Annotation hinzufügen. UserDaoImpl lautet wie folgt:
Paket org.andy.work.dao.impl; Import Java.util.List; import org.andy.work.dao.userdao; org. private Sitzung getCurrentSession () {return this.SessionFactory.getCurrentSession (); } @Override public Acctuser load (String -ID) {return (acctuser) this.getCurrentSession (). Load (Acctuser.Class, id); } @Override public acctuser get (String id) {return (acctuser) this.getCurrentSession (). Get (Acctuser.Class, id); } @SuppressWarnings ("Deaktiviert") @Override öffentliche Liste <Acctuser> findAll () {list <Acctuser> Acctusers = this.getCurrentSession (). CreateEquery ("From Acctuser"). SetCacheable (true) .List (); Acctuser zurückgeben; } @Override public void persist (Acctuser Entity) {this.getCurrentSession (). Persist (Entity); } @Override public String Save (Acctuser Entity) {return (String) this.getCurrentSession (). Save (Entity); } @Override public void SaveorUpdate (Acctuser Entity) {this.getCurrentSession (). SaveOrUpdate (Entity); } @Override public void delete (String -ID) {acctuser entity = this.load (id); this.getCurrentSession (). Delete (Entität); } @Override public void flush () {this.getCurrentSession (). Flush (); }}7. Erstellen Sie eine Serviceschicht
7.1. Service Layer -Schnittstelle
Paket org.andy.work.service; Import Java.util.List; import org.andy.work.entity.acctuser;/** * Erstellungszeit: 2015-2-6 3:18:57 PM * * @Author Andy * @Version 2.2 * Userservice Interface */Public Interface Userservice {Acctuser-Ladevorgang (String Id); Acctuser get (String -ID); Liste <Acctuser> findAll (); void persist (Acctuser -Entität); String Save (Acctuser Entity); void SaveorUpdate (Acctuser -Entität); void delete (String -ID); void Flush ();}7.2. Service -Layer -Implementierungsklasse
UserServiceImpl muss die oben definierte DAO -Schichtbohne injizieren.
Paket org.andy.work.service.impl; Import Java.util.List; import org.andy.work.dao.userdao; org.springframework.stereotype.service;/** * Erstellungszeit: 2015-2-6 3:24:16 PM * * @Author Andy * @Version 2.2 UserService-Implementierung */ @service ("UserService") öffentliche Klassen-Benutzerservice-Benutzerservice {@autoWered private userDao userDao; @Override public acctuser load (String -ID) {return userDao.load (id); } @Override public acctuser get (String id) {return userDao.get (id); } @Override öffentliche Liste <Acctuser> findAll () {return userDao.findall (); } @Override public void persist (Acctuser Entity) {userDao.Persist (Entity); } @Override public String Save (Acctuser Entity) {return userDao.save (Entity); } @Override public void SaveorUpdate (Acctuser Entity) {userDao.saveorUpdate (Entity); } @Override public void delete (String -ID) {userDao.delete (id); } @Override public void flush () {userDao.flush (); }}8. Testen Sie die Integration von Frühling und Winterschlaf
Wir können eine Testklasse in SRC/Test/Java schreiben, um die obige Konfiguration zu testen. Wenn der Test erfolgreich ist, wird er grundsätzlich abgeschlossen.
Paket org.andy.work.service; import Java.util.date; import Java.util.list; import Java.util.UUID; org.springframework.beans.factory.annotation.autowired; import org.springframework.test.context.ContextConfiguration; 3:31:07 PM * * @Author Andy * @Version 2.2 */ @runwith (SpringJunit4ClASSRunner.class) @ContextConfiguration (Locations = {"Classpath: Spring.xml", "Class Path: Spring-Hbernate.xml"}) öffentlicher Klassen-Testsservice {private statische logger Logger Logger Logger Logger "Logger" Logger "Logger" Logger "Logger" Logger "Logger" Logger "Logger" Logger "Logger" Logger "Logger" Logger "Logger" Logger "Logger" {privat .GetLogger (testuSerService.class); @Autowired Private UserService UserService; @Test public void Save () {Acctuser Acctuser = new Acctuser (); Acctuser.setId (uUid.randomuuid (). toString ()); Acctuser.SetNickName ("Andy"); Acctuser.SetRegisterTime (neues Datum ()); Acctuser.Settelephone ("130222221111"); String id = userService.save (Acctuser); Logger.info (json.tojonstring (id)); }}9. Einführung in SpringMVC
Fügen Sie Spring-Mvc.xml-Datei hinzu
<? xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: p = "http://www.spingframework.org/schema/p" xmlns: context = "http./wwwwwwwwwwwwwwwwwwwwww./ww.//wwwwwwwww.sprungramework: XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springFramework.org/schema/mvc http://www.springframe.org/Schema/Mvc/Spring-mvc--Mvc--Mvc-mvc-mving-mvc-mving-mving-mvcringframe.- Automatische Scan @Controller-Injektion als Bean-> <Kontext: Komponenten-Scan-Basis-Package = "org.andy.work.Controller" /> <!-Folgendes ist die SpringMVC-Konfiguration-> <MVC: Annotations-Driven> <!-Return JSON-Daten, @Antwortverbrauch- @-adocius-asement- NAME = "SupportedMediTypes"> <List> <wert> text/html; charSet = utf-8 </value> <wert> application/json; charset = utf-8 </value> </list> </achance> </bean> </mvc: messconverters> </mvc: addation-drium-addation-drium-addation-drianne <!-Die Modellansicht, die Voraussetzungen und -Annotations-DRIVENT-NAMSE, ASS. Name-> <bean> <Eigenschaft name = "viewClass" value = "org.springFramework.web.servlet.view.jstlview"/> <Eigenschaft name = "prefix" value = "/web-inf/views"/> <Eigenschaft name = "Suffix" value = ". jspan> </lean>
Der Paket -Scan -Controller, [E -Mail -geschützte] �� und die Ansichtsschichtkonfigurationen sind oben konfiguriert.
10. Konfigurieren Sie den Container von web.xml
Webcontainer sind das Gehirn von Webprojekten, daher müssen Web -Container zunächst Spring einführen, Spring verschiedene Frameworks verwalten und in Bohnen einfügen. Konfigurieren Sie dann die Filterinformationen der Steuerungsschicht. Und die von SpringMVC abgefangene URL ist auf Anfragen konfiguriert, die in .HMLS enden.
Die Datei web.xml lautet wie folgt:
<? xmlns: web = "http://java.sun.com/xml/ns/javaee" xmlns: web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" XSI: Schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id = "webapp_id" Version = "2.5> <diagnern- <Param-name> contextconfigLocation </param-name> <param-value> classPath: fRING.xml, classPath: Spring-hibernate.xml </param-value> </context-param> <filter> <filter-name> codierungfilter </filter-name> <Filterklasse> org.springFramework.web.filter.Charactercodingfilter </Filter-Klasse> <init-param> <param-name> codieren </param-name> <param-value> utf-8 </param-value> </init-param> <init-param> <param-name <param-value> true </param-value> </init-param> </filter> <filter- mapping> <filter-name> codingFilter </filter-name> <url-pattern>/*</url-puffer> </filter-mapping> <! <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>singleSession</param-name> <param-value>true</param-value> </init-param> </filter> <!-- Listen to ServletContext- und Start-Spring-Konfigurationsinformationen in ContextConfigLocation-> <Hörer> <Hörer-Class> org.springframework.web.Context.ContextloaderListener </Listener-Class> </listener> <!-Listener> <hörer-classes> org.springFrameWorm.wramework.wramework.WEBRAME </Listener> <!-Verhindern Sie den Spring Memory Overflow-Hörer-> <Hörer> <Hörer-Klasse> org.springframework.web.util.InrospectorCleanUplistener </Listener-Class> </Hörer> <servlet> <Bection> Spring MVC Servlet </Beschreibung> <Servlet-Name> REST </DERNLET </DERNLET </DERNLET </DERNAME> REST </DERNLET </DERNLET </DERNAME> REST </DERNLET </DERNLETT </DERNAME> REST </DERNLETE> REST </DERNLET </DERNLETE> <servlet-classe> org.springFramework.web.servlet.DispatcherServlet </Servlet-Class> <init-param> <param-name> contextconfigLocation </param-name> <!-Hier ist die SpringMVC-Konfigurationsdatei-> <Param-Parame> ClassPad: Spring-Mvc.xml </Param-pad: Spring-Mvc.xMl </param-Value> </param> Inith. <Load-on-Startups> 1 </load-on-startup> </servlet> <Servlet-Mapping> <Servlet-Mapping> <Servlet-name> Rest </Servlet-name> <url-pattern>*. <URL-Muster>*.
11. Erstellen Sie einen Steuerelement -Controller
Steuerschicht UserController
Paket org.andy.work.controller; import Java.util.list; import org.andy.work.entity.acctuser; import org.andy.work org.springframework.stereotype.controller; import org.springframework.ui.modelmap; import org.springframework.web.bind.annotation.PathVariable; org.springframework.web.bind.annotation.Responsebody;/** * Erstellungszeit: 2015-2-7 11:49:00 * @Author Andy * @Version 2.2 * Beschreibung: Benutzercontroller */ @Controller @RequestMapping ("/user") öffentliche Klasse Usercontroller {private statische State-Logger-Logger = Logger.getLogger (userController.class); @Autowired Private UserService UserService; @RequestMapping ("/showInfo/{userId}") public String showUserInfo (modelMap modelMap, @PathVariable String userID) {logger.info ("Query -Benutzer:" + userID); Acctuser userInfo = userService.load (userID); modelMap.addattribute ("userInfo", userInfo); zurück "/user/showInfo"; } @RequestMapping ("/showInfos") public @ResponseBody -Liste <Acctuser> showuserInfos () {logger.info ("alle Benutzer des Benutzers abfragen"); Liste <Acctuser> userInfos = userService.findall (); return userInfos; }}12、创建视图层
在src/main/webapp/WEB-INF/views下创建user/showInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><base href="<%=basePath%>" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script type="text/javascript" src="js/jquery-1.9.1.min.js"></script><title>userInfo</title></head><body> User information nickname: ${userInfo.nickName} User id: ${userInfo.id} User phone: ${userInfo.telephone } Registration time: <fmt:formatDate value="${userInfo.registerTime }" pattern="yyyy-MM-dd HH:mm:ss" /> Role: [ <c:forEach items="${ userInfo.acctRoles}" var="role"> ${role.name } Permissions[ <c:forEach items="${ role.acctAuthorities}" var="authority"> ${authority.name } </c:forEach> ] </c:forEach> ] <br /> ajax displays all user information: <div id="show_all_user"></div></body><script type="text/javascript"> $.ajax({ type : "get", url : "user/showInfos.htmls", dataType : "json", success : function(data) { $(data).each( function(i, user) { var p = "<p>Nickname:" + user.nickName + " Phone:" + user.telephone + " Registration time:" + user.registerTime + " id:" + user.id + "</p>"; $("#show_all_user").append(p); }); }, async : true });</script></html>13、部署服务器测试
使用Maven打包部署:clean compile package
部署到tomcat,测试主要测试上面的http://localhost:8080/springmvc_hibernate_demo/user/showInfo/6e5afb1d-50e1-45fe-b6fe-b9e399415387.htmls
和http://localhost:8080/springmvc_hibernate_demo/user/showInfos.htmls (json数据返回)
上面视图层就包含了这两条url请求的测试:
ok,到此Spring+SpringMVC+Hibernate搭建完毕。
博客来源:http://blog.csdn.net/fengshizty?viewmode=list
项目源码:http://download.csdn.net/detail/fengshizty/8432647
I hope to help friends in need and continue to add relevant information in the future. Vielen Dank für Ihre Unterstützung für diese Seite!