Integrasi Kerangka SSH
Pendahuluan: Beberapa orang mengatakan bahwa kerangka kerja utama masih populer sekarang, dan SSM telah keluar sejak lama, apalagi SSH. Saya kira tidak demikian. Saat ini, banyak perusahaan masih menggunakan SSH, dan jika mereka berubah menjadi kerangka kerja utama, biayanya. Misalnya, di bidang IT keuangan, disarankan untuk menggunakan hibernate di lapisan database karena dapat dikembangkan dengan cepat, kecuali di internet. Karena melibatkan konkurensi tinggi, lapisan basis data menggunakan mybatis, yang memiliki efisiensi interaksi data yang lebih cepat. Karena itu, SSH tidak dapat diabaikan.
1. Apa itu ssh
SSH adalah kerangka kerja terpadu Struts+Spring+Hibernate, dan saat ini merupakan kerangka kerja open source yang populer untuk aplikasi web.
Sistem yang mengintegrasikan kerangka kerja SSH dibagi menjadi empat lapisan dalam hal tanggung jawab: lapisan presentasi, lapisan logika bisnis, lapisan kegiatan kegiatan dan lapisan modul domain untuk membantu pengembang membangun aplikasi web dengan struktur yang jelas, reusabilitas yang baik dan pemeliharaan yang nyaman dalam jangka pendek. Di antara mereka, struts digunakan sebagai infrastruktur keseluruhan sistem, yang bertanggung jawab untuk pemisahan MVC, dan dalam model bagian dari kerangka kerja struts, mengendalikan lompatan bisnis, menggunakan kerangka hibernasi untuk memberikan dukungan untuk lapisan persistensi, musim semi mengelola, mengelola struts dan hibernate. Pendekatan spesifik adalah: Gunakan metode analisis yang berorientasi objek untuk mengusulkan beberapa model sesuai dengan kebutuhan, mengimplementasikan model ini sebagai objek Java dasar, kemudian menulis antarmuka DAO (objek akses data) dasar, dan memberikan implementasi Hibernate DAO. Kelas DAO yang diimplementasikan oleh arsitektur hibernate digunakan untuk mewujudkan konversi dan akses antara kelas Java dan database. Akhirnya, musim semi mengelola dan mengelola penyangga dan hibernasi.
---------- Ensiklopedia Baidu
2. Bagian yang terlibat dalam SSH
3. Penyebaran lingkungan yang cepat
Di sini kami menggunakan demo kecil untuk menyelamatkan pelanggan untuk menunjukkan integrasi SSH
1. Impor paket JAR yang diperlukan
1). Kerangka kerja Struts2
* Struts-2.3.24/apps/struts2-blank/web-inf/lib/*.
* Struts2-SPRING-PLUGIN-2.3.24.jar --- Struts2 Mengintegrasikan Paket Plug-In Spring
2). Kerangka Hibernasi
* hibernate-release-5.0.7.final/lib/required/*.jar-Paket JAR Diperlukan oleh Hibernate Framework
* slf4j-api-1.6.1.jar-antarmuka log
* slf4j-log4j12-1.7.2.jar-implementasi log
* mysql-connector-java-5.1.7-bin.jar-paket driver mysql
3). Kerangka kerja musim semi
* Paket Inti IOC
* Paket inti AOP
* Templat JDBC dan Paket Inti Transaksi
* Spring mengintegrasikan paket tes junit
* Spring mengintegrasikan paket inti hibernate
* Spring mengintegrasikan paket inti Struts2
2. Konfigurasikan kode terkait pegas dan struts di web.xml
1) Mengkonfigurasi filter inti struts2
Ini didefinisikan sebagai mencegat semua
<!-- Configure core filter --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
2) Mengkonfigurasi pendengar musim semi
Saat layanan dimulai, file konfigurasi pegas akan dimuat terlebih dahulu
<!-Mengkonfigurasi pendengar untuk Spring Framework mengintegrasikan web-> <listener> <Distener-Class> org.springframework.web.context.contextLoaderListener </listener-class> </listener>
3) Konfigurasikan jalur pemuatan default
<!-Pendengar memuat file Web-INF secara default. Anda perlu mengkonfigurasi parameter untuk memuat file yang ditentukan-> <Context-param> <Param-name> ContextConfigLocation </param-name> <Param-Value> ClassPath: ApplicationContext.xml </param-value> </context-param>
Ringkasan: Semua kode untuk web.xml
<!-Mengkonfigurasi pendengar yang mengintegrasikan web dalam kerangka kerja spring-> <listener> <deacherer-class> org.springframework.web.context.contextLoaderererer </listener-class> </listener> <!-pendengar memuat file web-inf dengan default, dan memerlukan parameter konfigurasi untuk memuat The Specion <param-name> ContextConfigLocation </param-name> <param-value> classPath: ApplicationContext.xml </param-value> </context-param> <!-Mengkonfigurasi filter inti-> <TERFILTER> <TERFERTER-NAME> Struts2 </filter-name> <nilter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecuteFilter </filter-class> </tiler> <niler-Mapping> <nilter-name> struts2 </filter-name> <rerl-pattern>/*</riler-Pattern> </filter-mappaping>
2. Tulis file konfigurasi yang relevan di bawah SRC
1) Spring: ApplicationContext.xml
Impor kendala terkait
<? 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" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http:/schema/aop" xmlns: tx = "http:/schema.aop" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-leans.xsd http://www.springframework.orger.orga http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop:/www.spramework.org/schema/aop http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> </beans>
2) Hibernate: hibernate.cfg.xml
Impor kendala yang relevan dan konfigurasikan database
<? Xml Version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate-Configuration Public "-// Hibernate/Hibernate Configuration DTD 3.0 // en" "http://www.hibernate.org/dtd/hibernate-configuration-facory-.0.dronpony"> hibernate "> <donfiguration- configuration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration-.donfiguration- <!-Harus mengonfigurasi-> <nama properti = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <name properti = "hibernate.connection.url"> jdbc: mysql: //192.168.174.130: 3306/ssh: //192.168.174.130: 3306/ssh: //192.168.174.130: 3306/SSH:/SSH </192.168.174.130: 330: 3306/SSH:/SSH </192.168.174.174.130: 330: 3306/SSH:/SSH </192.168.174.174.174. name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Optional configuration--> <property name="hibernate.show_sql">true</property> <property name = "hibernate.format_sql"> true </property> <properti name = "hibernate.hbm2ddl.auto"> update </propert> <!-Konfigurasi kumpulan koneksi untuk c3p0-> <property name = "connection.provider_class"> org.hibernate.connection.c3p0conation -> <!-Pemetaan File Konfigurasi-> <pemetaan sumber daya = "com/clj/domain/customer.hbm.xml"/> </sesi-factory> </hibernate-configuration>
3) Mengkonfigurasi log4j.properties
### pesan log langsung ke stdout ### log4j.appender.stdout = org.apache.log4j.consoleAppenderLog4j.applender.stdout.target = System.errlog4j.applog.stdout.layout = org.apache.log4j.patternlayoutlog4j.appender.stdout %c {1}: %l - %m %n ### pesan langsung untuk mengajukan mylog.log ### log4j.appender.file = org.apache.log4j.fileAppenderlog4j.applent.file.file = c/: mylog.loglog4j.appender.file.layout = org.apache.log4j.patternlayoutlog4j.applay.file.file %c {1}: %l - %m %n ### Set Level Log - Untuk lebih banyak perubahan logging verbose 'info' menjadi 'debug' ### log4j.rootlogger = info, stdout4) Struts2: Struts.xml
Impor kendala terkait
<? Xml Version = "1.0" encoding = "UTF-8"?> <! Doctype Struts Public "-// Apache Software Foundation // DTD Struts Configuration 2.1 // en" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <//sdsd
Ringkasan: File konfigurasi yang diperlukan oleh SRC ditunjukkan pada gambar
3. Konfigurasikan lapisan DAO
Tentukan antarmuka dan kelas implementasinya
Antarmuka Publik Pelanggandao {public void save (Pelanggan Pelanggan);} Public Class CustomerdaoImpl mengimplementasikan customerdao {public void save (pelanggan pelanggan) {}}4. Tentukan Antarmuka Lapisan Bisnis dan Kelas Implementasi
Paket com.clj.service; import com.clj.domain.customer; antarmuka publik layanan pelanggan {public void save (pelanggan pelanggan);} Paket com.clj.service; impor org.springframework.transaction.annotation.transactional; impor com.clj.dao.customerdao; impor com.clj.domain.customer; pelanggan level {customer customer {pelanggan @Author customer {pelanggan @Author customer */customer customer customerservice {customer customer customer {customer customer {pelanggan @Author Administrator */customer customer customer customer publess {customer customer customer {customer customer {pelanggan @Author customer {customer customer {customer customer {pelanggan }}5. Tentukan kelas pojo
Hibernate mengoperasikan tabel basis data dengan mengoperasikan kelas POJO untuk mencapai pemetaan objek-relasional
paket com.clj.domain; pelanggan kelas publik {private long cust_id; Private String cust_name; private long cust_user_id; private long cust_create_id; Private String cust_source; Private String Cust_industry; Private String Cust_level; Private String Cust_linkman; Private String Cust_phone; Private String Cust_Mobile; publik long getCust_id () {return cust_id; } public void setCust_id (long cust_id) {this.cust_id = cust_id; } public String getCust_name () {return cust_name; } public void setCust_name (string cust_name) {this.cust_name = cust_name; } public long getCust_user_id () {return cust_user_id; } public void setCust_user_id (long cust_user_id) {this.cust_user_id = cust_user_id; } public long getCust_create_id () {return cust_create_id; } public void setCust_create_id (long cust_create_id) {this.cust_create_id = cust_create_id; } public string getCust_source () {return cust_source; } public void setCust_source (String cust_source) {this.cust_source = cust_source; } public string getCust_indUstry () {return cust_industry; } public void setCust_indUstry (string cust_industry) {this.cust_industry = cust_indUstry; } string publik getCust_level () {return cust_level; } public void setCust_level (String cust_level) {this.cust_level = cust_level; } string publik getCust_linkman () {return cust_linkman; } public void setCust_linkman (String cust_linkman) {this.cust_linkman = cust_linkman; } string publik getCust_phone () {return cust_phone; } public void setCust_phone (String cust_phone) {this.cust_phone = cust_phone; } public String getCust_Mobile () {return cust_mobile; } public void setCust_Mobile (string cust_mobile) {this.cust_mobile = cust_mobile; } @Override public String toString() { return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_user_id=" + cust_user_id + ", cust_create_id=" + cust_create_id + ", cust_source=" + cust_source + ", cust_industry=" + cust_industry + ", cust_level = " + cust_level +", cust_linkman = " + cust_linkman +", cust_phone = " + cust_phone +", cust_mobile = " + cust_mobile +"] "; }}6. Tentukan customer.hbm.xml
File konfigurasi ini terkait dengan kelas POJO pelanggan. File ini perlu ditempatkan di bawah paket yang sama dengan kelas Pojo pelanggan
<? XML Versi = "1.0" encoding = "utf-8"?> <! Doctype hibernate-mapping public "-// hibernate/hibernate pemetaan dtd 3.0 // en" "http://www.hibernate.org/dtd/hibernate-papping-3.0.dtd"> <hibernate.org/dtd name="com.clj.domain.Customer" table="cst_customer"> <id name="cust_id" column="cust_id"> <generator/> </id> <property name="cust_name" column="cust_name"/> <property name="cust_user_id" column="cust_user_id"/> <property name="cust_create_id" column="cust_create_id"/> <property name="cust_source" column="cust_source"/> <property name="cust_industry" column="cust_industry"/> <property name="cust_level" column="cust_level"/> <property name="cust_linkman" column="cust_linkman"/> <property name="cust_linkman"/> <property name = "cust_phone" kolom = "cust_phone"/> <name properti = "cust_mobile" kolom = "cust_mobile"/> </class> </hibernate-mapping>
Diagram Konstruksi Proyek
4. Demonstrasi awal demo untuk pelestarian pelanggan
Di sini kita pertama -tama mendefinisikan lapisan kegigihan untuk heibernate, lapisan bisnis ke struts2, dan contoh penciptaan untuk musim semi
1. Tentukan antarmuka untuk menghemat pelanggan dan menggunakan formulir formulir untuk mengirimkan data
Menurut nama domain, kita dapat melihat bahwa metode wildcard dari Struts2 digunakan untuk akses.
<Form id = Form1 name = form1 action = "$ {pageContext.Request.contextPath} /customer_add.action" Metode = post> <!-Tabel bagian dihilangkan-> </form>2. Konfigurasikan permintaan menerima di struts.xml, lompat ke tindakan yang ditentukan sesuai dengan nama dan metode tindakan, dan jalankan metode yang ditentukan
Spring Integrates Metode Struts2 Satu: Tindakan dikelola oleh Framework Struts2
* Karena paket struts2-spring-plugin-2.3.24.jar yang diimpor dilengkapi dengan file konfigurasi struts-plugin.xml, kode berikut termasuk dalam file konfigurasi
* <name konstan = "structs.objectfactory" value = "spring" /> nyalakan konstanta. Jika konstanta dihidupkan, konstanta berikut dapat digunakan
* struts.objectfactory.spring.autowire = nama, konstanta ini adalah kelas yang memungkinkan tindakan untuk secara otomatis merakit objek kacang!
<? Xml Version = "1.0" encoding = "UTF-8"?> <! Doctype Struts Public "-// Apache Software Foundation // DTD Struts Configuration 2.1 // en" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts.apache.org/dtds/CRUPRUCE-"Packer ="> <"cruts ="> <packs> <! extends = "struts-default" namespace = "/"> <!-Mengkonfigurasi tindakan pelanggan-> <!-Metode 1: Aciton dikelola oleh Struts2 Framework-> <action name = "customer_*" Method = "{1}"/> </packing> </struts>3. Konfigurasikan kacang dan transaksi yang sesuai di Spring ApplicationContext.xml
Di sini, menggunakan fitur IOC (Control Inversion) di Spring, tugas membuat instance diserahkan ke Manajemen Kerangka Kerja Spring
<bean id = "customerservice"> <name properti = "customerdao" ref = "customerdao"> </property> </ bean> <bean id = "customerdao"> <name properti = "hibernateTemplate" ref = "hibernateTemplate"/</bean> <bean id = "hibernatePlate"/</bean> <bean id = "hibernatory" hibernatePlate "/</bean> <bean> <bean id =" hibernatory "HibernateTemplate"/</bean> </bean <bean id = "hibernatorePPLATE"> </bean> <bean id = "HIBERATPLATE" HIBERATORY "/</bean> name = "sessionFactory"/> </t bean> </tagel>
4. Tulis Kode Terkait Kelas Implementasi Lapisan Persistensi
Di sini, kelas templat yang disediakan oleh Hibernate digunakan untuk melampirkan sesi secara internal, sehingga metode dalam sesi dapat dipanggil.
/** * Lapisan Persistence * * @Author Administrator * */Kelas Publik PelanggandaoImpl mengimplementasikan customerdao {// Simpan data ke database (kelas templat panggilan (disediakan oleh hibernate, sesi yang dienkapsulasi secara internal)) private hibernateTemplate hibernateTemplate; public void setHibernateTemplate (hibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate; } / *** Simpan pelanggan* / public void save (pelanggan pelanggan) {System.out.println ("Lapisan Permanen: Simpan Pelanggan"); hibernateTemplate (). Simpan (pelanggan); }}5. Tulis kode terkait kelas implementasi bisnis
package com.clj.service;import org.springframework.transaction.annotation.Transactional;import com.clj.dao.CustomerDao;import com.clj.domain.Customer;/** * Customer's business layer* @author Administrator * */@Transactionalpublic class CustomerServiceImpl implements CustomerService{ private CustomerDao customerDao; public void setCustomerdao (customerdao customerdao) {this.customerdao = customerdao; } // Digunakan untuk menyimpan public void pelanggan Simpan (Pelanggan Pelanggan) {System.out.println ("Lapisan Bisnis, Simpan Pelanggan"); customerdao.save (pelanggan); }}6. Tulis kode yang berhubungan dengan tindakan
Inilah kelas template struts2
Paket com.clj.web.action; impor org.apache.struts2.servletactionContext; impor org.springframework.web.context.webApplicationContext; impor org.springframework.web.context.support.webApplicationContextUtils; com.clom.cupport.webApplicationContextUtils; com.clom.cuplomer.webApplicationContextUtils; com.clom.cuplomer.webApplicationContextUtils; com.clom.cuplomer com.clj.service.customerservice; impor com.opensymphony.xwork2.actionsupport; import com.opensymphony.xwork2.modeldriven;/** * Pelanggan pelanggan * Pelanggan baru (Pelanggan New) NEW CUSTRAINGN (Pelanggan New) Pelanggan publik getModel () {pelanggan kembali; } // Berikan atribut anggota layanan dan berikan metode yang ditetapkan Metode Pelanggan Pelanggan Privat Layanan Pelanggan; public void setCustomerService (Pelanggan CustomerService) {this.customerservice = customerservice; } / *** Simpan pelanggan* @return* / public string add () {System.out.println ("Lapisan Web, Simpan Pelanggan"); // Metode 1: Buat Web Factory (Action dibuat oleh Struts2) WebApplicationContext Context = WebApplicationContextUtils.getWebApplicationContext (ServletActionContext.GetSerVletContext ()); Customerservice cs = (customerservice) context.getBean ("customerservice"); // metode panggilan cs.save (pelanggan); tidak ada yang kembali; }}5. Integrasi Optimalisasi Proyek
1. Metode Struts2 Integrasi Musim Semi 2: Tindakan dikelola oleh Spring Framework
Letakkan file Konfigurasi Kelas Tindakan Spesifik Applicatoncontext.xml di file konfigurasi, tetapi Catatan: Struts.xml perlu dimodifikasi
<struts> <!-- Configure package structure--> <package name="crm" extends="struts-default" namespace="/"> <!-- Configure customer's Action --> <!-- Method 1: Aciton is managed by struts2 framework<action name="customer_*" method="{1}"/>---> <!-- Method 2: Action is managed by spring, and only the ID value of the srping Konfigurasi Bean Diperlukan pada tag kelas-> <action name = "customer_*" Method = "{1}"> </action> </packing> </struts>2. Konfigurasikan kelas Tindakan di ApplicationContext.xml
Catatan: 1) Kerangka kerja Spring menghasilkan customeraction secara default, sedangkan kerangka kerja Struts2 adalah banyak. Jadi Anda perlu mengkonfigurasi ruang lingkup = "prototipe"
2) Tidak ada perakitan otomatis Struts2 saat ini. Dalam tindakan, Anda perlu mengonfigurasi properti layanan pelanggan secara manual dan menghasilkan metode yang ditetapkan di kelas tindakan.
<!-Mengkonfigurasi Modul Pelanggan-> <!-Tekankan: Aciton yang dikonfigurasi harus multi-kolom-> <bean id = "customeraction" scope = "prototipe"> <!-Catatan: Ketika struts mengelola tindakan, berdasarkan pada paket-paket can dan can name dan name- name dan name-name-nya. Anda hanya perlu memberikan metode yang ditetapkan. Namun, tindakan ini dikelola oleh Spring, dan perakitan otomatis tidak valid, jadi Anda perlu melakukan injeksi konfigurasi secara manual-> <properti nama = "customerservice" ref = "customerservice"> </prop Property> </bean>
3. Konfigurasikan transaksi
Spring mengintegrasikan metode hibernate satu: (file konfigurasi dengan hibernate.cfg.xml. Tekankan: Konfigurasi yang mengikat utas saat ini tidak dapat ditambahkan)
Di masa lalu, saat bermain hibernate, hibernate.cfg.xml dikelola oleh kerangka hibernate. File konfigurasinya dapat menghasilkan sessionFactory. Lapisan Persistence memuat file konfigurasi ini untuk mendapatkan sessionFactory, sehingga membuat sesi yang dihasilkan pabrik, menambahkan, menghapus dan mengubah data menjadi. Pada saat ini, file konfigurasinya harus diserahkan kepada manajemen musim semi, memanfaatkan sepenuhnya karakteristik IOC Spring.
Kerangka kerja Spring menyediakan kelas alat HibernedAoSupport, yang dapat diwarisi di masa depan oleh DAO! Lai Sebelum memperkenalkan file konfigurasi inti hibernate, lapisan DAO harus mewarisi kelas induk HibernedAoSupport, yang merangkum template transaksi secara internal.
Lihat kode sumbernya:
1) Ubah kelas implementasi lapisan persistensi yang sesuai dan biarkan mewarisi HibernedAosupport
Paket com.clj.dao; impor org.springframework.orm.hibernate5.hibernateTemplate; impor org.springframework.orm.hibernate5.support.hibernedAosupport; impor com.clj.domain.customer;/** ** ** ** lapisan KEPERINGATAN* win -inciNATECPORT @Domain. Administrator * * /kelas publik CustomerdaoImpl memperluas HibernedAoSupport mengimplementasikan customerdao {// simpan data ke database (hubungi kelas template (disediakan oleh hibernate, sesi yang dienkapsulasi)) / *hibernateTemplate private hibernateTemplate; public void setHibernateTemplate (hibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate; }*// ***Simpan pelanggan*/ public void save (Pelanggan pelanggan) {System.out.println ("Lapisan Permanen: Simpan Pelanggan"); this.getHibNeTeMemplate (). Simpan (Pelanggan); }}2) Ubah lapisan bisnis dan aktifkan anotasi transaksi
package com.clj.service;import org.springframework.transaction.annotation.Transactional;import com.clj.dao.CustomerDao;import com.clj.domain.Customer;/** * Customer's business layer* @author Administrator * */@Transactionalpublic class CustomerServiceImpl implements CustomerService{ private CustomerDao customerDao; public void setCustomerdao (customerdao customerdao) {this.customerdao = customerdao; } // Digunakan untuk menyimpan public void pelanggan Simpan (Pelanggan Pelanggan) {System.out.println ("Lapisan Bisnis, Simpan Pelanggan"); customerdao.save (pelanggan); }}3) Ubah file ApplicationContext.xml
Memperkenalkan file konfigurasi hibernate terlebih dahulu
<!-Menulis kacang, nama-nama itu diperbaiki, disediakan oleh Spring, digunakan untuk memuat file konfigurasi hibernate.cfg.xml-> <bean id = "sessionfactory"> <!-jalur konfigurasi: ketika server dimulai, dengan demikian objek akan dibuat, dengan demikian memuat hibernate.cfg.xml file, yang membuat Sesionfacpory-"Objection-" Obyeke name = "" value = "classpath: hibernate.cfg.xml"/> </tac>
Konfigurasikan Manajemen Transaksi Platform: Digunakan untuk mengelola transaksi. Perhatikan bahwa kerangka kerja hibernasi sekarang digunakan, sehingga manajer transaksi kerangka hibernasi diperlukan.
<!-Mengkonfigurasi Platform Transaction Manager terlebih dahulu-> <bean id = "transactionManager"> <!-menyuntikkan transaksi, sesi dapat mengelola transaksi, dan pabrik dapat membuat sesi-> <name properti = "sessionfactory" ref = "sessionfactory"/> </bean>
Buka Anotasi Transaksi
<!-Anotasi untuk mengaktifkan transaksi-> <tx: anotasi transaksi-manager = "transactionManager"/>
Hapus Konfigurasi Kelas Template dan Konfigurasikan SessionFactory untuk Lapisan Persistence
<!-Di masa depan, DAO perlu mewarisi HibernedAoSupport dan menyuntikkan SesionFactory-> <bean id = "customerdao"> <!-<properti nama = "hibernateTemplate" ref = "hibernatemplate"/<! name = "sessionFactory" ref = "sessionFactory"/> </t bean>
Semua kode 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" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http:/schema/aop" xmlns: tx = "http:/schema.aop" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-leans.xsd http://www.springframework.orger.orga http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop:/www.spramework.org/schema/aop http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> <!-menulis kacang, nama-nama itu diperbaiki, dan disediakan oleh Spring untuk memuat file konfigurasi. <!-Jalur Konfigurasi: Ketika server dimulai, objek akan dibuat, sehingga memuat file hibernate.cfg.xml, dengan demikian menghasilkan objek sessionFactory-> <name properti = "configLocation" value = "classpath: hibernate.cfg.xml"/</bean> <!-classpath: hibernate.cfg.xml "/</bean> <!-classpath: hibernate.cfg.xml"/</bean> <!-classpath: hibernate.cfg.xml "/</bean> <!-classpath: hibernate.cfg.xml"/</bean> <!-configure <nibernate.cfg.xml "/</bean> <!-configure <nibernate.cfg.xml"/</bean> <!-configure firstLET/ID FirstLECE- " transactions, the session can manage transactions, and the factory can create session --> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- Annotation to enable transactions --> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- Configure customer modules --> <!-- Emphasize: The configured Aciton must be multi-column --> <bean id = "customeraction" scope = "prototipe"> <!-note: Ketika struts mengelola tindakan, berdasarkan paket jar dengan struts-plugin, struts konstan.objectfactory.spring.Autowire = nama diubah untuk menyalakannya, dan dapat dirakit secara otomatis. Anda hanya perlu memberikan metode yang ditetapkan. However, the action is managed by spring, and the automatic assembly is invalid, so you need to manually perform configuration injection--> <property name="customerService" ref="customerService"></property> </bean> <bean id="customerService"> <property name="customerDao" ref="customerDao"></property> </bean> <bean id="customerDao"> <!--<property Name = "HibernateTemplate" ref = "hibernatetemplate"/>-> <!-Kelas template tidak disuntikkan di sini, tetapi sessionfactory, karena templat membutuhkan sesi (sesi yang dienkapsulasi)-> <name properti = "Sesionfactory" Sesi "Sesi" Sesi "/Kelas Sesi =" Sesi "Sesi"/</bean> </bean> <the the the the the the the the the piala. Jika lapisan kegigihan mewarisi HibernedAoSupport, tidak perlu mengonfigurasi-> <!-<bean id = "hibernateTemplate"> menyuntikkan sessionfactory <name properti = "sessionfactory"/> </t bean>-> </tean>
4) Ubah kelas tindakan
Karena kelas implementasi lapisan bisnis disuntikkan, metode lapisan bisnis dapat dipanggil langsung saat ini tanpa memuat kacang
Paket com.clj.web.action; impor org.apache.struts2.servletactionContext; impor org.springframework.web.context.webApplicationContext; impor org.springframework.web.context.support.webApplicationContextUtils; com.clom.cupport.webApplicationContextUtils; com.clom.cuplomer.webApplicationContextUtils; com.clom.cuplomer.webApplicationContextUtils; com.clom.cuplomer com.clj.service.customerservice; impor com.opensymphony.xwork2.actionsupport; import com.opensymphony.xwork2.modeldriven;/** * Pelanggan pelanggan * Pelanggan baru (Pelanggan New) NEW CUSTRAINGN (Pelanggan New) Pelanggan publik getModel () {pelanggan kembali; } // Berikan atribut anggota layanan dan berikan metode yang ditetapkan Metode Pelanggan Pelanggan Privat Layanan Pelanggan; public void setCustomerService (Pelanggan CustomerService) {this.customerservice = customerservice; } / *** Simpan pelanggan* @return* / public string add () {System.out.println ("Lapisan Web, Simpan Pelanggan"); // Metode 1: Buat pabrik web (tindakan dibuat oleh struts2) /*WebApplicationContext Context = WebApplicationContextUtils.getWebApplicationContext (servletActionContext.getSerVletContext ()); Customerservice cs = (customerservice) context.getBean ("customerservice"); // metode panggilan cs.save (pelanggan); */ customerservice.save (pelanggan); tidak ada yang kembali; }}Metode Hibernate Integrasi Musim Semi Dua: (File Konfigurasi Tanpa Hibernate.cfg.xml)
Di sini kita akan menghapus file konfigurasi inti Hibernate. Sebelum menghapus, Anda perlu mengonfigurasi konten yang relevan dalam file konfigurasinya ke file spring's applicationIncontext.xml untuk mendapatkannya.
1. Periksa konten yang relevan di file hibernate.cfg.xml
* Parameter dasar koneksi database (4 parameter utama)
* Properti terkait hibernat
* Pool koneksi
* Peta file
2. Perkenalkan konfigurasi
Memperkenalkan kumpulan koneksi
<!-Mengkonfigurasi kumpulan koneksi untuk c3p0 pertama-> <bean id = "DataSource"> <name properti = "driverclass" value = "com.mysql.jdbc.driver"/> <name properti = "jdbcurl" value = "jdbc: mysql: //192.168.174." "ssh/ssh/ssh: //192.168.174. value = "root"/> <properti name = "password" value = "root"/> </bean>
Ubah sesi yang sesuai: karena tidak ada file konfigurasi untuk hibernate.cfg.xml, Anda perlu memodifikasi konfigurasi dan menyuntikkan kumpulan koneksi.
Memperkenalkan file pemetaan objek: Karena file konfigurasi hibernate.cfg.xml tidak lagi dipindai, dan file konfigurasi perlu disuntikkan.
<!-Tulis kacang, nama-nama sudah diperbaiki, dan disediakan oleh Spring untuk memuat file konfigurasi hibernate.cfg.xml-> <bean id = "sessionFactory"> <!-Muat kumpulan koneksi pertama-> <nama properti = "DataSource" Ref = "DataSource"/> <!-dialek beban, load name,> <DataSource "Ref =" DataSource "/<! key = "hibernate.dialect"> org.hibernate.dialect.mysqldialect </prop> <prop key = "hibernate.show_sql"> true </prop> <prop key = "hibernate.Format_sql"> true </prop> <prop Key = "hibernate.hbm2d. <!-Memperkenalkan file konfigurasi pemetaan-> <name properti = "MappingResources"> <cist> <value> com/clj/domain/customer.hbm.xml </ value> </list> </property> </tean>
Sekarang: Kode ApplicationContext.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" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http:/schema/aop" xmlns: tx = "http:/schema.aop" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-leans.xsd http://www.springframework.orger.orga http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop:/www.spramework.org/schema/aop http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> <!-Konfigurasikan kumpulan koneksi =" Bean ID = "DataSource"> <pase "> <" Properten "> <" Properti C3P0 <"DataSource"> <"> <" Properti "> <" DataSource "> <" value = "com.mysql.jdbc.driver"/> <name properti = "jdbcurl" value = "jdbc: mysql: //192.168.174.130: 3306/ssh" ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALAH, ADALI, ADALAH, ADALAH, NAME/BEAN/BEAN/</BEAN/</a root/a. spring to load the configuration file of hibernate.cfg.xml--> <bean id="sessionFactory"> <!-- Load the connection pool first-> <property name="dataSource" ref="dataSource"/> <!-- Load dialect, load options--> <property name="hibernateProperties"> <props> <prop key = "hibernate.dialect"> org.hibernate.dialect.mysqldialect </prop> <prop key = "hibernate.show_sql"> true </prop> <prop key = "hibernate.Format_sql"> true </prop> <prop Key = "hibernate.hbm2d. <!-Suntikkan file konfigurasi pemetaan-> <name properti = "MappingResources"> <cist> <value> com/clj/domain/customer.hbm.xml </ value> </list> </property> </tan-!-configure Sesion Transaction FRISTIONS-> <bean id = "transactionagager"> <!-suntikan Transaksi, Transactions-> <bean id = "transactionManager"> <! <nama properti = "sessionfactory" ref = "sessionfactory"/> </ bean> <!-anotasi untuk membuka transaksi-manager = "transactionManager"/> <!-Mengkonfigurasi modul pelanggan-> <!-tekankan: Aciton yang dikonfigurasi dengan ACITON>-BEGITU-STRUT-BEAN BEAN ID = "Customer" SCOPE = "ProtoType Aciton>-BEGING STOMERS:> <bean id =" Customer "scope =" ProtoType Aciton> <! struts-plugin, struts.ObjectFactory.spring.Autowire yang konstan = nama telah menyalakannya dan dapat secara otomatis dirakit. Anda hanya perlu memberikan metode yang ditetapkan. Namun, tindakan ini dikelola oleh Spring dan perakitan otomatis tidak valid, jadi Anda perlu melakukan injeksi konfigurasi secara manual-> <name properti = "customerservice" ref = "customerservice"> </preate> </ bean> <bean id = "customerservice"> <properti name = "customerdao" ref = "customerdao"> </customerservice </name property = "customerdao" ref = "customerdao"> </customerservice </name propert HibernateDaoSupport and inject sessionFactory --> <bean id="customerDao"> <!--<property name="hibernateTemplate" ref="hibernateTemplate"/> -> <!-- The template class is not injected here, but sessionFactory, because the template needs session (encapsulated session)--> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- Configure the template class (provided by the hibernate framework, encapsulated session) and is handed over to spring management at this time. If the persistence layer inherits HibernateDaoSupport, there is no need to configure --> <!-- <bean id="hibernateTemplate"> Inject sessionFactory <property name="sessionFactory"/> </bean>--></beans>
此时可以安心的删除hibernate.cfg.xml文件了
这样SSH整合完毕
六、Hibernate模板常用方法
注意:以下代码省略了接口中的演示(偷了个懒,相信初学者不会看不懂)
1)插入:
Lapisan persisten
package com.clj.dao;import java.util.List;import org.hibernate.criterion.DetachedCriteria;import org.springframework.orm.hibernate5.HibernateTemplate;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;import com.clj.domain.Customer;/** * Persistence layer* Inherits HibernateDaoSupport and encapsulates HibernateTemplate internally * @author Administrator * */public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao { @Override public void update(Customer customer) { // TODO Auto-generated method stub this.getHibernateTemplate().update(customer); }}业务层
package com.clj.service;import java.util.List;import org.springframework.transaction.annotation.Transactional;import com.clj.dao.CustomerDao;import com.clj.domain.Customer;/** * Customer's business layer* @author Administrator * */@Transactionalpublic class CustomerServiceImpl implements CustomerService{ private CustomerDao customerDao; public void setCustomerDao(CustomerDao customerDao) { this.customerDao = customerDao; } @Override public void update(Customer customer) { // TODO Auto-generated method stub customerDao.update(customer); }}Kelas tes
package com.clj.test;import java.util.List;import javax.annotation.Resource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.clj.domain.Customer;import com.clj.service.CustomerService;/** * Simple way to test Hiberante template class* @author Administrator * */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class Demo1 { @Resource(name="customerService") private CustomerService customerService; /** * Test insert*/ @Test public void run1(){ Customer customer=new Customer(); customer.setCust_id(1L); customer.setCust_name("test"); customerService.update(customer); }}2)以下为指定查询、查询所有、离线查询代码
Lapisan persisten
package com.clj.dao;import java.util.List;import org.hibernate.criterion.DetachedCriteria;import org.springframework.orm.hibernate5.HibernateTemplate;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;import com.clj.domain.Customer;/** * Persistence layer* Inherits HibernateDaoSupport and encapsulates HibernateTemplate internally * @author Administrator * */public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao { //Save data to the database (call template class (provided by hibernate, encapsulated session)) /*private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; }*/ /** * Save customer*/ public void save(Customer customer) { System.out.println("Permanent layer: save customer"); this.getHibernateTemplate().save(customer); } @Override public void update(Customer customer) { // TODO Auto-generated method stub this.getHibernateTemplate().update(customer); } /** * Query by primary key*/ public Customer getById(Long id) { return this.getHibernateTemplate().get(Customer.class, id); } /** * Query all*/ @Override public List<Customer> findAll() { String sql="from Customer"; List<Customer> list=(List<Customer>) this.getHibernateTemplate().find(sql); return list; } /** * QBC offline query*/ @Override public List<Customer> findAllByQBC() { DetachedCriteria criteria=DetachedCriteria.forClass(Customer.class); List<Customer> list=(List<Customer>) this.getHibernateTemplate().findByCriteria(criteria); return list; }}业务层
package com.clj.service;import java.util.List;import org.springframework.transaction.annotation.Transactional;import com.clj.dao.CustomerDao;import com.clj.domain.Customer;/** * Customer's business layer* @author Administrator * */@Transactionalpublic class CustomerServiceImpl implements CustomerService{ private CustomerDao customerDao; public void setCustomerDao(CustomerDao customerDao) { this.customerDao = customerDao; } // Used to save customers public void save(Customer customer) { System.out.println("Business layer, save customer"); customerDao.save(customer); } @Override public void update(Customer customer) { // TODO Auto-generated method stub customerDao.update(customer); } @Override public Customer getById(Long id) { // TODO Auto-generated method stub return customerDao.getById(id); } @Override public List<Customer> findAll() { return customerDao.findAll(); } @Override public List<Customer> findAllByQBC() { // TODO Auto-generated method stub return customerDao.findAllByQBC(); }}Kelas tes
package com.clj.test;import java.util.List;import javax.annotation.Resource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.clj.domain.Customer;import com.clj.service.CustomerService;/** * Simple way to test Hiberante template class* @author Administrator * */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class Demo1 { @Resource(name="customerService") private CustomerService customerService; /** * Test insert*/ @Test public void run1(){ Customer customer=new Customer(); customer.setCust_id(1L); customer.setCust_name("test"); customerService.update(customer); } /** * Test query the specified customer*/ @Test public void run2(){ Customer customer=customerService.getById(2L); System.out.println(customer); } /** * Query all customers*/ @Test public void run3(){ List<Customer> list=customerService.findAll(); System.out.println(list); } /** * QBC(offline query) */ @Test public void run4(){ List<Customer> list=customerService.findAllByQBC(); System.out.println(list); }}七、关于SSH延迟加载问题
1. 使用延迟加载的时候,再WEB层查询对象的时候程序会抛出异常!
* 原因是延迟加载还没有发生SQL语句,在业务层session对象就已经销毁了,所以查询到的JavaBean对象已经变成了托管态对象!
* 注意:一定要先删除javassist-3.11.0.GA.jar包(jar包冲突了)
2. Solusi
Spring框架提供了一个过滤器,让session对象在WEB层就创建,在WEB层销毁。只需要配置该过滤器即可
* 但是:要注意需要在struts2的核心过滤器之前进行,spring监听器之后配置
<!-- 解决延迟加载的问题--> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3、演示延迟加载
持久层:调用load方法,此方法时延迟加载的
/** * Lazy load*/ @Override public Customer loadById(long id) { // TODO Auto-generated method stub return this.getHibernateTemplate().load(Customer.class, id); }业务层
@Override public Customer loadById(long id) { // TODO Auto-generated method stub return customerDao.loadById(id); }Kelas tes
@Test public void run5(){ Customer customer=customerService.loadById(2L); System.out.println(customer); }Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.