Pada bagian sebelumnya , "Pertempuran Pertempuran Pertama Proyek Mal Online Kerangka SSH: Integrasi Struts2, Hibernate4.3 dan Spring4.2", kami telah membangun lingkungan pengembangan untuk Struts2, Hibernate dan Spring dan berhasil mengintegrasikannya bersama. Bagian ini terutama menyelesaikan beberapa penambahan dasar, penghapusan, modifikasi dan pencarian, serta ekstraksi layanan, DAO dan tindakan.
1. Ekstraksi lapisan layanan
Pada bagian sebelumnya, kami hanya menulis metode simpan dan perbarui di lapisan layanan. Di sini kita mulai meningkatkan kode di bagian ini dan kemudian mengekstrak kode di lapisan layanan.
1.1 Tingkatkan lapisan layanan kategori
Pengoperasian database tidak lebih dari menambahkan, menghapus, memodifikasi, dan memeriksa. Pertama, mari kita tingkatkan antarmuka dan implementasi lapisan layanan kategori:
// CategoryService Antarmuka Antarmuka Publik CategoryService memperluas BASESERVICE <Gategory> {public void save (kategori kategori); // masukkan pembaruan public void (kategori kategori); // perbarui public void delete (int id); // Hapus kategori publik Get (int id); // Dapatkan Kategori Daftar Publik <Tategory> query (); // Dapatkan semua kategori} Implementasi spesifik dari antarmuka layanan kategori:
Public Class CategoryServiceImpl memperluas BASESERVICEIMPL <Gategory> mengimplementasikan CategoryService {private sessionFactory sessionFactory; // Spring akan menyuntikkan public void setSessionFactory (sessionFactory sessionFactory) {this.SessionFactory = sessionFactory; } Sesi Protected getSession () {// Dapatkan sesi dari utas saat ini, jika tidak, buat sesi baru pengembalian sessionFactory.getCurrentSession (); } @Override public void save (kategori kategori) {getSession (). Save (kategori); } @Override public void update (kategori kategori) {getSession (). Update (kategori); } @Override public void delete (int id) { /*Metode pertama memiliki kelemahan, yaitu, Anda harus menanyakannya sekali sebelum Anda menghapusnya. Objek obj = getSession (). Get (kategori.class, id); if (obj! = null) {getSession (). hapus (obj); }*/ String hql = "Hapus kategori saat id =: id"; getSession (). Createqueery (HQL) // .setInteger ("id", id) // .executeUpdate (); } @Override Public Category Get (int id) {return (Category) getSession (). Get (Category.class, ID); } @Override Public List <at kategori> query () {string hql = "dari kategori"; return getSession (). Createqueery (HQL) .list (); }} 1.2 Implementasi Ekstraksi Lapisan Layanan
Setelah menyelesaikan CategoryService, kami akan mengekstrak implementasi dasar lapisan layanan. Idenya adalah sebagai berikut: Kami mengekstraksi Base Interface Baseservice dan BaseserviceImpl, dan ketika berkembang nanti, jika layanan baru diperlukan, Anda hanya perlu melakukan dua langkah: pertama -tama mendefinisikan antarmuka baru XXXService mewarisi antarmuka Baseservice, yang dapat menambahkan metode abstrak baru ke antarmuka ini; Kemudian tentukan kelas implementasi baru XXXSERVICEIMPL mewarisi BaseserviceImpl dan mengimplementasikan antarmuka XXXService. Ini membuatnya lebih mudah untuk mempertahankan proyek.
Pertama -tama mari kita buat antarmuka Baseservice berdasarkan antarmuka CategoryService di atas:
// BASESERVICE BASETERFACE BASIC, gunakan Baseservice Antarmuka Publik Generik <T> {public void save (tt); Pembaruan public void (T T); hapus public void (int id); publik t get (int id); Daftar Publik <T> query (); } Kemudian buat kelas implementasi antarmuka basa basa basa -cerasa menurut kelas implementasi CategoryServiceImpl:
/ ** * @description TODO (ekstraksi modul publik) * @Author ESON_15 * */ @SuppressWarnings ("Uncecked") Public Class BaseserviceImpl <T> mengimplementasikan Baseservice <T> {Private Class Clazz; // Jenis operasi saat ini disimpan dalam clazz, yaitu, sesi sesi sid private generik. Public BaseserviceImpl () {// Tiga informasi pencetakan berikut dapat dihapus. Berikut adalah System.out.println ("Ini mewakili objek yang saat ini memanggil konstruktor" + ini); System.out.println ("Dapatkan informasi kelas induk dari objek ini saat ini" + this.getClass (). GetSuperclass ()); System.out.println ("Dapatkan informasi kelas induk dari objek ini saat ini (termasuk informasi generik)" + this.getClass (). GetGenericSuperclass ()); // Dapatkan tipe parameter dari parameterisasi generik type = (parameterizedType) this.getClass (). GetGeneriCsuperclass (); clazz = (class) type.getActualTypeargument () [0]; } public void setSessionFactory (sessionFactory sessionFactory) {this.SessionFactory = sessionFactory; } Sesi Protected getSession () {// Dapatkan sesi dari utas saat ini, jika tidak, buat sesi baru pengembalian sessionFactory.getCurrentSession (); } @Override public void save (t t) {getSession (). Save (t); } @Override public void update (t t) {getSession (). Update (t); } @Override public void delete (int id) {System.out.println (clazz.getsimplename ()); String hql = "delete" + clazz.getsimplename () + "sebagai c di mana c.id =: id"; getSession (). Createqueery (HQL) // .setInteger ("id", id) // .executeUpdate (); } @Override public t get (int id) {return (t) getSession (). Get (clazz, id); } @Override Public List <T> query () {string hql = "from" + clazz.getSimpleName (); return getSession (). Createqueery (HQL) .list (); }} Setelah ekstraksi selesai, kita dapat menulis ulang antarmuka CategoryService dan kelas implementasi CategoryServiceImpl. sebagai berikut:
// Antarmuka CategoryService mewarisi antarmuka basa antarmuka Public Interface CategoryService memperluas BASESERVICE <Gategory> { / * * Cukup tambahkan metode baru yang diperlukan oleh CategoryService itu sendiri. Metode publik sudah ada di Baseservice * /} / ** * @description TODO (logika bisnis modul itu sendiri) * @author ESON_15 * * / Kategori PublicServiceImpl memperluas BASESERVICEIMPL <Gategory> mengimplementasikan CategoryService { / * hanya mengimplementasikan metode yang ditambahkan baru dalam hal baru dalam layanan yang ditambahkan di Newlys Service. Metode publik telah diimplementasikan di BaseserviceImpl */} Seperti yang dapat dilihat dari kode, layanan yang baru ditambahkan hanya perlu mewarisi antarmuka Baseservice dan kemudian menambahkan logika bisnis yang diperlukan oleh layanan ke antarmuka. Layanan yang baru ditambahkan hanya perlu mewarisi BaseserviceImpl dan mengimplementasikan logika bisnis yang baru ditambahkan.
Tapi jangan lupa poin penting: Ini untuk memodifikasi kacang di file konfigurasi Spring .
<!-Kelas generik tidak dapat dipakai, jadi tambahkan properti malas-init-> <bean id = "baseService" malas-init = "true"> <name properti = "sessionfactory" ref = "sessionfactory"/> </ bean> <bean id = "categoryService" parent = "baseService"//>
Bunuh properti di CategoryService asli, lalu tambahkan properti induk untuk menunjukkan warisan basa; Kemudian konfigurasikan BASESERVICE dan konfigurasikan SesionFactory ke Baseservice. Selain itu, satu hal yang perlu diperhatikan: Atur properti malas-init ke true, karena Baseservice adalah kelas generik, dan kelas generik tidak dapat dipakai. Pada titik ini, ekstraksi lapisan layanan dilakukan.
2. Tambahkan akun di lapisan layanan
Lapisan layanan baru saja diekstraksi, jadi sekarang sangat mudah untuk menulis layanan akun:
Pertama -tama tulis antarmuka AccountService untuk mewarisi Baseservice:
AccountService Antarmuka Publik Memperluas Baseservice <Account> {// Perhatikan bahwa generik di Baseservice sekarang menjadi akun / * * Cukup tambahkan metode baru yang diperlukan oleh AccountService itu sendiri, dan metode publik sudah ada di Baseservice * /} Kemudian tulis kelas implementasi AccountServiceImpl untuk mewarisi kelas implementasi BaseserviceImpl dan mengimplementasikan antarmuka AccountService:
Public Class AccountServiceImpl memperluas BASESERVICEIMPL <Account> mengimplementasikan AccountService { / * * Cukup terapkan metode yang baru ditambahkan di antarmuka AccountService. Metode publik telah diimplementasikan di BaseserviceImpl */// Kelola fungsi login, dan akan ditingkatkan nanti} Akhirnya, tambahkan konfigurasi berikut ke file beans.xml:
<bean id = "AccountService" Parent = "BaseService" />
Dengan cara ini, layanan baru telah ditulis. Jika Anda perlu menambahkan layanan di masa mendatang, Anda akan mengikuti proses ini, yang sangat nyaman.
3. Ekstraksi aksi
3.1 Simpan data dalam tindakan di domain (permintaan, sesi, aplikasi, dll.)
Kami tahu bahwa dalam tindakan, Anda dapat secara langsung mendapatkan objek ActionContext melalui ActionContext.GetContext (), dan kemudian memperoleh objek domain yang sesuai melalui objek; Anda juga dapat menyuntikkan objek domain yang sesuai dengan mengimplementasikan antarmuka XXXAWARE. Pertama -tama mari kita lihat kedua metode ini:
Kategori Public Class Extends ActionSupport mengimplementasikan permintaan, sessionAware, applicationAware {kategori privat; CategoryService CategoryService pribadi; public void setCategoryService (CategoryService CategoryService) {this.categoryService = CategoryService; } public string update () {System.out.println ("---- UPDATE -----"); CategoryService.update (kategori); mengembalikan "indeks"; } public string save () {System.out.println ("---- save ----"); mengembalikan "indeks"; } public String Query () {// Solution 1, gunakan peta yang sesuai untuk menggantikan objek bawaan asli, sehingga tidak ada ketergantungan dengan JSP, tetapi jumlah kode relatif besar // actionContext.getContext (). Put ("CategoryList", CategoryService.Query ()); // Masukkan ke dalam bidang permintaan // actionContext.getContext (). GetSession (). Put ("CategoryList", CategoryService.Query ()); // Masukkan ke dalam bidang sesi // actionContext.getContext (). GetApplication (). Put ("CategoryList", CategoryService.Query ()); // Masukkan ke dalam domain aplikasi // Solusi 2, mengimplementasikan antarmuka yang sesuai (RequestAware, SessionAware, ApplicationAware), dan biarkan peta yang sesuai suntikan request.put ("CategoryList", CategoryService.Query ()); session.put ("CategoryList", CategoryService.Query ()); application.put ("CategoryList", CategoryService.Query ()); mengembalikan "indeks"; } kategori publik getCategory () {return kategori; } public void setCategory (kategori kategori) {this.category = kategori; } peta pribadi <string, objek> permintaan; Sesi peta pribadi <String, Object>; peta pribadi <String, Object> Aplikasi; @Override public void setApplication (peta <String, Object> Application) {this.application = Application; } @Override public void setSession (peta <String, Object> sesi) {this.Session = sesi; } @Override public void setRequest (peta <String, Object> Request) {this.Request = request; }} Ini masih merupakan kelas kategori yang mengintegrasikan tiga kerangka kerja utama di bagian sebelumnya. Kami menambahkan metode kueri ke metode ini. Dalam metode ini, kami menyimpan hasil kueri ke dalam domain permintaan, domain sesi dan domain aplikasi. Metode pertama adalah secara langsung menggunakan ActionContext untuk mengimplementasikannya. Tidak diperlukan antarmuka, tetapi kodenya besar; Metode kedua mengimplementasikan antarmuka RequestAware, sessionAware dan ApplicationAware, dan tiga metode abstrak untuk mengimplementasikan permintaan suntikan antarmuka, sesi dan aplikasi, dan kemudian menetapkannya ke variabel anggota yang sesuai, sehingga hasil kueri dapat disimpan dalam domain dalam metode kueri. Volume kode ini tampaknya lebih besar dari metode pertama ... tetapi kita dapat mengekstraknya dan membacanya terlebih dahulu.
Kami menambahkan koneksi kueri baru ke index.jsp untuk menguji apakah hasil kueri dapat ditampilkan:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title> jsp 'index.jsp' halaman awal </iteme> </adephing> <t body> <a href = "$ {pagecontext.request.contextPath} /category_update.action?category.id=2&category.type=gorgory.hot=" ACREPLEY> ACREPLEY ... href = "Category_Save.Action"> Access Save </a> <a href = "Category_Query.action"> kueri semua kategori </a> <br/> <c: item foreach = "$ {requestscope.categorylist}" var = "kategori"> $ {Category.id} | $ {Category.Type} | $ {Category.hot} <br/> </c: foreach> <c: foreach item = "$ {sessionscope.categorylist}" var = "kategori"> $ {Category.id} | $ {Category.Type} | $ {Category.hot} <br/> </c: foreach> <c: freeach item = "$ {applicationsCope.categorylist}" var = "Category"> $ {Category.id} | $ {Category.Type} | $ {Category.hot} <br/> </c: foreach> </body> </html> 3.2 Ekstrak Basa
Seperti yang disebutkan sekarang, metode kedua memiliki volume kode yang lebih besar, tetapi kami dapat mengekstraksi basa untuk menangani operasi yang terkait dengan domain ini.
Basa kelas publik memperluas ActionSupport mengimplementasikan permintaan, sessionAware, applicationAware {peta yang dilindungi <string, objek> permintaan; Sesi peta yang dilindungi <String, Object>; Peta yang dilindungi <String, Object> Aplikasi; @Override public void setApplication (peta <String, Object> Application) {this.application = Application; } @Override public void setSession (peta <String, Object> sesi) {this.Session = sesi; } @Override public void setRequest (peta <String, Object> Request) {this.Request = request; }} Kemudian jika tindakan kami sendiri perlu menggunakan objek domain ini untuk menyimpan data, kami dapat secara langsung mewarisi basa, dan kami dapat secara langsung menggunakan objek permintaan, sesi dan aplikasi. Oleh karena itu, kategori yang dimodifikasi adalah sebagai berikut:
Kategori Public Class memperluas basa {kategori kategori pribadi; <pre name = "code"> CategoryService CategoryService; public void setCategoryService (CategoryService CategoryService) {this.categoryService = CategoryService; } public string update () {System.out.println ("--- UPDATE ----"); CategoryService.update (kategori); mengembalikan "indeks"; } public string save () {System.out.println ("---- save -----"); return "index"; } public string query () {request.put ("CategoryList", CategoryService.Query ()); session.put ("CategoryList", CategoryService.Query ()); application.put ("CategoryList", CategoryService.Query ()); mengembalikan "indeks"; } kategori publik getCategory () {return kategori; } public void setCategory (kategori kategori) {this.category = kategori; }} Semua tindakan yang perlu menggunakan bidang permintaan, sesi dan aplikasi hanya diwarisi secara langsung, yang sangat nyaman.
3.3 Dapatkan parameter (ModelDriven)
Mari kita terus lihat kelas kategori di atas. Ada kategori variabel anggota, yang merupakan pojo. Mendefinisikan variabel ini dan menulis metode set dan dapatkan adalah agar halaman JSP diteruskan melalui parameter yang terpasang pada URL. Parameter adalah atribut dalam objek kategori, seperti ID, tipe, dll., Tetapi parameter dalam URL harus ditulis sebagai kategori.id, kategori.Type, dll. Dengan cara ini, struts akan secara otomatis menyuntikkan parameter tulis ini ke dalam objek kategori, dan kemudian kita dapat menggunakan objek kategori ini secara langsung, tetapi ini sedikit complum. Kita dapat menggunakan ModelDriven untuk menyelesaikan masalah dengan lebih mudah.
Kategori Public Class Extends Basicection mengimplementasikan ModelDriven <Tegater> {Kategori Kategori Privat; // Menggunakan antarmuka ModelDriven, metode getModel () harus diimplementasikan. Metode ini akan mendorong item yang dikembalikan ke bagian atas kategori publik Stack @Override getModel () {Category = Category baru (); kategori pengembalian; } <pre name = "code"> Private CategoryService CategoryService; public void setCategoryService (CategoryService CategoryService) {this.categoryService = CategoryService; } public string update () {System.out.println ("---- UPDATE -----"); CategoryService.update (kategori); mengembalikan "indeks"; } public string save () {System.out.println ("---- save ----"); mengembalikan "indeks"; } public string query () {request.put ("CategoryList", CategoryService.Query ()); session.put ("CategoryList", CategoryService.Query ()); application.put ("CategoryList", CategoryService.Query ()); mengembalikan "indeks"; }} Dengan cara ini, kita tidak perlu memasukkan parameter yang membosankan seperti kategori.id di halaman JSP meja depan. Lihatlah bagian ModelDriven dari halaman JSP:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title> jsp 'index.jsp' halaman awal </iteme> </adephing> <t body> <a href = "$ {pagecontext.request.contextPath} /category_update.action?category.id=2&category.type=gorgory.hot=" ACREPLEY> ACREPLEY ... href="category_save.action?id=1&type=haha&hot=true">Test ModelDriven</a> <a href="category_query.action">Query all categories</a><br/> <c:forEach items="${requestScope.categoryList }" var="category"> ${category.id } | $ {Category.Type} | $ {Category.hot} <br/> </c: foreach> <c: foreach item = "$ {sessionscope.categorylist}" var = "kategori"> $ {Category.id} | $ {Category.Type} | $ {Category.hot} <br/> </c: foreach> <c: freeach item = "$ {applicationsCope.categorylist}" var = "Category"> $ {Category.id} | $ {Category.Type} | $ {Category.hot} <br/> </c: foreach> </body> </html> Hasil tes adalah bahwa catgory dapat diperoleh dan semua ID, jenis dan atribut panas ditetapkan dengan baik. Kita dapat melihat bahwa dengan mengimplementasikan antarmuka ModelDriven, kita dapat dengan mudah membawa parameter di URL. Dalam tindakan, kita hanya perlu mengimplementasikan metode getModel dan mengembalikan objek baru untuk digunakan. Pada titik ini, mudah untuk berpikir bahwa pasti akan ada banyak model seperti itu yang perlu diperoleh, jadi kita juga perlu mengekstrak bagian ini ke dalam basa.
3.4 Ekstrak ModelDriven ke Basa
Pertama, kami menambahkan kode bagian ModelDriven ke basa, sebagai berikut:
// Karena ada banyak model berbeda yang memerlukan ModelDriven, kami menggunakan basa kelas publik generik <t> memperluas ActionSupport mengimplementasikan RequestAware, SessionAware, ApplicationAware, ModelDriven <T> {peta yang dilindungi <String, Object> Request; Sesi peta yang dilindungi <String, Object>; Peta yang dilindungi <String, Object> Aplikasi; model T yang dilindungi; @Override public void setApplication (peta <String, Object> Application) {this.application = Application; } @Override public void setSession (peta <String, Object> sesi) {this.Session = sesi; } @Override public void setRequest (peta <String, Object> Request) {this.Request = request; } @Override public t getModel () {// Di sini, baru instance yang sesuai dengan parsing t lulus. ParameterizedType type = (parameterizedType) this.getClass (). GetGenericSuperclass (); Class clazz = (class) type.getActualTypeARGUMS () [0]; coba {model = (t) clazz.newInstance (); } catch (Exception e) {lempar runtimeException baru (e); } model return; }} Setelah ekstraksi, kode dalam kategori akan berkurang dan berkurang:
// warisan basa dan tambahkan kategori kelas publik generik memperluas basa <dategory> {private CategoryService CategoryService; public void setCategoryService (CategoryService CategoryService) {this.categoryService = CategoryService; } public string update () {System.out.println ("---- UPDATE -----"); CategoryService.update (model); // Gunakan model pengembalian langsung "indeks"; } public string save () {System.out.println ("---- save ----"); System.out.println (model); // Gunakan model secara langsung untuk mengembalikan "indeks"; } public string query () {request.put ("CategoryList", CategoryService.Query ()); session.put ("CategoryList", CategoryService.Query ()); application.put ("CategoryList", CategoryService.Query ()); mengembalikan "indeks"; }} Pada titik ini, ada hal lain yang tidak terasa enak tentang hal itu, yang merupakan Variabel Kategori Variabel, yang selalu ada dalam kategori. Karena CategoryAction menggunakan metode dalam objek CategoryService, objek ini harus dibuat dan metode yang ditetapkan dapat disuntikkan. Ini mengarah pada kerugian: jika banyak tindakan perlu menggunakan CategoryService, maka Objek dan Metode Set harus dibuat dalam tindakan mereka. Selain itu, jika beberapa objek layanan yang berbeda digunakan dalam suatu tindakan, semuanya harus dibuat, yang menjadi sangat rumit.
3.5 Layanan Ekstrak ke Basa
Menanggapi masalah di atas, kami mengekstrak semua objek layanan dalam proyek menjadi basa untuk membuatnya. Dengan cara ini, setelah tindakan lain mewarisi basa, mereka dapat menggunakan layanan apa pun yang ingin mereka gunakan:
// Saya mengklasifikasikan konten dalam basa kelas publik basa <t> memperluas tindakan yang mendukung penerimaan requestAware, sessionAware, applicationAware, modelDriven <T> {// Objek Layanan Kategori Kategori Kategori yang Dilindungi; AccountService Service yang Dilindungi; public void setCategoryService (CategoryService CategoryService) {this.categoryService = CategoryService; } public void setAccountService (AccountService) AccountService) {this.accountService = AccountService; } // Domain Object Dilindungi Peta <String, Object> Permintaan; Sesi peta yang dilindungi <String, Object>; Peta yang dilindungi <String, Object> Aplikasi; @Override public void setApplication (peta <String, Object> Application) {this.application = Application; } @Override public void setSession (peta <String, Object> sesi) {this.Session = sesi; } @Override public void setRequest (peta <String, Object> Request) {this.Request = request; } // model T ModelDriven Dilindungi Model; @Override public t getModel () {parameterizedType type = (parameterizedType) this.getClass (). GetGenericSuperclass (); Class clazz = (class) type.getActualTypeARGUMS () [0]; coba {model = (t) clazz.newInstance (); } catch (Exception e) {lempar runtimeException baru (e); } model return; }} Ini membuat CategoryAction lebih menyegarkan: Public Class CategoryAction memperluas basa <Pategory> {Public String Update () {System.out.println ("--- Pembaruan ----"); CategoryService.update (model); mengembalikan "indeks"; } public string save () {System.out.println ("--- save -----"); System.out.println (model); mengembalikan "indeks"; } public string query () {request.put ("CategoryList", CategoryService.Query ()); session.put ("CategoryList", CategoryService.Query ()); application.put ("CategoryList", CategoryService.Query ()); mengembalikan "indeks"; }} Beberapa orang mungkin bertanya, apakah tidak berlebihan jika begitu banyak objek layanan yang disuntikkan ke dalam basa? Ini tidak benar, karena meskipun tidak ditulis dalam basa, wadah musim semi akan membuat objek ini, yang tidak penting. Sebaliknya, objek layanan ditempatkan di basa dan lebih nyaman untuk pengembangan tindakan lain. Selain itu, basa tidak perlu ditugaskan ke file struts.xml, karena tidak ada JSP yang akan meminta basa, itu hanya untuk tindakan lain untuk diwariskan.
Hal lain untuk dilupakan: itu adalah memodifikasi konfigurasi di beans.xml:
<!-Jika itu adalah tipe prototipe, dibuat saat digunakan, tidak secara otomatis saat memulai-> <bean id = "basa" lingkup = "prototipe"> <name properti = "kategori layanan" ref = "kategori layanan"> </prop Property = "property =" Kategori "READPORY" READS BEAN "> </Property </Property> </Properte =" AccountService "Ref =" AccountService "> </Property> </Property =" BEAN "BEED" REF = "AccountService"> </Property> </Property </Properti = " Parent = "BaseAction"/>
Tambahkan kacang basa baru, cocokkan semua objek layanan dalam proyek sebagai properti, dan bunuh properti di kategori asli.
Di masa depan, jika kita ingin menulis xxxaction baru, kita dapat secara langsung mewarisi basa. Jika layanan digunakan dalam xxxaction, kami dapat menggunakannya secara langsung. Kami hanya perlu menambahkan kacang yang sesuai dengan XXXAction di file beans.xml dan mengkonfigurasi lompatan dalam file struts.xml.
4. Ubah XML menjadi anotasi
Kita dapat melihat bahwa ketika proyek menjadi lebih besar dan lebih besar, akan ada lebih banyak konfigurasi di beans.xml, dan banyak konfigurasi yang berlebihan. Untuk membuatnya lebih mudah untuk dikembangkan, kami sekarang mengubah konfigurasi XML menjadi anotasi. Mari pertama -tama lihat konfigurasi di beans.xml:
Ini adalah kacang yang kami tulis ketika kami membangun lingkungan dan mengekstraknya. Ini perlu dikonversi menjadi anotasi. Mari kita gantilah bagian demi sepotong: Pertama -tama ganti bagian layanan, yang memiliki tiga bagian: Baseservice, CategoryService dan AccountService. Ganti sebagai berikut:
Kemudian bunuh bagian yang sesuai dalam beans.xml. Selanjutnya, ubah bagian tindakan, terutama basa, kategori dan akuntaksi, dan ganti sebagai berikut:
Kemudian bunuh konfigurasi bagian tindakan di beans.xml, dan akhirnya tambahkan konfigurasi berikut ke file beans.xml, dan Anda dapat menggunakan anotasi.
<konteks: komponen-scan-package = "cn.it.shop .."/>
Beberapa orang mungkin bertanya, mengapa layanan dan tindakan berbeda saat menggunakan anotasi? @Service digunakan dalam layanan dan @controller digunakan dalam aksi? Bahkan, itu sama, hanya untuk membedakan mereka dari berbagai lapisan kacang agar mudah dibaca.
Alamat unduhan kode sumber dari seluruh proyek: //www.vevb.com/article/86099.htm
Alamat asli: http://blog.csdn.net/eson_15/article/details/51297698
Di atas adalah seluruh konten dari Pertempuran Kedua dari Proyek Mal Online Kerangka SSH. Saya berharap ini akan membantu untuk pembelajaran semua orang, dan saya harap semua orang akan lebih mendukung wulin.com.