Mempelajari Spring dalam praktiknya, tujuan akhir dari seri ini adalah untuk menyelesaikan proyek yang mengimplementasikan fungsi pendaftaran dan login pengguna.
Proses dasar yang diharapkan adalah sebagai berikut:
1. Daftarkan situs web pengguna, isi nama pengguna, kata sandi, email, dan informasi nomor ponsel, dan kembalikan OK setelah menyetornya di database di latar belakang. (Pelajari pengetahuan dasar IOC, mybatis, springmvc, verifikasi data formulir, unggah file, dll.)
2. Server mengirim email secara tidak sinkron ke pengguna terdaftar. (Pelajari Antrian Pesan)
3. Login Pengguna. (Belajar cache, keamanan musim semi)
4. Lainnya.
Belajar dan merangkum, dan memperbarui dari waktu ke waktu. Lingkungan proyek adalah IntelliJ + Spring4.
1. Pekerjaan persiapan.
1. Buat Database dan Tabel di MySQL.
2. Buat proyek WebApp Maven di IntelliJ.
(1) Impor paket ketergantungan yang diperlukan di pom.xml.
<? Xml Version = "1.0" encoding = "UTF-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://orgen.apache.apache http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelversion>4.0 MAVEN Webapp </name> <rurl> http://maven.apache.org </ruRl> <props> <spring.version> 4.3.1.release </spring.version> </ Properties> <dependencies> <!-Spring Core, Context-> <dependency> <GroupId> org.springframework </groupId> <ArTifactId> Spring-Context </artifactId> <Version> $ {spring.version} </version> </dependency> <sependency> <groupid> org.springframework </groupid> <ArTtifa CTID> spring-context-support </artifactId> <Version> $ {spring.version} </version> </gandendency> <dependency> <groupid> org.springframework </groupid> <ArTifactId> Spring-core </arttifactid> <version> $ {spring.version} </ve Rsion> </dependency> <dependency> <GroupId> org.springframework </groupid> <ArtifactId> Spring-beans </t Artifactid> <version> $ {spring.version} </version> </dependency> <!-test-test-> <groupid> Junit </groupid> <ar TifactId> JUnit </artifactId> <version> 4.12 </version> <!-<scope> test </ scope>-> </dependency> <dependency> <groupid> org.springframework </groupid> <ArTifactId> spring-test </artifactid> <version> $ {spring.version} </voVersion rsion> </dependency> <!-springmvc-> <dependency> <GroupId> org.springframework </groupid> <ArTifactId> spring-webmvc </t Artifactid> <version> $ {spring.version} </version> </dependency> <dependency> <versi groupid> amework </groupid> <ArTifactId> spring-web </stifactid> <version> $ {spring.version} </version> </dependency> <dependency> <groupid> javax.validation </groupid> <ArTifactId> validasi-API </artifactid> <version> 1.1.0.fin Al </version> </dependency> <dependency> <GroupId> org.hibernate </groupId> <ArtifactId> hibernate-validator </artifactid> <version> 5.2.4.final </version> </dependency> <!-servlet-> <groupid> <groupid> JAVAX.Servlet < /groupid><tifactid> javax.servlet-api</artifactid><version>3.1.0</version></dependency><dependency><groupid> javax.servlet</groupid><tifactid> jstl</artifactid><version>--version1.2 mybatis-> <dependency> <GroupId> org.springframework </groupId> <ArTifactId> spring-jdbc </artifactid> <version> $ {spring.version} </version> </dependensi ID> <version> 6.0.3 </version> </gandendency> <dependency> <GroupId> org.mybatis </groupid> <ArtifactId> mybatis </artifactid> <version> 3.4.1 </version> </Dependency> <sgroupid> <Roupid> <version-mybatis </Version> <sortif IFACTID> <Version> 1.3.0 </version> </gandendency> <dependency> <Groupid> C3P0 </proveDid> <ArtifactId> C3P0 </artifactid> <version> 0.9.1.2 </version> </dependency> </dependencies> <buaring> <finalname> JAVA_CONFIG_WEB </<buesname> <dendor> <finalname> <finalname> <finalname> JAVA_CONFIG_WEB </finalname n> <groupid> org.apache.maven.plugins </groupId> <ArTifactId> maven-war-plugin </artifactid> <version> 2.2 </version> <configuration> <agailonmissingwebxml> false </ag failonmissingwebxml> <failonmissingwebxml> </ag failonmissingwebxml> </configuration> </failonmissing </ (2) Struktur Direktori Proyek adalah sebagai berikut:
2. Mybatis
1. Mengkonfigurasi informasi dasar database MySQL.
# Databasedb.mysql.driverclass = com.mysql.jdbc.driverdb.mysql.jdbcurl = jdbc: mysql: // localhost: 3306/register_notice? UseUnicode = true & characterencoding = utf-8 & allowmultiqueries = TRUEDB.QL.ADUSE. rootdb.mysql.password = 333db.minpoolSize = 10db.maxpoolSize = 100dB.initialpoolSize = 20db.maxidletime = 60db.acquireINDrement = 5db.maxStatements = 100db.idleConnectionTesPeriod = 60DB.MaxTatsements = 100db.idleConnectionTesperiod = 60DBR.REXICTSPOCLACLACIONSPL.IDBADRSAID = 60DBR.IDLECONTERPERCEOD = 60DBR.IDBOTADSPLSQUITS = 30db.breakafteracquirefailure = truedb.testconnectionOncheckout = falsedb.properties
2. Mengkonfigurasi mybatis.xml dan spring-mybatis.xml.
<? Xml Version = "1.0" encoding = "UTF-8"?> <! Doctype ConfigurationPublic "-// mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd"> alias-> <yypealiases> <!-Pilih salah satu dari dua metode berikut. Metode 1: Gunakan Typealias untuk mengatur alias untuk satu kelas. -> <!-<Typealias type = "com.everseeker.entity.user" alias = "user" /> --- Metode 2: Gunakan paket untuk mengatur alias untuk semua kelas di bawah paket. Aturan default adalah com.everseeker.entity.user diatur ke pengguna, dan menghapus nama paket sebelumnya. -> <package name = "com.everseeker.entity" /></typealiases></configuration> mybatis.xml<?xml versi = "1.0" encoding = "UTF-8"?> xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: konteks = "http://wwwork.org /schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xsi:schemalOcation= ringframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-leans.xsdhttp://www.spring framework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx/spring-tx.xsd">< !-- Memperkenalkan file db.properties ke dalam file ini dapat memastikan bahwa nilai yang sesuai dapat ditemukan dalam konfigurasi selanjutnya seperti $ {db.mysql.driverclass}-jika tidak, jika seorang kolega secara langsung memuat db.properties dan spring-mybatis.xml di root config.java, itu tidak dapat dijamin yang dijamin akan dijamin. ERROR-> <Context: Properti-PlaceHolder Lokasi = "ClassPath: DB.Properties"/> <!-Konfigurasi Sumber Data C3P0 memiliki 2 paket kelas implementasi sumber data umum, satu adalah Apache DBCP (org.apache.commons.dbcp.basicDataSource), dan yang lainnya adalah C3P0. -> <bean id = "DataSource" Destroy-Method = "Close"> <properti name = "driverclass" value = "$ {db.mysql.driverclass}" /> <name properti = "jdbcurl" value = "$ {db.mysql.jdbcurl}" / /<"name {db.mysql.jdbcurl}" /> <"{db.mysql.jdbcurl}" /> /> <name properti = "kata sandi" value = "$ {db.mysql.password}" /> <!-Jumlah minimum koneksi yang disimpan di kumpulan koneksi. -> <name properti = "minpoolSize" value = "$ {db.minpoolSize}" /> <!-Jumlah koneksi maksimum yang disimpan di kumpulan koneksi. Default: 15-> <name properti = "maxpoolSize" value = "$ {db.maxpoolsize}" /> <!-Jumlah koneksi yang diperoleh selama inisialisasi harus antara minpoolSize dan maxPoolSize. Default: 3-> <name properti = "initialpoolSize" value = "$ {db.initialpoolSize}" /> <!-waktu luang maksimum, jika tidak digunakan dalam 60 detik, koneksi akan dibuang. Jika 0, itu tidak akan pernah dibuang. Default: 0-> <name properti = "maxidletime" value = "$ {db.maxidletime}" /> <!-Jumlah koneksi yang diperoleh oleh C3P0 pada waktu yang sama pada satu waktu ketika koneksi di kumpulan koneksi habis. Default: 3-> <name properti = "AcquireIncrement" value = "$ {db.acquireIncrement}" /> <!-Parameter standar JDBC digunakan untuk mengontrol jumlah statestasi disiapkan yang dimuat dalam sumber data. Tetapi karena pernyataan pra -cuci milik satu koneksi daripada seluruh kumpulan koneksi. Oleh karena itu, pengaturan parameter ini membutuhkan banyak faktor. Jika MaxStatements dan MaxStatementsPerConnection adalah 0, cache ditutup. Default: 0-> <name properti = "maxStatements" value = "$ {db.maxstatements}" /> <!-Periksa semua koneksi di kumpulan koneksi setiap 60 detik. Default: 0-> <name properti = "IDLEConnectionTestPeriod" value = "$ {db.idleConnectionTestPeriod}" /> <!-Menentukan jumlah upaya yang diulang setelah koneksi baru gagal diambil dari database. Default: 30-> <name properti = "AcquireretryAttempts" value = "$ {db.acquireretryAttempts}" /> <!-Memperoleh koneksi akan menyebabkan semua utas menunggu kumpulan koneksi untuk mendapatkan koneksi untuk melempar pengecualian. Namun, sumber data masih valid dan terus mencoba mendapatkan koneksi saat berikutnya Anda menelepon getConnection (). Jika diatur ke True, sumber data akan menyatakan bahwa itu telah terputus dan ditutup secara permanen setelah upaya gagal untuk mendapatkan koneksi. Default: false-> <name properti = "breakafteracquirefailure" value = "$ {db.breakafteracquirefailure}" /> <!-Untuk konsumsi kinerja tinggi, harap hanya menggunakannya saat dibutuhkan. Jika diatur ke True, validitasnya akan diverifikasi pada setiap pengajuan koneksi. Disarankan untuk menggunakan IdLeconnectionTestPeriod atau Automaticttable untuk meningkatkan kinerja pengujian koneksi. Default: false-> <name properti = "testConnectionOnCheckout" value = "$ {db.testConnectionOnCheckout}" /> < /bean> <!-Perbedaan antara mybatis configuration.classpath dan classpath*, rujuk ke dokumen: http://blog.csdn.net/zl3450341/article/details/9306983.classpath hanya akan mengembalikan sumber daya pencocokan pertama. Disarankan untuk menggunakan ClassPath untuk satu dokumen yang menentukan jalur; Gunakan ClassPath*Saat mencocokkan beberapa dokumen .--> <bean id = "sqlSessionFactory" p: DataSource-ref = "DataSource" p: configLocation = "classpath: mybatis.xml" p: mapperseder = "classpath*: mapper /*mapper.xml" /<beaner> <beaner> <papsex! Paket ini akan dicari. Beberapa paket dapat ditentukan. MappersCannerConfigurer akan memindai semua kelas antarmuka (termasuk subpackage) di bawah paket yang ditentukan oleh Basepackage. Jika mereka telah didefinisikan dalam file pemetaan SQL, mereka akan secara dinamis didefinisikan sebagai kacang musim semi. -> <name properti = "Basepackage" value = "com.everseeker.dao" /> <name properti = "sqlSessionFactoryBeanName" value = "sqlSessionFactory" /< /bean> <!-Konfigurasi Manajer Transaksi, menggunakan transaksi JDBC-> <bean> ID = "TransactionManager" class = "org.springframework.jdbc.datasource.datasourCetransactionManager"> <name properti = "DataSource" ref = "DataSource" /> </ bean> <!- Gunakan Annotation untuk mendefinisikan transaksi dan proses proses yang ditandai dengan @transaction anxaction. Secara default, manajer transaksi bernama TransactionManager secara otomatis digunakan. Proxy-Target-Class benar, menunjukkan bahwa musim semi akan proxy kelas bisnis dengan membuat subkelas, dan perlu menambahkan perpustakaan kelas CGLIB.Jar ke Classpath. -> <tx: anotasi-driven transaction-manager = "transactionManager" proxy-target-class = "true" /></beans>spring-mybatis.xml3. Buat kelas pengguna dan antarmuka userdao.
Pengguna kelas publik {@size (min = 32, maks = 32, pesan = "UUID harus menjadi string 32-bit") Private String ID; @Size (min = 1, max = 32, pesan = "Panjang akun harus antara 1-32-bit")@neail "@neail; @notempty (pesan =" kata sandi tidak bisa kosong ")@neail =@neail:@neail:@neail: @notempty (pesan =" kata sandi tidak bisa kosong ")@neail =@neail:@neail:@neail@neail; @notempty (pesan =" kata sandi tidak bisa kosong ")@neail@neail@neail@neail@neail; tidak benar ") email string pribadi; @size (min = 11, max = 11, pesan =" Panjang nomor ponsel adalah 11 digit ") ponsel string pribadi; regdate panjang pribadi; pengguna publik () {this.id = uuid.randomuuid, string (). ponsel) {ini (nama pengguna, kata sandi, email, ponsel, tanggal baru (). gettime ());} pengguna publik (nama pengguna string, kata sandi string, email string, ponsel string, regdate panjang) {this.id = uuid.randomuuid (). ToString (). ReplaceAll ("-" ""); this. Email; this.cellphone = ponsel; this.regdate = regdate;} public string getId () {return id;} public void setId (string id) {this.id = id;} public string getUserName () {return userName;} public void setusername (string username) {this.username = username; setPassword (kata sandi string) {this.password = kata sandi;} public string geteMail () {return email;} public void seteMail (string email) {this.email = email;} public string getCellphone () {return cellphone;} public void setCellphone (string seluler) {this.cellphone; {cellphone; cellphone; setRegDate (regdate panjang) {this.regDate = regdate;}@overridepublic string toString () {return "[user: id =" + id + ", username =" + nama pengguna + ", kata sandi =" + kata sandi + ", email =" + email + ", selphone =" + ponsel + ", RegDate =" + email = " + email", selphone = " + ponsel +", RegDate = "Komentar seperti @notnull, @notempty, @size dan @email di user.java untuk sementara diabaikan dan dijelaskan nanti.
@RepositoryPublic interface userdao {void addUser (pengguna pengguna); pengguna getUserByUserName (string username);}4. Buat file pemetaan userMapper.xml di direktori SRC/Main/Resources/Mapper untuk mengimplementasikan metode di antarmuka userdao. Catatan: *File Mapper.xml harus ditempatkan di direktori SRC/Main/Resources, dan sebelumnya ditempatkan di direktori SRC/Main/Java/Com/Everseeker/DAO, menghasilkan kesalahan yang tidak dapat dijelaskan.
<? Xml Version = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper namespace="com.everSeeker.dao.UserDao"><resultMap id="ResultMapUser" type="com.everSeeker.entity.User"></resultMap><insert id="addUser" parameterType="User">INSERT INTO user(id, username, password, email, cellphone, regDate) VALUES(#{id}, #{username}, #{password}, #{email}, #{seluler}, #{regdate}) </insert> <pilih id = "getUserByUserName" parameTerType = "string" resultMap = "resultMapiSer"> dari pengguna di mana username = #{uSername} </select> </mapper> AKU AKU AKU. IOC
1. Buat wadah IOC, dan gunakan metode anotasi untuk rootconfig.java.
@Configuration@ComponentScan(basePackages = {"com.everSeeker"}, excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, value = RootConfig.WebPackage.class)})@ImportResource({"classpath:spring-mybatis.xml"})public class RootConfig {public static class WebPackage memperluas RegExPatternTypeFilter {public webpackage () {super (pola.compile ("com //. Everseeker //. Web"));}}} @Configuration: Menunjukkan bahwa ini adalah kelas konfigurasi.
@ComponentScan: Aktifkan pemindaian komponen, Basepackages: Paket dasar yang perlu dipindai. Excudefilters: Jangan pindai jika filter memenuhi kondisi filter.
@Importresource: Perkenalkan file XML.
@PropertySource: Memperkenalkan file properti.
2. Karena proyek WebApp dibuat dan SpringMVC digunakan, DispatcherServlet adalah intinya. Dalam versi Spring sebelumnya, itu umumnya dikonfigurasi dalam web.xml. Di Musim Semi 4, dapat diimplementasikan dalam kode Java. WebAppInitializer.java.
Kelas Publik WebAppInitializer memperluas AbstractAnnotationConfigDispatcherServLeTInitializer {// Class yang mewarisi AbstractAnnotationConfigDispatcherServLeTInitializer akan secara otomatis mengkonfigurasi Konteks Aplikasi DispatcherServlet dan Spring @Overrideprotected [] "GetServerMappings () {// MAP" DISPATCER "DISERVERS" PERUSAHAAN "UNTUK" DISPATCER "PERUSAHAAN" PERUSAHAAN " };}/*** Kelas rootconfig digunakan untuk mengonfigurasi kacang dalam konteks aplikasi yang dibuat oleh ContextLoaderListener,*misalnya, @repository, @service dan komponen lainnya*/ @overrideprotected class <?> [] Getrootconfiglasses () {return class baru <?> [] {] {{] {{] {{] {{] {{] {{{] {{Loadclass {{root class () {root Class () konteks, gunakan kacang yang ditentukan dalam kelas konfigurasi webconfig, * digunakan untuk memuat kacang yang berisi komponen web, seperti pengontrol, melihat parser dan pemetaan prosesor, @controller, @RequestMapping, dll. };}@Overrideprotected void customizeregistration (servletregistration.dynamic Registration) {// Batasi ukuran file yang diunggah hingga tidak lebih dari 2MB, seluruh permintaan tidak melebihi 4m, dan semua yang diunggah untuk ditulis ke disk. " 4194304, 0));}}3. Buat webconfig.java.
@Configuration@enableWebMvc@componentscan ("com.everseeker.web") Kelas publik WebConfig memperluas webmvcconfigurerAdapter {// Konfigurasi JSP View Parser @BeanPublic ViewResolver ViewResolver () {InternalResourCeviewResolvererviewRerver () {InternalResourCeviewResolverRESOLVER () {internalResourceViewResolvererver InternalResourCeviewResolver (); ResourceviewResolver.setPrefix ("/web-inf/views/"); ResourceviewResolver.SetSuffix (". @Beanpublic MultipartResolver multipartResolver() throws IOException {return new StandardServletMultipartResolver();}//Configure static resources processing @Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configure) {configurer.enable();}}@Bean: Mendeklarasikan metode ini menciptakan contoh dari jenis dan register yang diinginkan sebagai kacang dalam konteks aplikasi musim semi.
Di atas adalah penjelasan terperinci tentang Spring Learning Note 1, IOC, yang diperkenalkan oleh editor, kepada Anda, mencoba menggunakan anotasi dan kode Java sebanyak mungkin. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!