Kata pengantar
Hari ini saya akan meninjau konstruksi SpringMVC+Hibernate. Saya awalnya berpikir bahwa kerangka kontrol izin keamanan musim semi juga akan dimasukkan di dalamnya, tetapi saya menemukan bahwa ada terlalu banyak konten. Mari kita serahkan ke artikel berikutnya. Artikel ini terutama membangun springmvc4.1.4 dan hibernate4.3.8. Saya juga pernah menggunakan banyak SpringMVC sebelumnya. Bagian ini sangat akrab dengannya. Bagaimanapun, SpringMVC telah dikembangkan selama lebih dari setahun. Kali ini, lapisan persistensi menggunakan hibernate, sumber data menggunakan C3P0, dan database menggunakan MySQL sementara. Saya terutama ingin meninjau Hibernate. Gagasan membangun kerangka kerja SpringMVC+Hibernate adalah sebagai berikut:
1. DESAIN DATABASE: Desain struktur tabel, yang terbaik adalah memenuhi 3NF, dan menggunakan alat hibernate untuk secara otomatis menghasilkan entitas entitas yang sesuai.
1. Buat proyek Maven dan masukkan dependensi paket Maven sesuai kebutuhan.
2. Build Spring: Konfigurasikan injeksi pegas dari kacang lapisan kontrol.
3. Build Hibernate: Konfigurasikan sumber data, konfigurasikan SesionFactory, konfigurasikan transaksi, dan konfigurasikan cache sekunder Ehcache.
4. Uji Konstruksi Kerangka Kerja Spring+Hibernate, Write Unit Test Junit, Konfigurasi Transaksi Uji, dll.
5. Input SpringMVC: Konfigurasikan informasi konfigurasi SpringMVC.
6. Konfigurasikan wadah web.xml
7. Uji integrasi tiga kerangka kerja: Maven mengkompilasi, paket dan menyebarkan server, dan tes.
1. Desain Basis Data
Rancang tabel izin, peran, dan pengguna. Tentu saja, jika pengguna dapat memiliki banyak peran, satu peran memiliki banyak pengguna; Satu peran memiliki banyak izin, dan satu izin sesuai dengan beberapa peran. Oleh karena itu, sesuai dengan desain struktur tabel basis data, jika memenuhi 3NF, kita membutuhkan 5 tabel untuk ada. Informasi spesifik tabel tidak terdaftar (Anda dapat mengunduhnya dalam kode sumber, dan ada juga database di dalamnya), dan hubungan tabel adalah sebagai berikut:
Hanya dalam ID ini yang digunakan adalah UUID (36-bit)
2. Buat proyek Maven dan tulis file pom.xml
Buat proyek WebApp Maven, tulis file pom.xml, dan perkenalkan dependensi paket yang diperlukan. Saya akan memetakan semua yang diperlukan di sini.
Konten file pom.xml adalah sebagai berikut:
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http:/maven.romp.romp.romp. http://maven.apache.org/maven-v4_0_0.xsd "> <podelversion> 4.0.0 </modelversion> <groupid> org.andy.sh </groupid> <Artifactid> springmvc_hibernate_demo </Artifactid> WARTRIMING </version.0-s-10.0 <name> springmvc_hibernate_demo maven Webapp </name> <rurl> http://maven.apache.org </rerl> <proyproy.build.sourceencoding> UTF-8 </proeD.build.sourceencoding> <spring.version.4.14.srele.sourceencoding> <spring.version. <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 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </Dependency> <dependency> <GroupId> org.springframework </groupid> <ArTifactId> Spring-Context </artifactId> <version> $ {spring.version} </version> </artifactid> <groupid> org.springframework </version> <Artifactid> <groupid> org.springFramework </groupid> <Artifactid> <version> $ {spring.version} </version> </dependency> <dependency> <groupId> org.springframework </groupid> <RaintifactId> spring-web </t Artifactid> <version> $ {spring.version} </version> </dependency> <dependency> <version> <groupid> <ArTifactId> spring-test </stifactid> <version> $ {spring.version} </version> <scope> test </cope> </dependency> <!-Mengkonfigurasi dengan springmvc-> <dependency> </org.springframework </groupid> <ArtifactId> version </version> </version> </version> </version> </version> </version> </version> </version> </version> </version> </version> </version> <TroFacTID> <TROP-WEBMVC </GroupId> <TROP-WEBMVC </GroupID> <TROP-WEBMVC </GROUTID> </Dependency> <!- Saat mengintegrasikan database relasional, Anda perlu mengonfigurasi seperti Hibernate JPA. -> <dependency> <GroupId> org.springframework </groupid> <ArTifactId> Spring-orm </stifactid> <version> $ {spring.version} </version> </dependency> <!-hibernate-> <groupnate> org.hibernate </groupid> <ArtifAcid> <crupnacy> hibnate <cornacy> <croxnate> <cornact> <cornate> hibnate </groupid> <ArtifActid> <version> $ {hibernate.version} </version> </dependency> <dependency> <GroupId> org.hibernate </groupid> <ArTifactId> hibernate-ehcache </artifactid> <version> $ {hibernate.version} </version> </Dependency> <version> $ {hibernate. <groupId> net.sf.ehcache </groupid> <ArTifactId> ehcache </artifactid> <version> 2.9.0 </version> </dependency> <!-log4j-> <dependency> <groupid> LOG4J </groupid> <ArtifactId> log4j </Artifactid> </grupid </artifactid> </log4j </artifactid> </groupid> <titifactid> LOG4J </arttifactid> </MyFactid </Myfactid> </My/MyFactid> </MyFACTID </ArtifactD> </MyFactID> <T/MY/MYFACTID> </Artifactid> </ArtiFactID> </ArtiFACTID> </ARTIFACTID> </art <dependency> <GroupId> mysql </proupid> <ArtifactId> mysql-connector-java </arttifactid> <version> 5.1.34 </version> </dependency> <!-C3P0 Sumber Data-> <groupid> com.mChange </groupid> C3P0 SUMBERTID> C3ACID0 <RUPRIPIDF0 <RUMRIPIDR0 </ARTIF/COM. </Dependency> <!-json-> <dependency> <groupid> com.alibaba </groupid> <ArtifactId> fastjson </t Artifactid> <version> 1.2.3 </version> </dependency> <ArtifacD> com.fasterxml.jackson.core </groupid> <Artifactid> Jackson/ARTACTICES.Core </groupid> <Artifactid> JACKSON/ARTIFSON/ARTACTICE </groupid> <ArtifacTID> <version> $ {jackson.version} </version> </dependency> <dependency> <GroupId> com.fasterxml.jackson.core </groupid> <ArtifactId> Jackson-core </artifactid> <version> $ {jackson.version} </version> </Dependency> <version> <version> <version> COMROUPID. <ArTifactId> Jackson-Databind </StifactId> <Version> $ {jackson.version} </version> </ganden> <!-aop-> <dependency> <groupid> org.aspectj </groupid> <ArTifactId> InspecteRWeaver </artifactid> </Versi 1.8.4 </Version> </Version> </artifactid </artifactid </artifactid </artifactId </artifactid </artifactid </artifactid </artifactid <GroupId> javax.servlet </groupid> <ArTifactId> servlet-api </t Artifactid> <version> 3.0-alpha-1 </version> <scope> disediakan </seupope> </sependency> <sependency> </art/versi </grupid> <TREPTLIENDS> <TROPID> </ARTICED </GroupID> <ArtlifacTid> JStifAD </art </Dependencies> <build> <finalname> springmvc_hibernate_demo </finalname> <lugin> <!-Jalankan tes unit junit dalam classloader yang terisolasi-> <plugin> <sroupid> org.apache.maven.plugins </groupid> <ArTtifactid> Maven-Surefire-PLUGINS </groupid> <ArTtifactid> Maven-Surefire--Curefire.PLUGINS </groupid> <ArTtifacTid> Maven-Surefire- Maven-Surefire </Groupid> <ArtUrED> MAVENCIGED> MAVENACIF.PUREFICINS </GROUPID> <Configuration> <skiptests> true </skiptests> </configuration> </lugin> <lugin> <groupid> org.apache.maven.plugins </plorgid> <Artifactid> Maven-war-plugin </artifactid> <versi> 2.3 </version> <Configuration> <sebxml> src/main/webapp/web-inf/web.xml </sebxml> </configuration> </plugin> <!-menghasilkan java doc-> <plugin> <groupid> org.apache.maven.plugins </groupid> <ArtiFacTid> Maven-javaDoc-PlUBINS </groupid> <ArtiFacTid> <ArTifacTid> Maven-javaDoc-PlUBIN </ARTIFIUB <TIFAB> <ArTIFACTID> <javadocdirectory> target/javadoc </javadocdirectory> <paporToUtputDirectory> target/javadoc </potepteputputDirectory> <Charset> UTF-8 </charset> <coding> UTF-8 </encoding> <coubencoding> UTF-8 </encoding> UTF-8 </encoding> <docencoding> UTF-8 </docencod> Deploy to native --> <plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.0</version> <configuration> <container> <containerId>tomcat6x</containerId> <home>D:/WebServer/apache-tomcat-6.0.39</home> </container> <Configuration> <ypes> yang ada </ype> <home> d: /webserver/apache-tomcat-6.0.39 </tome> </configuration> </configuration> </plugin> </plugin> </build> </project>3. Perkenalkan konfigurasi pegas
Tulis file konfigurasi, dan tempatkan file konfigurasi di direktori sumber daya SRC/Main/Resources (sama di bawah).
Informasi Konfigurasi Diperlukan oleh Konfigurasi Proyek.Properties
#Application configs#jdbc c3p0 configjdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc: mysql: // localhost: 3306/work? UseUnicode = true & characterencoding = UTF-8JDBC.USNOn nama = root = true & characterencoding = UTF-8JDBC.USNAMNAME = ROOTJC = BB. confighibernate.dialect = org.hibernate.dialect.MySQLDialecthibernate.show_sql = truehibernate.format_sql = falsehibernate.hbm2ddl.auto = updatehibernate.cache.use_second_level_cache = truehibernate.cache.use_query_cache = TrueHibernate.cache.region.factory_class = org.hibernate.cache.ehcache.ehcacheregionfactoryhibernate.cache.provider_configuration_file_resource_path = ehcache.xml
3.1. Konfigurasi Musim Semi
File konfigurasi spring.xml adalah sebagai berikut:
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd "> <!-memuat file konfigurasi-> Konteks: Properti-Place-Location =" Classpath (CLASEDPATH. Bean-> <Context: Component-Scan Base-package = "org.andy.work.service.impl, org.andy.work.dao.impl" /> </tean>
Musim semi di atas mengkonfigurasi manajemen injeksi kacang otomatis dari kacang komponen yang sesuai di bawah paket. Kita perlu menyerahkan kelas implementasi DAO dan layanan untuk dikelola, seperti (@repository, @service).
3.2. Memperkenalkan konfigurasi file log log4j
File konfigurasi log4j.properties adalah sebagai berikut: ### Set Level Log ### LOG4J.ROOTLOGGER = Info, C, D, E ### Console ### LOG4J.Appender.c = org.Apache.log4j.consoleAppenderLog4j.appender.c.target = Systemat = = ConsoleAppenderLog4j.appender.c.carget = Systemse =consoleAppender. org.apache.log4j.patternlayoutlog4j.appender.c.layout.conversionPattern = [springmvc_hibernate_demo] [%p] [%-d {yyyy-mm-dd hh: mm: ss}]%c.%m (%l) | %m%n ### File log ### log4j.appender.d = org.apache.log4j.dailyrollingfileAppenderLog4j.applender.d.file = ../logs/springmvc_hibernate_demo.loglog4j.appender.d.appling = truel.pruLresh.thresh.thresh.thresh.thresh.thresh.thresh.threshresh.threshresh.threshresh.threshresh.thresh.thresh.thresher LOG4J.Appender.D.Layout = org.apache.log4j.patternLayoutLog4j.Appender.d.layout.conversionPattern = [springmvc_hibernate_demo] [%p] [%-d {yyyy-mm-dd hh: mm: ss}]%c.%c.%c.%c.%c.%c.%c.%c.%c.%c.%c.%c.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%M.%C.%M.%M.%C.%M.%C.%M.%C.%M.%M. %m%n ### pengecualian ### log4j.Appender.e = org.apache.log4j.dailyrollingfileAppenderLog4j.applender.e.file = ../logs/springmvc_hibernate_demo_error.loglog4j.applender.e.aprepend = = Apend =) LOG4J.Appender.e.layout = org.apache.log4j.patternlayoutlog4j.Appender.e.layout.conversionPattern = [sspringmvc_hibernate_demo] [%p] [%-d {yyyy-mm-dd hh: mm: ss}] [%c.%c.%c. %M N 4. Konfigurasi Hibernate
Konfigurasi Hibernate terutama meliputi: Mengkonfigurasi sumber data C3P0, Mengkonfigurasi Sesi, Mengkonfigurasi Manajer Transaksi, dan Mengkonfigurasi Manajemen Transaksi. File Spring-Hibernate.xml adalah sebagai berikut:
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http:/schema/aop" xsi: schemalocation = "http:/schema.aop" http://www.springframework.org/schema/beans/spring-weans-4.1.xsd http://www.springframework.org/schema/tx http://www.spramework.org/schema/tx:tp:tx:-/www.spramework.org/schema/tx http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springfringewework.org/schema/aop/spring-aop-4.springfringwork.org/schema " ID = "DataSource" Destroy-Method = "Tutup"> <nama properti = "driverclass" value = "$ {jdbc.driver}" /> <name properti = "jdbcurl" value = "$ {jdbc.url}" /> <nama properti = "pengguna" value = "$ {jdbc.usern}" /> <"name =" User "value =" $ {jdbc.usern} " /> value = "$ {jdbc.password}" /> <!-permintaan timeout-> <name properti = "checkouttimeout" value = "30000" /> <!-periksa semua koneksi idle di kumpulan koneksi setiap 60 detik. Nilai default: 0, tidak memeriksa-> <name properti = "idleConnectionTestPeriod" value = "30" /> <!-waktu idle maksimum untuk koneksi koneksi kumpulan koneksi-> <nama properti = "maxidletime" value = "30" /> <!-Jumlah koneksi yang diinisialisasi dalam koneksi pool-> <nama properti = "30" /> <! /> <name properti = "maxpoolSize" value = "20" /> <!- Jumlah koneksi yang diperoleh C3P0 pada saat yang sama pada satu waktu ketika koneksi di kumpulan koneksi habis. Nilai Default: 3-> <nama properti = "AcquireIncrement" value = "5" /> </ bean> <!-Mengkonfigurasi hibernate sessionFactory-> <bean id = "sessionfactory"> <!-lihat kode sumber untuk menyuntikkan sumber data-> <nama properti = "dataSource" Ref = "DataSource" <! name = "HibernateProperties"> <s props> <prop key = "hibernate.dialect"> $ {hibernate.dialect} </prop> <prop key = "hibernate.show_sql"> $ {hibernate.show_sql} </show> <prop> key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <!-- Turn on Level 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 orcache} </prop> </hibernate. KEY = "hibernate.cache.region.factory_class"> $ {hibernate.cache.region.factory_class} </prop> <prop key = "hibernate.cache.provider_configuration_file_resource_path"> $ {hibernate.cache.proviure_file_resource_path "> $ {hibernate.cache.provider_file_resource_path"> $ {hibernate.cache.proviure_file_resource_path "> $ {hibernate.cache.proviure </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 Peningkatan pemrosesan kacang dan tentukan transaksi manajer-> <tx: saran id = "transactionadvice" transaction-manager = "transactionManager"> <!-Mengkonfigurasi semantik pemrosesan transaksi terperinci-> <tx: atribut> <tx: "nama metode =" masukkan*"propagasi =" wajib /" propagasi = "wajib" /> <tx: nama metode = "get*" propagation = "mendukung" baca-only = "true" /> <tx: metode nama = "find*" propagation = "mendukung" baca-only = "true" /> <tx: nama metode = "find*" propagasi = "dukungan" read-only = "true" /":" Method Lainnya-"Dukungan" DUKUNGAN "TRANT" TRANT "LAINNYA-" DUKUNGASI "LAINNYA-" Dukungan " </tx: Atribut> </tx: Saran> <!-Manajemen transaksi AOP Spring-> <aop: config> <!-Konfigurasi pointcut-> <aop: pointcut id = "transactionpointcut" ekspresi = "eksekusi (*org.andy.work. <AOP: Advisor pointcut-ref = "transactionpointcut" saran-ref = "transactionadvice"/> </aop: config> </boy> Di atas dikonfigurasi dengan cache sekunder dan ehcache. Untuk informasi spesifik yang relevan, silakan lihat artikel sebelumnya Hibernate Secondary Cache dan Ehcache Construction Configuration. Berikut ini adalah konfigurasi cache sekunder.
4.1. Konfigurasi ehcache.xml
<? XML Versi = "1.0" encoding = "UTF-8"?> <Ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: nonamespacesChalocation = "../ config/eHcache.xse. Pengaturan DefaultCache. -> <DefaultCache MaxElementsInMemory = "1000" Eternal = "False" TimeToidleseconds = "120" TimeTolivesEconds = "120" MaxElementsondisk = "1000000" overflowTodisk = "True" MemorySoreEvictionPolicy = "LRU"> </defaultcache> <! -> <cache name = "org.andy.work.entity.acctuser" maxeLementsInmemory = "2" MemoryStoreEvictionPolicy = "lru" Eternal = "true" diskpersistent = "false" overflowTodisk = "false" maxeLementsondisk = "1000000" /< /evflowtodisk = "false" maxeLementsondisk = "1000000" /< /Ehcache> "false" false "false" 1000000 " /< /ehcache>
Ehcache cache sekunder hibernasi di atas adalah D:/ehcache
5. Hasilkan Entitas Bisnis
Setelah merancang tabel data, entitas hibernasi memiliki alat hibernate alat yang dihasilkan secara otomatis. Eclipse memerlukan pemasangan plug-in alat hibernate (saya telah menginstalnya secara online beberapa kali tetapi tidak berhasil. Disarankan untuk menggunakan tautan untuk menginstal offline, dan lampiran akan memperkenalkannya). Karena itu, tidak perlu menulis secara manual. Berikut adalah entitas dengan informasi pengguna, acctuser.java
Paket org.andy.work.entity; // Dihasilkan 2015-2-3 10:43:00 oleh Hibernate Tools 4.0.0Import java.util.date; impor java.util.hashset; impor java.util.set; impor javax.persistence.column; impor javax.persistypers.persity; javax.persistence.id; impor javax.persistence.joincolumn; impor javax.persistence.jointable; impor javax.persistence.manytomany; import javax.persistence.table; impor javax.persistence.temporal; impor javax.persistence.cemporACHations. org.hibernate.annotations.CacheconcurrencyStrategy; impor com.fasterxml.Jackson.annotation.jsonignoreproperties;/** * acctuser yang dihasilkan oleh hbm2Java */@entitas@tabel = "acct_user", catalog = "kerja"))@cache (name = "acct_user", catalog = "kerja"))@cache (name = "acct_user", catalog = "catalog")@cace (acct_user ") Acctuser mengimplementasikan java.io.serializable { / ** * * / private static final long serialversionuid = 6980093847795726310l; ID string pribadi; nama panggilan string pribadi; telepon string pribadi; Daftar Tanggal Pribadi; set pribadi <cructrole> acctroles = hashset baru <cctrole> (0); public acctuser () {} public acctuser (string id, string nickName) {this.id = id; this.nickname = nama panggilan; } public acctuser (string id, string nickname, string telepon, tanggal register, atur <cctrole> acctroles) {this.id = id; this.nickname = nama panggilan; this.telephone = telepon; this.registertime = registertime; this.acctroles = acctroles; } @Id @column (name = "id", unik = 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) string publik getNickName () {return this.nickname; } public void setNickName (nickname string) {this.nickname = nickName; } @Column (name = "Telepon") Public String getTelephone () {return this.telephone; } public void settelephone (string telepon) {this.telephone = telepon; } @Temporal (temporaltype.timestamp) @column (name = "register_time", length = 19) tanggal publik getregistertime () {return this.registertime; } public void setRegistertime (tanggal registertime) {this.registertime = registertime; } @JsonignoreproPerties (value = {"acctusers", "acctAuthority"}) @manytomany (fetch = fetchType.lazy) @cache (usage = cacheconcursystrategy.read_write) @jointable (name = "ACCT_USER_ROLOMNTEG.READ_WRITE) @jointable (name =" ACCT_USER_ROLOMNEnMN (name = "ACCT_USER_ROLOMNUMN", NAMETOMLUMN ", ACCT_UMERNOUnMNUMN", ACCT_OUNCOUnTUMN ", ACCT_OUNCRATETUMN" = "user_id", nullable = false, updateable = false)}, inverseJoincolumns = {@joInincolumn (name = "role_id", nullable = false, updatable = false)}) set publik <cructrole> getAcctroles () {return this.acctroles; } public void setAcctroles (set <cructrole> acctroles) {this.acctroles = acctroles; }} Ada beberapa hal yang perlu diperhatikan di atas:
Sebagian besar di atas secara otomatis dihasilkan oleh alat hibernasi, tetapi ada beberapa yang perlu ditambahkan secara manual:
1. Jika entitas ini menggunakan cache Level 2, Anda perlu menambahkan anotasi @Cache;
2. Jika ada set elemen (set, peta, daftar) di entitas, dan jika entitas ingin menggunakan cache sekunder, maka elemen yang ditetapkan ini juga harus ditambahkan dengan anotasi @cache.
3. @jsonignoreproPerties Anotasi adalah untuk mencegah SpringMVC menghasilkan output loop ketika JSON kembali. Jika tidak dikonfigurasi, JSON Dead Loop akan terjadi (dan banyak ke-banyak, properti satu-ke-banyak).
4. @jsonignore mengkonversi ke JSON untuk mengabaikan properti ini, sedangkan @jsonignoreproperties (value = {"acctusers", "AcctAthoritys"}) mengabaikan properti aktus dan akttauthority dalam aktrol.
6. Buat lapisan DAO
6.1dao Interface
Kita harus mengadopsi gagasan pemrograman antarmuka wajah di lapisan DAO dan lapisan layanan, jadi kami pertama -tama mendefinisikan antarmuka DAO umum, genericdao.java
Paket org.andy.work.dao; import java.io.serializable; import java.util.list;/** * waktu yang dibuat: 2015-2-6 26:42 pm * * @author Andy * @Version 2.2 * * Dao General Interface */Interface GenericDao <T, Pk Extends Extends Load; T get (pk id); Daftar <T> findAll (); void bertahan (t entitas); Pk save (t entitas); void saveorupdate (t entitas); void delete (ID PK); void flush ();}
Tentukan antarmuka userdao.java spesifik
Paket org.andy.work.dao; impor org.andy.work.entity.acctuser;/** * waktu penciptaan: 2015-2-6 2:43:50 pm * * @author Andy * @Version 2.2 * * antarmuka pengguna */antarmuka publik USERDAO Memperluas generikdao <acctuser, string> {public Interface {usaha {usaha {{{{{{{{{{{{acctuser>6.2. Kelas Implementasi Lapisan DAO
Kita perlu menyuntikkan kelas implementasi lapisan DAO ke dalam kacang, jadi kita perlu menambahkan anotasi @Repository, userdaoImpl adalah sebagai berikut:
Paket org.andy.work.dao.impl; impor java.util.list; impor org.andy.work.dao.userdao; impor org.andy.work.entity.acctuser; impor org.hibernate.session; Impor org.hibernate.SessionFactory; impor org.springfring.session. org.springframework.stereotype.repository;/** * Waktu Penciptaan: 2015-2-6 2:45:14 PM * * @author Andy * @Version 2.2 */ @Repository ("Userdao") Public Class UserdaoImpl mengimplementasikan Userdao {@autowired sesionfacpory publicctory; Sesi pribadi 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 ("Uncecked") @Override Public List <Acctuser> findAll () {List <acctuser> acctusers = this.getCurrentsession (). Createqueery ("from acctuser"). SetCacheable (true) .list (); Return Acctusers; } @Override public void bertahan (acctuser entity) {this.getCurrentSession (). SGST (entitas); } @Override Public String Simpan (AcctUser Entity) {return (String) this.getCurrentSession (). Simpan (entitas); } @Override public void saveorupdate (entitas acctuser) {this.getCurrentSession (). Saveorupdate (entitas); } @Override public void delete (string id) {acctuser entity = this.load (id); this.getCurrentSession (). hapus (entitas); } @Override public void flush () {this.getCurrentSession (). Flush (); }}7. Buat lapisan layanan
7.1. Antarmuka lapisan layanan
Paket org.andy.work.service; import java.util.list; impor org.andy.work.entity.acctuser;/** * waktu pembuatan: 2015-2-6 3:18:57 pm * * @Author Andy * @Version 2.2 * antarmuka Userservice */Interface Public Interface {Acctus {Acccuser {Acccuser {AccTuser (STRERSERVICE; Acctuser get (string id); Daftar <Acctuser> findAll (); void bertahan (entitas acctuser); String simpan (entitas acctuser); void saveorupdate (entitas acctuser); void delete (string id); void flush ();}7.2. Kelas Implementasi Lapisan Layanan
UserServiceImpl perlu menyuntikkan kacang lapisan DAO yang ditentukan di atas.
Paket org.andy.work.service.impl; impor java.util.list; impor org.andy.work.dao.userdao; impor org.andy.work.entity.acctuser; import org.andy.work.service.userservice; impor org.springfracfacrac. org.springframework.stereotype.service;/** * Waktu Penciptaan: 2015-2-6 3:24:16 PM * * @Author Andy * @Version 2.2 Implementasi Layanan Pengguna */ @Service ("Userservice") Public ClasserviceImpl mengimplementasikan UserserService {@Autowired Userdao Userdao PublicerPlements; @Override public acctuser load (string id) {return userdao.load (id); } @Override public acctuser get (string id) {return userdao.get (id); } @Override Public List <AccTuser> findAll () {return userdao.findall (); } @Override public void bertahan (AcctUser Entity) {userdao.persist (entitas); } @Override Public String Simpan (AcctUser Entity) {return userdao.save (entitas); } @Override public void saveorupdate (entitas acctuser) {userdao.saveorupdate (entitas); } @Override public void delete (string id) {userdao.delete (id); } @Override public void flush () {userdao.flush (); }}8. Uji integrasi musim semi dan hibernasi
Kita dapat menulis kelas tes di SRC/Test/Java untuk menguji konfigurasi di atas. Jika tes berhasil, pada dasarnya akan selesai.
Paket org.andy.work.service; import java.util.date; impor java.util.list; import java.util.uuid; org.andy.work.entity.acctuser; impor org.apache.log4j.logger; impor org.junit.test; impor org org.springframework.beans.factory.annotation.Autowired; Impor org.springframework.test.context.contextConfiguration; Impor org.springframework.test.context.junit4.springjunit4classRunner; impor com.alibaba. 3:31:07 pm * * @author andy * @version 2.2 */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = { "classpath:spring.xml", "classpath:spring-hibernate.xml" })public class TestUserService { private static final Logger LOGGER = Logger .getLogger (testuserservice.class); @Autowired Private UserServerServiceService; @Test public void save () {acctuser acctuser = new acctuser (); acctuser.setid (uuid.randomuuid (). tostring ()); acctuser.setnickname ("Andy"); acctuser.setRegistertime (tanggal baru ()); acctuser.settelephone ("13022221111"); String id = UsserService.Save (acctuser); Logger.info (json.tojsonstring (id)); }}9. Perkenalkan SpringMVC
Tambahkan file spring-mvc.xml
<? Xml Version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: mvc = "http://www.spramework.org/org/orga/http://www.spramework.org/orger" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: p = "http://www.springframework.org/schema/p" xmlns: context = "htpramework XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http:/wwww.spramework.orgemork.orgemework.orgemework/orgemework.orgemework.orgemework/orgemework.orgemework.orgemework.orgemework.orgemork.orgor.orger http://www.springframework.org/schema/context/spring-context-44 Otomatis pemindaian @controller injection as bean-> <context: component-scan base-package = "org.andy.work.controller" /> <!-Berikut ini adalah konfigurasi springmvc-> <mvc: annotation-driven> <!-return json data, @response-) <mvc: pesan-conver-convers <! name = "SupportedMediatypes"> <list> <value> Teks/html; charset = utf-8 </ value> <value> aplikasi/json; charset = utf-8 </value> </list> </priving> </bean-driven-to! Name-> <Bean> <name properti = "viewclass" value = "org.springframework.web.servlet.view.jstlview"/> <name properti = "prefix" value = "/web-inf/views"/> <name properti = "suffix" value = "Jsp"/</bean> </beans>
Pengontrol pemindaian paket, [email dilindungi] ��, dan melihat konfigurasi lapisan dikonfigurasi di atas.
10. Konfigurasikan wadah web.xml
Wadah web adalah otak proyek web, jadi wadah web pertama -tama perlu memperkenalkan musim semi, biarkan musim semi mengelola berbagai kerangka kerja, dan menyuntikkannya ke dalam kacang. Kemudian konfigurasikan informasi filter dari lapisan kontrol. Dan URL yang dicegat oleh SpringMVC dikonfigurasi ke permintaan yang berakhir dengan .HMLS.
File web.xml adalah sebagai berikut:
<? Xml Version = "1.0" encoding = "utf-8"?> <web-app xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://java.sun.com/xmlns =" http://java.com/xmlns = "http://java.com/xmlns = 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" versi = "2.5"> <-name> <-name> pajangan> <provedm> payudara> <provedm> payudara> <play-name> pajangan> <provedm> payud </name> version> </name> </name> </name> </name> </name '</name> </name> </name> </name> </name> </name> </name> </name> <play-name> <clay-name> <clay-name> <play-name> <play-name> <play-name> <param-name> ContextConfigLocation </param-name> <param-value> classpath: spring.xml, classpath: spring-hibernate.xml </param-value> </context-param> <nilter-name> encodingfilter </filter-name> <filter-classis> <filterspringpring.spring. <Ilin-param> <param-name> Encoding </param-name> <param-value> UTF-8 </param-value> </init-param> <Ilin-param> <param-name> ForceEncoding </param-name> <param-value> True </param-value> </init-param> </filterter> FILTER-MUSTER> </param-value> </init-param> </filterter> FILTER-MUBALUE> TRUE </param-value> </init-Param> </filterter> FILTER-MOLFOLE> TRUE </param-value> </init-Param> </filterter> FILTER-MOLFOLE> TRUE </param-Value> </init-Param> </filterter> <RURL-PATERS>/*</RURL-PATERS> </TERFERTER-MAPPING> <!-Konfigurasi OpenSessionInview adalah untuk menunda penutupan sesi ke lapisan tampilan-> <nilter> <filter-name> OpenSessionInviewFilter </filter-name> <nilter-class> org.springframework.orm.hibernate4. <param-name> Singlesession </param-name> <param-value> true </param-value> </it-param> </tilter> <!-Dengarkan ServletContext dan mulai informasi konfigurasi Spring di ContextConfigLocation-<listener> <listener-class> org.springframework.weB.context> <listener> <listener> org.springframework.web.context Pendengar> <leander-class> org.springframework.web.context.contextLoaderListener </listener-class> </engeaner> <!-cegah memori musim semi overflow listener-> <listener> <listener> org.spramework.web.util.util.introspectorer> <drestener> <lidorer> </listener </listener.web.util.util. MVC Servlet </Description> <servlet-name> rest </servlet-name> <servlet-class> org.springframework.web.servlet.dispatcherServlet </servlet-class> <init-param> <param-name> ContextConfigLocation </param-name> <! <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name>rest</servlet-name> <url-pattern>*.htmls</url-pattern> </servlet-mapping> <filter-mapping> <filter-name> OpenSessionViewFilter </tiler-name> <ritl-pola>*. HTMLS </RURL-PATERS> </TERFERTER-MAPPING> <!-Mengkonfigurasi Timeout Sesi, dalam hitungan menit-> <dreading-file-file-file--fileout> </session-timeout> </session-config-config> <creading-file-file-file-file> </session-timeout> </sessi </celcome-file-list> </web-app>
11. Buat Pengontrol Lapisan Kontrol
Kontrol Layer UserController
Paket org.andy.work.controller; impor java.util.list; impor org.andy.work.entity.acctuser; impor org.andy.work.service.userservice; impor org.apache.log4j.logger; impor org.springframework.beans.apache.annot. org.springframework.stereotype.controller; impor org.springframework.ui.modelmap; impor org.springframework.web.bind.annotation.pathvariable; impor org.springframework.web.bind.annotation.requestmapping; org.springframework.web.bind.annotation.responseBody;/** * Waktu Penciptaan: 2015-2-7 11:49:00 AM * @Author Andy * @Version 2.2 * Deskripsi: Pengontrol Pengguna * Controller @RequestMapping ("/User") Public Class Usercontroller {private static static static @requestMapping ("/user") Public class usercontroller {private static static static @ @Autowired Private UserServerServiceService; @RequestMapping ("/showInfo/{UserId}") Public String showUserInfo (modelmap modelmap, @pathvariable string userid) {logger.info ("User kueri:" + userId); Acctuser userInfo = userservice.load (userid); modelmap.addattribute ("userInfo", userInfo); return "/user/showInfo"; } @RequestMapping ("/showInfos") public @ResponseBody List <Acctuser> showUserInfos () {logger.info ("query semua pengguna pengguna"); Daftar <AccTuser> userInfos = UserserVice.findall (); mengembalikan 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. Terima kasih atas dukungan Anda untuk situs ini!