Struts2.3.24 + spring4.1.6 + hibernate4.3.11 + mysql5.5.25 Konstruksi lingkungan pengembangan dan instruksi terkait.
1. Sasaran
1. Bangun lingkungan pengembangan SSH tradisional dan jalankan dengan sukses (masukkan, kueri)
2. Memahami konfigurasi kumpulan koneksi C3P0
3. Memahami cache sekunder hibernate dan verifikasi
4. Memahami konfigurasi hal -hal musim semi dan verifikasi
5. Memahami IOC musim semi (injeksi ketergantungan), menyerahkan objek tindakan (kacang) dari struts2 ke manajemen musim semi, kacang khusus, dll., Dan verifikasi
6. Memahami pegas AOP (pemrograman berorientasi bagian), dan menulis fungsi bagian khusus untuk memverifikasi hasilnya
2. Persiapan
Lingkungan Pengembangan: Eclipse untuk Java EE; mysql5.5.25; jdk1.7.0_79; navicat10.1.7 (opsional);
Buat demo basis data:
/*Navicat MySQL Data TransferSource Server: LocalHost_3306Source Server Versi: 50519Source Host: LocalHost: 3306Source Database: DemoTarget Server Jenis: MySQLTarget Server Versi: 50519File encoding: 65001date: 2016-01-03-50519File encoding: 65001date: 2016-01-02 23: 02: 65001DATE: 2016-01-09 23: 02: 65001DATE: 2016-01-09 23: 02: 65001DATE: 2016-01-09 23: 02: 02: 65001DATE: 2016-01-09 23: 02: 65001 ------------------------------ Table structure for `user`-- --------------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `account` varchar(200) NOT NULL, `name` varchar(200) NOT NULL, `address` varchar(1000) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB Charset default = utf8;
Buat proyek web baru, struktur direktori adalah sebagai berikut:
Siapkan Paket JAR dan masukkan ke dalam direktori Lib-Inf-Inf (jika Anda tertarik, Anda dapat menggunakan Maven untuk mengelola prosesnya, tetapi kadang-kadang sangat lambat untuk mengunduh paket JAR ...)
Paket toples terkait dapat ditemukan di struts yang diunduh, musim semi, dan hibernate. Ini referensi. Beberapa dari mereka dapat dihapus, seperti paket toples di bagian MVC musim semi:
3. Konfigurasikan web.xml
Konfigurasikan filter Struts2 untuk memetakan semua *. Aksi permintaan, dan ditangani oleh objek Strutsprepareand ExecutEfilter;
Konfigurasikan parameter konteks-param dan tentukan jalur file konfigurasi pegas. Parameter dalam <context-param> dapat diperoleh dengan menggunakan servletcontext.getInitparameter ("param-name");
Mengkonfigurasi Pendengar Terutama untuk membaca ApplicationContext.xml Informasi File Konfigurasi, Buat Kacang dan Pekerjaan Inisialisasi Lainnya;
<? 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 = XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/we-pappe." "" "" "" "" "" "" "" "" "" <play-name> ssh </play-name> <nilter> <nilter-name> struts2 </tilter-name> <nyter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareand-name </filter-class> </filter> <filter-petak> <filtername> </filter-n-n-n-name </filter> <terfilter-papping> <tilter-name> </filter-n-n-n-name </filter> <filter-petpaping> <tiltername> </filter-n-n-noLA </filter> <nilter-papping> <niltername> </filter/name </filter--name> </tiler-Mapping> <Context-param> <param-name> ContextConfigLocation </param-name> <param-value> classPath: ApplicationContext.xml </param-value> </context-param> <Distener> <Distener-Class> org.springframework.web.context.context <creendaking-file> index.jsp </welcome-file> </celcome-filt-file> </seb-app>
4. Konfigurasikan ApplicationContext.xml
Mengkonfigurasi pemindaian otomatis @Repostory, @Service dan anotasi lainnya di bawah paket SSH dan menghasilkan kacang yang sesuai;
Konfigurasikan sumber data (kumpulan koneksi JDBC adalah C3P0, Anda dapat merujuk pada konfigurasi terperinci C3P0). Fungsi utama dari kumpulan koneksi adalah untuk dengan cepat menyediakan koneksi dan menggunakannya kembali. Itu tidak memerlukan setiap kehancuran dan penciptaan. Ini memerlukan konfigurasi nama pengguna, kata sandi, jumlah koneksi maksimum, jumlah minimum koneksi, jumlah awal koneksi dan parameter terkait lainnya;
Konfigurasi sessionFactory (Anda dapat merujuk ke konfigurasi terperinci Hibernate, di mana Anda mengonfigurasi untuk mengaktifkan cache Level 2), fungsi utamanya adalah untuk menyediakan sesi dan menjalankan pernyataan SQL; Di sini kita akan menggunakan HibernateTemplate untuk mengoperasikan database untuk memfasilitasi kontrol fisik pegas; PS, pemetaan antara kelas dan tabel basis data juga harus dikonfigurasi dalam konfigurasi hibernate;
Mengkonfigurasi Bean Manajer Transaksi sebagai HibernatetransActionManager, dan menginisialisasi atribut anggota sessionFactory ke sessionFactory bean yang dikonfigurasi sebelumnya;
Konfigurasikan karakteristik propagasi transaksi, dan konfigurasikan bagian untuk merujuknya, dan melakukan kontrol transaksi semua Tambah, Hapus, Perbarui, dan Simpan metode di bawah semua paket dan Sub -paket SSH. Anda juga dapat mengonfigurasi perilaku propagasi transaksi dan parameter lainnya;
Akhirnya, ada konfigurasi terkait AOP khusus, yang berlaku bagian khusus 'myaop' untuk mengontrol semua metode yang dimulai dengan tes di bawah ssh.aop.aoptest, dan hasilnya akan diverifikasi nanti;
<? Xml Version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: p = "http://www.spramework.org/schema/spema/spema" xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: xsi = "http:--plns.plns. xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: jdbc = "http://www.springframework.org/schema/jdbc" xsi: schemalocation = "http:schema/jdbc" xsi: schemalocation = "http:schaMaMaMaMaMer http://www.springframework.org/schema/beans http://www.springframework.org/schema/aop http://www.spramework.org/schema/aop http://www.spramework.org.orgaMema.aop http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/jdb http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/springfringframework.org.14.xsd http://wwww.springframework.org.orger <!-Memindai ClassPath untuk komponen beranotasi (termasuk @Repostory dan @Service yang akan terdaftar secara otomatis sebagai kacang musim semi-> <konteks: komponen-pemindaian paket = "ssh" /> <!-mendukung sumber data-> <bean name = "dataSource" durwast-method = "tutup"> <nama properti = "COMRIVER" COMASIVES "COMASIVE" METHOD = "TETRE"> <tutup " <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo" /> <property name="user" value="root" /> <property name="password" value="root" /> <property name="acquireIncrement" value="1"></property> <property name="initialPoolSize" value="80"></property> <property name = "maxIdletime" value = "60"> </property> <properti name = "maxpoolSize" value = "80"> </property> <properti name = "minpoolSize" value = "30"> </property> <properti name = "AcquireretryDelay" value = "1000"> </properti </Properti <Properti> <Property name = "AcquireretryDelay" Value = "1000"> </properti </Properti </Properti </Properti </Properti </Properti </Properti </Properti </Properti </Property- Properti = "PropertyTretryretseTPLay =" 1000 "> </properti </Properties </Properti </Property- Properti =" PropertyTretryTeTTS "value" 60 " name="breakAfterAcquireFailure" value="false"></property> <!-- If Too many connections appear, please note that if you modify the configuration file my.ini of mysql to increase the maximum number of connections (see the current connection command: show processlist) --> </bean> <bean id="sessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key = "current_session_context_class"> thread </prop> <prop key = "hibernate.cache.use_second_level_cache"> true </por> <prop key = "hibernate.cache.use_second_level_cache"> true </prop> <prop> <prop> key = "hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.ehcacheregionfactory </por> <prop key = "hibernate.cache.use_query_cache"> true </prop> <prop> key="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</prop> </prop> </props> </property> <property name="mappingLocations"> <list> <value>classpath:ssh/model/User.hbm.xml</value> </list> </property> <!-- <property name = "AnnotatedClasses"> <list> <value> ssh.model.user </ value> </cist> </prupter>-> </ bean> <!-Mengkonfigurasi Transaction Manager-> <bean id = "transactionManager"> <properti name = "sesionfactory" ref = "sessionfactory"/</bean> <! <TX: Atribut> <tx: Metode name = "add*" propagation = "wajib" hanya-read-only = "false" rollback-for = "java.lang.exception"/> <tx: nama metode = "delete*" propagation = "wajib" hanya read-only = "false" rollback-for = "java.Lang.exception" wajib "hanya" rollback-for = "java.lang.exception" read-only="false" rollback-for="java.lang.Exception"/> <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="pcMethod" expression="execution(* ssh.service..*.*(..))" /> <aop:advisor pointcut-ref="pcMethod" advice-ref="txadvice" /> </aop:config> <!-- Custom aop processing test--> <bean id="aopTest"></bean> <bean id="myAop"></bean> <aop:config proxy-target-class="true"> <aop:aspect ref="myAop"> <aop:pointcut id="pcMethodTest" expression="execution(* ssh.aop.AopTest.test*(..))"/> <aop:before pointcut-ref="pcMethodTest" method="before"/> <aop:after pointcut-ref="pcMethodTest" method="after"/> </aop:aspect> </aop: config> </boy>
5. Konfigurasikan struts.xml
Mengkonfigurasi struktur. Konstanta Factory untuk pegas, menunjukkan bahwa tindakan diperoleh oleh kacang melalui pegas;
Konfigurasikan jenis hasil ke "JSON", dan Anda juga dapat mengkonfigurasi hal -hal lain. Di sini, untuk kenyamanan interaksi data front-end dan back-end, dikonfigurasi dalam format JSON;
Konfigurasikan dua tindakan, adduser dan queryalluser;
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"><struts> <constant name="struts.objectFactory" value="spring"/> <constant name = "struts.enable.dynamicmethodinVocation" value = "false" /> <constant name = "struts.devmode" value = "false" /> <package name = "default" extends = "struts-default, json-default"> <leval--pesults> <result type = "json" <"root =" root = "root =" param "> < /paron < /paron < /paron < /paron lypar =" json "<" root = "root =" root " name="contentType">text/html</param> </result> </global-results> <action name="addUser" method="addUser"> <result>.</result> </action> <action name="queryAllUser" method="queryAllUser"> <result>.</result> </action> </package> <!-- Add packages here --></struts>
6. Tulis kode yang relevan
Catatan:
DAO mewarisi kelas HibernedAoSupport, dan semua operasi terkait database dioperasikan oleh HibernateTemplate;
Tambahkan anotasi yang sesuai ke lapisan DAO, lapisan layanan, dan tindakan, dan mendaftar sebagai biji pegas;
Kode terlampir adalah sebagai berikut:
Useraction.java
Paket ssh.action; impor java.io.printwriter; impor java.util.list; import javax.annotation.resource; impor javax.servlet.http.httpservletrequest; impor javax.servlet.http.httpservetresservetResponse; impor org. org.apache.struts2.servletactionContext; impor org.springframework.stereotype.controller; import ssh.aop.aoptest; import ssh.model.user; import ssh.service.userservice; import com.google.gson.gson; @controllerpublerpublerpublic; Logger.getLogger (useraction.class); @Resource Private UserServerService UserService; @Resource private aoptest aoptest; public void addUser () {printwriter out = null; coba {httpservletRequest request = servletActionContext.getRequest (); HttpservletResponse response = servletActionContext.getResponse (); response.setContentType ("Teks/html; charset = utf-8"); String Account = request.getParameter ("akun"); Name string = request.getParameter ("name"); Alamat String = request.getParameter ("Alamat"); Pengguna pengguna = pengguna baru (); user.setAccount (akun); user.setAddress (alamat); user.setname (name); Userservice.add (pengguna); out = response.getWriter (); out.write (GSON baru (). TOJSON ("Success")); } catch (Exception e) {E.PrintStackTrace (); logger.error (e.getMessage ()); if (out! = null) out.write (GSON baru (). TOJSON ("FAIL")); } akhirnya {out.flush (); out.close (); }} public void queryAllUser () {printwriter out = null; aoptest.test1 (); aoptest.test2 (); //logger.error("i "); coba {httpservletResponse response = servletActionContext.getResponse (); response.setContentType ("Teks/html; charset = utf-8"); GSON GSON = GSON baru (); Daftar <User> userList = UserserVice.QueryAllUser (); String gsonstr = gson.toJson (userList); out = response.getWriter (); out.write (gsonstr); } catch (Exception e) {E.PrintStackTrace (); logger.error (e.getMessage ()); if (out! = null) out.write (GSON baru (). TOJSON ("FAIL")); } akhirnya {out.flush (); out.close (); }}}Aoptest.java
Paket ssh.aop; kelas publik aoptest {public void test1 () {system.out.println ("Metode AOPTEST test1 sedang berjalan ~"); } public void test2 () {System.out.println ("Metode AOPTEST TEST2 sedang berjalan ~"); }}Myaop.java
paket ssh.aop; kelas publik myaop {public void sebelumnya () {System.out.println ("bor ~"); } public void setelah () {System.out.println ("After ~"); }}Berbasisnya.java
Paket ssh.dao.base; impor javax.annotation.resource; impor org.hibernate.SessionFactory; impor org.springframework.orm.hibernate4.support.hibernedaosupport; kelas public {@resource {@Resource {@Resource {@Resource public Voidyfacpory {@Resource Public Voidyfacpory {@Resource Public Voidy Sesionfacpory {@Resource Public Voidy SesionFACTORY {@Resource public Voidy SesionFACTORY {@Resource public VoidySionSupport {@Resource public VoidySionSursion this.setsessionFactory (sessionFactory); }}Userdao.java
Paket ssh.dao; impor java.util.arraylist; impor java.util.list; impor org.springframework.orm.hibernate4.hibernateTemplate; impor org.springframework.sheotype.repository; impor ssh.dao.base.baseasuber.sheotype.repository; impor ssh.dao.base.bedaooRyoo; Extends BasedAo {public void add (pengguna pengguna) {this.getHibNeTeMlate (). Simpan (pengguna); } @SuppressWarnings ("Uncecked") Daftar Publik <User> queryAllUser () {List <user> Users = New ArrayList <User> (); Hibernatetemplate hibernatetemplate = this.gethibernateTemplate (); hibernateTemplate.setCachequeries (true); Users = (Daftar <User>) hibernateTemplate.find ("from user"); hibernateTemplate.setCachequeries (false); Pengguna yang kembali; }}User.java
Paket ssh.model; impor java.io.serializable; pengguna kelas publik mengimplementasikan serializable { / ** * * / private static final long serialversionuid = -6190571611246371934l; ID Panjang Pribadi; akun string pribadi; nama string pribadi; alamat string pribadi; Public String getAccount () {Return Account; } public string getName () {return name; } public String getAddress () {alamat kembali; } public void setAccount (String Account) {this.account = akun; } public void setName (name string) {this.name = name; } public void setAddress (Alamat String) {this.address = alamat; } / ** * @return id * / public long getId () {return id; } / ** * @param ID ID untuk mengatur * / public void setid (Long ID) {this.id = id; }}User.hbm.xml
<? XML Versi = "1.0"?> <!-~ hibernate, kegigihan relasional untuk java idiomatik ~ ~ hak cipta (c) 2010, Red Hat Inc. atau kontributor pihak ketiga seperti ~ ditunjukkan oleh tag @author atau atribut hak cipta ekspres ~ pernyataan yang diterapkan oleh penulis. Semua kontribusi pihak ketiga ~ didistribusikan di bawah lisensi oleh Red Hat Inc. ~ ~ Bahan yang dilindungi hak cipta ini tersedia untuk siapa saja yang ingin menggunakan, memodifikasi, ~ menyalin, atau mendistribusikannya kembali pada syarat dan ketentuan Lisensi Publik Umum GNU ~ yang lebih rendah, seperti yang diterbitkan oleh Yayasan Perangkat Lunak Gratis. ~ ~ Program ini didistribusikan dengan harapan akan bermanfaat, ~ tetapi tanpa jaminan apa pun; bahkan tanpa jaminan yang tersirat dari dapat diperjualbelikan ~ atau kebugaran untuk tujuan tertentu. Lihat Lisensi Publik Umum GNU yang lebih rendah ~ untuk lebih jelasnya. ~ ~ Anda seharusnya menerima salinan Lisensi Publik Umum GNU yang lebih rendah ~ bersama dengan distribusi ini; Jika tidak, tulis ke: ~ Free Software Foundation, Inc. ~ 51 Franklin Street, Fifth Floor ~ Boston, MA 02110-1301 USA-> <! Doctype Hibernate-Mapping Public "-// Hibernate/Hibernate Mapping 3.0 // en" "http://www.hibernate.orging.org.org.papping/hibern. package = "ssh.model"> <class name = "user" table = "user"> <cache usage = "read-write"/> <id name = "id" column = "id"> <generator/> </d> <name properten = "type =" java.Lang.string "kolom =" akun "/> <nama properti =" "" JAVA. " name = "Alamat" type = "java.lang.string" kolom = "alamat"/> </belas> </hibernate-Mapping>
Userservice.java
Paket ssh.service; import java.util.list; impor javax.annotation.resource; impor org.springframework.stereotype.service; import ssh.dao.userdao; import ssh.model. Daftar Publik <User> queryAllUser () {return userdao.queryAllUser (); } public void add (pengguna pengguna) {userdao.add (user); }}index.jsp (ingat untuk menambahkan perpustakaan jQuery)
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transisi // en" "http://www.w3.org/tr/html4/loose.dtd"><html><head><meta http-equiv =" content-type "content =" text/html; charset = UTF-8 "> <title> memasukkan judul di sini </title>. 20px;} </tyle> </head> <body> <Div style = "text-align: center;"> <ver> <label> akun: </label> <input id = "akun" type = "text"/> </div> <v> <"label> nama: </label> <input id =" name "type =" Text "//Div </Div> </label> <input ID =" name "type =" Text "/ID </Div> </label> <input ID =" name "type =" Text "//Div> type="text"/></div> <div><button id="addUser" >Add</button></div><h3>User List: </h3><ul id="userList"></ul><script type="text/javascript" src="js/jquery-1.11.1.min.js"></script><script> $(function() { $.ajax({ URL: 'QueryAllUser.action', type: 'Post', DataType: 'json', Success: function (data) {coba {for (var i = 0; i <data.length; i ++) {$ ("#userlist"). append ("<li> <span; style = 'color: red'> id = "+data [i] .id+" </span>, akun = "+data [i] .account+", name = "+data [i] .name+", address = "+data [i] .address+" </li> "); }} catch (e) {}; }, error: function (e) {alert ("Sys error"); }}); $("#addUser").on("click", function() { var account = $("#account").val(); var name = $("#name").val(); var address = $("#address").val(); $.ajax({ url : 'addUser.action', type : 'post', dataType : 'json', data : { account : account, name : name, address : address }, Sukses (data) {coba {$ ("#UserList"). Append ("<li> Account ="+Account+", Name ="+Name+", Alamat ="+Alamat+"</li>"); }); }); </script> </body> </html>7. Hasil Verifikasi
Kembali ke awal, mulailah untuk terbiasa dengan teknologi yang relevan dan memverifikasi hasilnya
1. Bangun lingkungan pengembangan SSH tradisional dan jalankan dengan sukses (masukkan, kueri)
Gambar berikut: permintaan dan tambah pengguna dengan sukses;
2. Memahami konfigurasi kumpulan koneksi C3P0
Koneksi basis data adalah sumber daya yang mahal, dan membuka dan penutupan konsumsi kinerja. Oleh karena itu, mereka dapat dikelola dengan kumpulan koneksi, menginisialisasi beberapa koneksi dan menggunakannya kembali, daripada membuat penutupan berulang kali, yang sedikit mirip dengan kumpulan utas;
Konfigurasi adalah sebagai berikut. Untuk mengonfigurasi jumlah koneksi minimum dan maksimum sesuai dengan situasi proyek yang sebenarnya, silakan merujuk ke tautan untuk makna terperinci dari setiap parameter.
Selain itu, sangat mudah untuk memverifikasi konfigurasi nomor koneksi. Anda dapat menulis program untuk memverifikasi sendiri. Misalnya, ketika jumlah koneksi maksimum adalah 10, Anda dapat menulis program untuk memverifikasi. Setelah membuka 10 koneksi, koneksi ke -11 akan dalam keadaan menunggu dan tidak dapat diperoleh. Oleh karena itu, Anda harus mengonfigurasi jumlah koneksi secara wajar sesuai dengan situasi, jika tidak, ia dapat mempengaruhi kinerja aplikasi;
<!-Dukungan Sumber Data-> <bean name = "DataSource" Destroy-Method = "Tutup"> <nama properti = "driverclass" value = "com.mysql.jdbc.driver" /> <nama properti = "jdbcurl" value = "jdbc: mysql: // localhost: 330 demo /" "" "" "" "" "" "" "" "" "JDBC: MYSQL: // LOCALHOST: 330 JDBCURL" "" "" "" JDBC: MYSQL: // LOCALHOST: 330 DEMO /"" "" "" "" "" "" "" "" "" "" "" "" local "name =" JDBCURL "name =" local " value="root" /> <property name="acquireIncrement" value="1"></property> <property name="initialPoolSize" value="80"></property> <property name="maxIdleTime" value="60"></property> <property name="maxPoolSize" value="80"></property> <property name="minPoolSize" value="30"></property> <property name = "AcquireretryDelay" value = "1000"> </property> <properti name = "AcquireretryAttempts" value = "60"> </property> <properti name = "breakafteracquireFailure" value = "false"> </preate> <!- jika terlalu banyak koneksi muncul, harap dicatat bahwa memodifikasi file konfigurasi saya. ProcessList) -> </tagel>
3. Memahami cache sekunder hibernate dan verifikasi
Cache hibernate tingkat pertama mengacu pada cache sesi-lebar, yang diaktifkan secara default. Cache tingkat kedua adalah cache rentang sesi. Saat mengonfigurasi sessionFactory, kami telah mengkonfigurasi cache tingkat kedua sebagai EHCACHE. Selanjutnya, kami memverifikasi efek dan meminta operasi pengguna. Kami menemukan bahwa kueri pertama akan mengoperasikan database, mencetak pernyataan SQL, dan setelah menyegarkan halaman, kami menemukan bahwa kueri berhasil dan tidak ada pernyataan SQL yang dicetak. Seperti yang ditunjukkan pada gambar di bawah ini, kita dapat melihat bahwa pekerjaan cache sekunder OK;
4. Memahami konfigurasi hal -hal musim semi dan verifikasi
Prinsip kontrol transaksi yang disebut sama, yaitu untuk memastikan atomisitas, konsistensi, isolasi, dan kegigihan. Saat memprogram JDBC, itu dikendalikan dengan sendirinya. Setel autoCommit = false untuk tidak secara otomatis mengirimkan, dan kemudian mulai menulis operasi basis data tertentu. Ketika pengecualian terjadi, rollback, jika tidak berkomitmen; Faktanya, prinsip kontrol pegas pada hal -hal serupa, dan ditambahkan dengan beberapa pengemasan, konfigurasi, dll., Yang lebih nyaman, seperti mengendalikan berbagai metode di lapisan layanan;
Verifikasi sangat sederhana. Tulis dua operasi penyisipan dalam suatu metode di tingkat layanan (perhatikan bahwa nama metode harus mematuhi aturan yang dikonfigurasi dalam file konfigurasi pegas), lempar pengecualian di tengah, dan kemudian jalankan. Jika Anda menemukan bahwa pengguna pertama dimasukkan dengan sukses, itu berarti bahwa kontrol transaksi tidak valid, jika tidak boleh saja;
5. Memahami IOC musim semi (injeksi ketergantungan), menyerahkan objek tindakan (kacang) dari struts2 ke manajemen musim semi, kacang khusus, dll., Dan verifikasi
Jika Anda mengamati dengan cermat, dalam proses mengkonfigurasi file ApplicationContext.xml, pekerjaan utamanya adalah untuk mengonfigurasi informasi terkait kacang. Kacang-kacang ini dibuat terlebih dahulu, tetapi pada kenyataannya apa yang disebut kacang adalah benda;
Tujuan menyerahkan pembuatan objek ke wadah pegas adalah untuk memisahkan;
Selain itu, saat menggunakan struts, aksi register musim semi sebagai kacang, yang merupakan singleton secara default. Tidak setiap kali tindakan baru dikeluarkan selama akses, akan ada risiko saat akses bersamaan;
Namun, Anda dapat mengonfigurasi tindakan menjadi beberapa kasus melalui cakupan = "prototipe"; PS: Tindakan di Struts2 adalah multi-kasus secara default;
Catatan: Kacang yang dikonfigurasi di ApplicationContext.xml dan kacang yang dikonfigurasi dalam anotasi khusus dapat diperoleh secara langsung selama berjalan. Ini mudah diverifikasi, cukup tulis program kecil;
6. Memahami pegas AOP (pemrograman berorientasi bagian), dan menulis fungsi bagian khusus untuk memverifikasi hasilnya
Gagasan ini digunakan di banyak tempat dalam bentuk pemrograman bagian ini, seperti filter, pencegat, kontrol transaksi, dll.
Prinsipnya adalah refleksi Java dan proxy dinamis, yang mengontrol metode sebelum dan sesudah eksekusi, dan menambahkan kode yang ingin Anda jalankan;
Bagian ditambahkan ke contoh kecil, dan sebelum dan sesudah string dicetak sebelum dan sesudah metode dieksekusi. Seperti yang ditunjukkan pada gambar di bawah ini, berfungsi secara normal. Silakan merujuk ke bagian sebelumnya dari kode:
<!-Uji pemrosesan AOP khusus-> <bean id = "aoptest"> </ bean> <bean id = "myaop"> </bean> <aop: konfigurasi proxy-target-class = "true"> <aop: aspek ref = "myaop"> <aop: pointcut id = "pcmethodest" expression = "myaop"> <aop: pointcut id = "pcmethodest" ssh.aop.aoptest.test*(..)) "/> <aop: sebelum pointcut-ref =" pcmethodtest "method =" sebelum "/> <aop: after pointcut-ref =" pcmethodtest "method =" after "/> </ aop: aspek> </aop: config> config>
@Author Coder seperti angin
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.