Saya percaya bahwa tidak ada yang tidak tahu tentang SSH. Struts2+Spring+Hibernate, arsitektur pengembangan perusahaan "dasar", mengapa dasar -dasarnya ditandai dalam kutipan? Karena yayasan ini adalah apa yang banyak orang pikirkan tentang itu. Yang paling mendasar adalah servlet. Banyak lembaga pelatihan tidak mengajarkan banyak dasar, dan mereka akan memiliki tiga kerangka kerja besar secara langsung. SSH atau SSI, yang membuat banyak orang berpikir bahwa pengembangan Javaweb harus memiliki kerangka kerja. Tanpa kerangka kerja, itu sama dengan kehilangan tangan. Tidak ada salahnya dalam tiga kerangka kerja utama dan mereka praktis. Banyak perusahaan menggunakannya dan dapat secara langsung mulai mengembangkannya. Tetapi setelah lulus, saya pikir saya tidak pernah menggunakan tiga kerangka kerja besar untuk waktu yang lama. Musim semi berguna, terutama SpringMVC. Rasanya jauh lebih menarik untuk digunakan daripada Struts2. Sebenarnya, jika Anda memikirkannya, Spring menyerap beberapa keuntungan dari struts, dan dengan beberapa hal yang tenang, rasanya jauh lebih menyenangkan. Tapi hari ini kami tidak akan menonton SpringMVC, dan kami akan meluangkan waktu untuk melihat bagian -bagian elegan dari SpringMVC di masa depan.
Sampai ke intinya. SSH telah memperbarui versinya, jadi saya masih ingin berbicara tentang versi di sini, jika tidak banyak teman akan memarahi saya. Saya menggunakan 2.3.4 untuk Struts2, Spring adalah 3.2.2 terbaru, dan Hibernate adalah 4.1.9, yang cukup baru.
Sebelum memasukkan kode, mari kita pahami peran yang dimainkan oleh tiga kerangka kerja utama.
1) Struts: Mengapa kita menggunakan struts? Apa perbedaan antara mereka dan servlet? Bahkan, kita masih bisa melakukan MVC tanpa struts, tetapi mungkin sedikit lebih tertekan dalam file konfigurasi. Struts terutama membantu kami mewujudkan fungsi distribusi, membagi permintaan spesifik kami menjadi kelas tertentu, dan membantu kami mengatur properti (yang dilakukan melalui ActionForm di Struts1.x). Struts2 telah membuat banyak kemajuan dibandingkan dengan Struts1. Secara otomatis menetapkan nilai, tidak memerlukan kelas implementasi atau warisan, dan memiliki serangkaian konsep seperti rantai permintaan. Karena ini tidak banyak digunakan, saya tidak akan menyesatkan Anda saudara, jadi saya tidak akan banyak bicara.
2) Musim Semi: Saya percaya bahwa Daimyo musim semi bukan Java, tidak tahu. Banyak orang seharusnya belajar tentang musim semi melalui IOC -nya di awal, atau mereka tidak tahu apa -apa, hanya tiga kerangka kerja utama SSH datang. Tidak masalah, bagaimanapun, ketika kita menggunakan tiga kerangka kerja utama, Spring sebagian besar merupakan alat untuk kelas tautan. Dikombinasikan dengan dua kerangka kerja utama lainnya, SSI dan SSH, mereka sama. Spring hanya menyediakan alat untuk membuat kita lebih nyaman untuk menggunakan tiga kerangka kerja utama. Tentu saja, sejumlah besar program dalam kombinasi kerangka kerja juga mengandalkan IOC Spring, dan tentu saja kami akan menggunakan transaksi. AOP dan hal -hal lain yang lebih canggih bergantung pada kebutuhan. Jika ada persyaratan log dan persyaratan intersepsi, lebih baik menggunakan AOP untuk mencapainya.
3) Hibernate: Hibernate juga terkenal di dunia Jawa, pada dasarnya standar ORM. Ini memberikan cache, level satu dan level dua, dan ada juga HQL. Apa yang kita gunakan saat menggabungkan tiga kerangka kerja utama? Tentu saja, ini adalah fungsi utama pemetaan ORM, jadi kami tidak akan mempertimbangkan cache untuk saat ini. Banyak orang tidak pernah mempertimbangkan mengapa mereka membutuhkan ORM. Faktanya, ini terutama karena konflik antara bidang data dan kelas. Jika Anda menggunakan JDBC untuk beroperasi dan mengatur bidang satu per satu, Anda mungkin akan menjadi gila setelah melakukannya untuk waktu yang lama, jadi ORM muncul saat ini.
Tiga kerangka kerja utama bertanggung jawab atas hal -hal berikut: Struts2 - Bertanggung jawab untuk penerusan permintaan dan pemrosesan formulir yang sesuai, Organisasi Kelas Musim Semi (mis. IOC), mengelola tindakan yang awalnya dikelola oleh Struts2 sebagai kacang, dan pemetaan Hibernate - ORM, memetakan kelas -kelas ke tabel.
Setelah memahami divisi umum persalinan, tentu saja kami mulai mengkode. Hal yang paling merepotkan tentang tiga kerangka kerja utama adalah paketnya. Banyak orang suka menggunakan myeclipse terutama karena dapat membantu kami mengimpor paket dari tiga kerangka kerja utama. Tetapi disarankan agar para pemula tidak boleh menggunakannya. Pertama, Myeclipse memiliki struktur proyek sendiri. Saat Anda mendapatkan Panduan Eclipse, Anda harus mengatur beberapa aspek proyek, yang akan menyebabkan ketidaknyamanan bagi orang lain; Kedua, Myeclipse jarang menggunakannya di perusahaan, jadi lebih baik untuk terbiasa dengan Eclipse. Atau bagus jika Anda menyukai ide.
Paket yang diperlukan untuk Struts2 adalah sebagai berikut: ANTLR, ASM, XWORK, STRUTS2-CORE, OGNL, Common-Goalging, Common-Fileupload, Struts-Spring-Plugin. Mungkin hanya ada sedikit, dan mungkin tidak ditulis secara penuh. Anda dapat menambahkan kesalahan saat startup. Tidak disarankan untuk membuang semua paket segera setelah Anda mulai. Beberapa paket dalam tiga kerangka kerja bertentangan.
Paket yang dibutuhkan oleh Spring3 adalah sebagai berikut: Spring-Beans, Spring-Core, Spring-Context, Spring-Context-Support, Spring-Expression, Spring-As (kami menggunakan tiga kerangka kerja utama dan membutuhkan dukungan ORM), Spring-Web, Spring-TX (kami menggunakan transaksi, tetapi tidak terlibat dalam contoh).
Paket yang dibutuhkan oleh Hibernate4 adalah sebagai berikut: Hibernate mengunduh semua paket toples di folder yang diperlukan dalam paket.
Sama seperti paket -paket ini, itu masih hal yang sama. Tidak disarankan untuk menempatkan semua paket segera setelah Anda mulai, karena beberapa paket dalam tiga kerangka kerja memiliki konflik, jadi tambahkan saja sesuai kebutuhan saat dibutuhkan. Ketika ClassNotFound muncul, masukkan paket JAR yang sesuai di direktori LIB.
Persiapan berakhir di sini dan kami secara resmi memulai.
1) Pertama -tama, kita perlu menggunakan struts2, dan kita harus membuatnya mencegat permintaan
<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>
Kode ini memungkinkan Struts untuk mencegat semua permintaan. Tentu saja, itu tidak berarti bahwa semua permintaan dicegat berdasarkan musim semi. Kami juga dapat mengonfigurasi struts.xml untuk mencegat nama akhiran tertentu. Secara umum, ini adalah tindakan. sebagai berikut:
<name konstan = "struts.objectfactory" value = "spring" /> <constant name = "struts.action.extension" value = "action" />
Struts.action.Extension Mengkonfigurasi nama akhiran default untuk mencegat, sehingga nama akhiran akan diperiksa saat mencegat, dan yang cocok akan diteruskan oleh Struts. Struts.ObjectFactory berarti bahwa kelas pemrosesan penyerahan struts diserahkan kepada Spring untuk manajemen, yaitu, dikelola sebagai kacang.
2) Biasanya ketika kita menggunakan Spring secara langsung, kita akan menelepon *ApplicationContext, tetapi kita sekarang berada di web, jadi kita tidak dapat menyebutnya secara manual. Faktanya, Spring menyediakan metode untuk panggilan dalam situasi web, dengan servlet (saya belum menggunakan ini, saya tidak tahu bagaimana menggunakannya), seorang pendengar, servlet adalah untuk server aplikasi yang tidak mendukung filter, tetapi sekarang kami pada dasarnya menggunakan pendengar.
<listener> <Distener-Class> org.springframework.web.context.contextLoaderListener </listener-class> </engeaner>
Dalam hal ini, sebagian besar kasus ketika musim semi perlu dikombinasikan dengan kerangka kerja lainnya. Ketika kami hanya menggunakan SpringMVC, kami dapat secara langsung mengonfigurasi DispatcherServlet untuk mengganti servlet struts di atas. Mari kita lihat detailnya saat menggunakan SpringMVC nanti.
Dalam hal ini, file ApplicationContext.xml di direktori Web-INF umumnya akan dimuat. Ketika nama file Anda bukan ini atau jalurnya tidak ada di sini, Anda dapat mengonfigurasi properti ConfigContextPath.
<context-param> <Param-name> configContextPath </param-name> <param-value> web-inf/applicationContext.xml </param-value> </context-param>
Ini mendukung penggunaan classpath: awalan, dll., Saya tidak akan membicarakannya di sini, Anda dapat membaca file konfigurasi musim semi secara detail. Dengan cara ini, kami sebenarnya telah menggabungkan struts dan musim semi, tetapi kami belum melakukan beberapa konfigurasi kacang dan penyerahan struts.
3) Sebagai ORM, Hibernate juga dikelola pada musim semi saat ini. Spring menyediakan LocalSessionFactory. Perhatikan bahwa kelas ini, Hibernate3 dan 4 berbeda, Spring menyediakan dua. Konfigurasi berikut adalah di ApplicationContext.xml
<bean id = "sessionFactory"> <properti name = "DataSource" ref = "DataSource"/> <name properti = "MappingResources"> <cist> </list> </prop Property> <Properti Nama = "HibernateProPerties"> <tops> </sops> </prop Property> </bean>
Bahkan, konfigurasinya mirip dengan yang ada di Hibernate, jadi saya tidak akan berbicara tentang kode spesifik di sini.
4) Di masa lalu, ketika musim semi 2.5.x, kami menggunakan HibernedAoSport paling banyak, tetapi Spring 3.x tidak memberikan dukungan ini di awal. Kita perlu menggunakan sesi asli untuk beroperasi (hanya menyuntikkan sessionFactory), tetapi sebenarnya ada masalah di sini. Jika kita membuka dan menutup koneksi untuk setiap permintaan, itu akan mengkonsumsi lebih banyak sumber daya, tetapi jika kita tidak menutup koneksi, itu tidak akan terlalu bagus. Jadi ada solusi trade-off, dan manajer untuk mengelola koneksi. Di sini Spring menyediakan OpenSessionInview. Setiap kali tampilan dibuka (pada dasarnya setiap permintaan), sesi akan dibuka. Kami akan mengabaikan bagaimana dikelola secara internal untuk saat ini.
<filter> <nilter-name> OpenSessionInviewFilter </tiler-name> <nilter-class> org.springframework.orm.hibernate4.support.opensessionInviewFilter </filter-class> </filter> <nilter-Mapping> <TERFERTER-NAME> OPENSESTIONInViewFilter </filter-name> <rilter-papping> <nilter-name>
Di sini kami masih memintanya untuk mencegat semua permintaan. Tentu saja, ini dapat dikonfigurasi hanya untuk mencegat akhiran tindakan, jadi tidak perlu membuang sumber daya.
5) Pada dasarnya, kerangka kerja SSH kami diatur, dan hal berikutnya hanya masalah dengan kode. Anda hanya perlu mengkonfigurasi kacang di file konfigurasi pegas, atau jika Anda suka anotasi, Anda hanya dapat @component (value = 'bean name') secara langsung, tetapi ingat untuk mengaktifkan component-scan dalam file konfigurasi.
Kode tidak akan ditulis secara rinci, secara kasar sebagai berikut:
@Component (value = "UserAction") Public Class UserAction {} <package name = "user" extends = "struts-default" namespace = "/user"> <!-Pengguna Login-> <action name = "Login" Method = "Login"> <name = "error">/halaman/login.jsps </result> </action> Bahkan, itu hanya perlu memodifikasi pointer di kelas untuk menunjuk kacang.
Lagipula, saya tidak akan memposting kode terperinci, ini adalah ringkasan. Secara umum, SSH lebih bermanfaat untuk kode spesifikasi tim, karena kode yang ditulis di bawah spesifikasi kerangka kerja pada dasarnya memiliki formulir tertentu, yang lebih baik untuk pemeliharaan di masa depan. Tetapi untuk pemula, disarankan untuk tidak terlalu mengandalkan kerangka kerja. Jika Anda benar -benar harus menggunakannya, Anda perlu memahami secara umum apa yang dilakukan kerangka kerja ini, keadaan apa yang Anda butuhkan untuk menggunakannya, dan keadaan apa yang seharusnya Anda gunakan.