التعلم الربيع في الممارسة العملية ، فإن الهدف النهائي لهذه السلسلة هو إكمال مشروع ينفذ وظيفة تسجيل المستخدم وتسجيل الدخول.
العملية الأساسية المتوقعة هي كما يلي:
1. قم بتسجيل موقع المستخدم على الويب ، وملء اسم المستخدم وكلمة المرور والبريد الإلكتروني ومعلومات رقم الهاتف المحمول ، وإرجاع موافق بعد إيداعه في قاعدة البيانات في الخلفية. (تعرف على المعرفة الأساسية لـ IOC و MyBatis و SpringMVC وتكوين بيانات النموذج وتحميل الملفات وما إلى ذلك)
2. يرسل الخادم رسائل البريد الإلكتروني بشكل غير متزامن إلى المستخدم المسجل. (تعلم قائمة انتظار الرسائل)
3. تسجيل الدخول المستخدم. (تعلم ذاكرة التخزين المؤقت ، أمن الربيع)
4. آخرون.
دراسة وتلخيص ، وتحديث من وقت لآخر. بيئة المشروع هي intellij + spring4.
1. العمل التحضير.
1. إنشاء قاعدة بيانات وجداول في MySQL.
2. إنشاء مشروع WebApp Maven في Intellij.
(1) استيراد حزم التبعية المطلوبة في pom.xml.
<؟ xmlns = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion><groupid> com.everseeker</groupid><artifactid> register </artifactid><packagaging> = packing> webapp </mame> <Url> http://maven.apache.org </url> <pretteries> <pring.version> 4.3.1.Release </spring.version> </sperties> <reperencies> <!-SPRING CORE ، Context-> <reperency> <roupend> org.springframework </rougiD> <artifactid> spring-context </artifactId> <splection> $ {spring.version} </version> </remebency> <redency> <roupiD> org.springframework </rougeid> <artifa CTID> spring-context-support </shintifactid> <sophy> $ {spring.version} </version> </reperence> <redence> <roupiD> org.springframework </rougiD> <Stifactid> Spring-core </stifactid> <splent> $ {spring.version} </ve RSION> </reperency> <reperency> <roupiD> org.springframework </rougeid> <StifactID> beans Spring SPRING </STIFACTID> <الإصدار> $} tifactid> junit </stifactid> <الإصدار> 4.12 </version> <!-<scope> اختبار </scope>-> </rEPONENCENT> <REPERENCY> <LOUREID> org.springframework </rougiD> <StifactID> اختبار الزنبرك </attifactid> <الإصدار> $} rsion> </repreadency> <!-springmvc-> <reperency> <roupiD> org.springframework </rougiD> <ChintifactId> Spring-Webmvc </stifactid> <splement> $ {spring.version} </version> </empendency> <prowerid> org.springfr Amework </rougiD> <StifactId> Spring-Web </stifactid> <الإصدار> $ {spring.version} </version> </sependency> <redence> <roupiD> javax.validation </groupId> <StifactId> التحقق من الصحة </attifactid> <splex> 1.1.fin AL </splement> </sependency> <redency> <roupiD> org.hibernate </groupID> <StifactId> Hibernate-validator </shintifactid> <sored> 5.2.4.final </version> </redence> <!-servlet-> <sependency> <roupax.servlet < /groupId><artifactid> javax.servlet-api</artifactid><version> MyBatis-> <reperency> <roupiD> org.springframework </rougeid> <StifactId> spring-jdbc </shintifactid> <splection> $ {spring.version} </version> </repreadency> <sropency> <roupiD> mysql </groupiD> <tresifactid> mysql-connector-java </artifact </artifact </artifact </artifact </artifact </artifact </ المعرف> <الإصدار> 6.0.3 </version> </sependency> <reperency> <roupiD> org.mybatis </rougeid> <intifactid> mybatis </shintifactid> <sored> 3.4.1 </version> </respency> <reperency> <roupend> org.mybatis </rougeid> IfactId> <الإصدار> 1.3.0 </version> </sependency> <reperency> <roupiD> C3P0 </rougeid> <StifactId> c3p0 </stifactid> <sored> 0.9.1.2 </version> </rependency> </reperencies> <Tupanname> n> <rougiD> org.apache.maven.plugins </rougiD> <intifactid> maven-war-plugin </artifactId> <الإصدار> 2.2 </version> <figraction> <SailonMissingWebxMl> false </ishailonmissingwebxml> </simplation> </plugin> (2) هيكل دليل المشروع كما يلي:
2. MyBatis
1. تكوين المعلومات الأساسية لقاعدة بيانات MySQL.
# databasedb.mysql.driverclass = com.mysql.jdbc.driverdb.mysql.jdbcurl = jdbc: mysql: // localhost: 3306/register_notice؟ useUnicod 333db.minpoolsize = 10db.maxpoolsize = 100db.initialpoolsize = 20db.maxidletime = 60db.acquireincrement = 5db.maxStatements = 100db.idleConnecteTestPeriodiodiodioD = truedb.testconnectiononcheckout = falsedb.properties
2. تكوين mybatis.xml و spring-mybatis.xml.
<؟ الاسم المستعار-> <typealiases> <!-اختر واحدة من الطريقتين التاليتين. الطريقة 1: استخدم typealias لتعيين الأسماء المستعارة لفئة واحدة. -> <!-<typealias type = "com.everseeker.entity.user" alias = "user" /> --- الطريقة 2: استخدم الحزمة لتعيين الاسم المستعار لجميع الفئات أدناه الحزمة. القاعدة الافتراضية هي com.everseeker.entity.user على المستخدم ، وإزالة اسم الحزمة السابق. -> <package name = "com.everseeker.entity" /></typealiases></configuration> mybatis.xml<؟xml version = "1.0" isding = "utf-8"؟> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3 /schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xsi:schemalocation="http://www.sp Ringframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhtp://www.spring Framework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx/spring-tx.xsd">< !- يمكن تقديم ملف db.properties في هذا الملف أن يمكن العثور على القيمة المقابلة في التكوين اللاحق مثل $ {db.mysql.driverclass}-وإلا خطأ-> <سياق: موقع property-placeholder = "classpath: db.properties"/> <!-تكوين مصدر البيانات C3P0 له حزمان لفئة تنفيذ مصدر البيانات الشائعين ، واحد هو Apache DBCP (org.apache.commons.dbcp.basicdatasource) ، والآخر هو C3P0. -> <bean id = "dataSource" تدمير method = "close"> <property name = "driverClass" value = "$ {db.mysql.driverclass}" /> <property name = "jdbcurl" value = "$ {db.mysql.jdbcurl} /> <property name = "password" value = "$ {db.mysql.password}" /> <!-الحد الأدنى لعدد الاتصالات المحتفظ به في مجموعة الاتصال. -> <property name = "minpoolsize" value = "$ {db.minpoolsize}" /> <!-الحد الأقصى لعدد الاتصالات المحتفظ به في مجموعة الاتصال. الافتراضي: 15-> <property name = "maxpoolsize" value = "$ {db.maxpoolsize}" /> <!-يجب أن يكون عدد الاتصالات التي تم الحصول عليها أثناء التهيئة بين minpoolsize و maxpoolsize. الافتراضي: 3-> <property name = "initialPoolsize" value = "$ {db.initialpoolsize}" /> <!-الحد الأقصى لوقت الفراغ ، إذا لم يتم استخدامه في غضون 60 ثانية ، سيتم التخلص من الاتصال. إذا كان 0 ، فلن يتم التخلص منه أبدًا. الافتراضي: 0-> <property name = "maxidletime" value = "$ {db.maxidletime}" /> <!-عدد الاتصالات التي تم الحصول عليها بواسطة C3P0 في نفس الوقت عند استنفاد الاتصال في تجمع الاتصال. الافتراضي: 3-> <property name = "quiverIncrement" value = "$ {db.acquireincrement}" /> <!-يتم استخدام المعلمات القياسية لـ JDBC للتحكم في عدد المعدات المعدة التي تم تحميلها في مصدر البيانات. ولكن لأن عبارات Precache تنتمي إلى اتصال واحد بدلاً من تجمع الاتصال بأكمله. لذلك ، يتطلب تحديد هذه المعلمة النظر في العديد من العوامل. إذا كانت كل من MaxStatements و MaxStatementsperConnection 0 ، يتم إغلاق ذاكرة التخزين المؤقت. الافتراضي: 0-> <property name = "maxStatements" value = "$ {db.maxstatements}" /> <!-تحقق من جميع الاتصالات في تجمع الاتصال كل 60 ثانية. الافتراضي: 0-> <property name = "idleconnecteStperiod" value = "$ {db.idleConnecteTestPeriod}" /> <!-يحدد عدد المحاولات المتكررة بعد إعادة اتصال جديد من استعادة قاعدة البيانات. الافتراضي: 30-> <property name = "quiveretryattemps" value = "$ {db.acquiretryattempts}" /> <!-الحصول على اتصال سيؤدي إلى جميع مؤشرات الترابط في انتظار تجمع الاتصال للحصول على الاتصال لرمي استثناء. ومع ذلك ، لا يزال مصدر البيانات صالحًا ويستمر في محاولة الحصول على الاتصال في المرة التالية التي تتصل فيها GetConnection (). إذا تم تعيينه على TRUE ، فسيعلن مصدر البيانات أنه تم فصله وإغلاقه بشكل دائم بعد محاولات فاشلة للحصول على الاتصال. الافتراضي: false-> <property name = "breakafteracquirefailure" value = "$ {db.breakafteracquirefailure}" /> <!-للاستهلاك عالي الأداء ، يرجى استخدامه فقط عند الحاجة. إذا تم ضبطه على TRUE ، فسيتم التحقق من صلاحيته عند كل تقديم اتصال. يوصى باستخدام idleconnectionTestperiod أو AutomatictEstTable لتحسين أداء اختبار الاتصال. الافتراضي: false-> <property name = "testConnectionOncheckout" value = "$ {db.testConnectionOncheckout}"/> </bean> <!-الفرق بين myBatis configuration.classpath*، راجع المستند: http://blog.csdn.net/zl34503411/tails/9309393. فقط إرجاع المورد المطابق الأول. يوصى باستخدام classpath لمستند واحد يحدد المسار ؛ استخدم classpath*عند مطابقة المستندات المتعددة .--> <bean id = "sqlsessionfactory" p: datasource-ref = "datasource" p: configlocation = "classpath: mybatis.xml" p: mapperlocations = "classpath*: mapper /*mapper.xml" /> بحث. يمكن تحديد حزم متعددة. سيقوم MappersCannerConfigurer بمسح جميع فئات الواجهة (بما في ذلك الحالات الفرعية) ضمن الحزمة المحددة بواسطة BasePackage. إذا تم تعريفها في ملف رسم الخرائط SQL ، فسيتم تعريفها ديناميكيًا على أنها حبة زنبركية. -> <property name = "basePackage" value = "com.everseeker.dao" /> <property name = "sqlsessionfactorybeanname" value = "sqlsessionfactory" /> </bean> <!-تكوين مدير المعاملات ، باستخدام معاملات JDBC-> <Bean id = "TransactionManager" class = "org.springframework.jdbc.datasource.datasourcetransactionManager"> <property name = "dataSource" ref = "dataSource" /> </bean> <! بشكل افتراضي ، يتم استخدام مدير معاملات باسم TransactionManager تلقائيًا. من الصحيح من فئة الوكيل ، مما يشير إلى أن Spring سيفعل فئات الأعمال من خلال إنشاء فئات فرعية ، ويحتاج إلى إضافة مكتبة فئة Cglib.jar إلى ClassPath. -> <TX: معاملة المعاملة التي تعتمد على التعليقات التوضيحية = "TransactionManager" proxy-target-class = "true" /></beans>spring-mybatis.xml3. إنشاء فئة المستخدم وواجهة userDao.
مستخدم الفئة العامة {size (min = 32 ، max = 32 ، message = "يجب أن يكون uuid سلسلة 32 بت") معرف السلسلة الخاصة ؛ size (min = 1 ، max = 32 ، message = "يجب أن تكون طول الحساب بين 1-32-bit") التنسيق غير صحيح ") البريد الإلكتروني الخاص بالسلسلة الخاصة ؛ size (min = 11 ، max = 11 ، message =" طول رقم الهاتف المحمول هو 11 رقماً ") الهاتف المحمول الخاص بالسلسلة الخاصة ؛ التجديد الطويل الخاص ؛ المستخدم العام () {this.id = uuid.randomuid (). سلسلة الهاتف المحمول) {هذا (اسم المستخدم ، كلمة المرور ، البريد الإلكتروني ، الهاتف المحمول ، تاريخ جديد (). getTime ()) ؛} المستخدم العام (اسم المستخدم ، كلمة مرور السلسلة ، البريد الإلكتروني السلسلة ، الهاتف المحمول السلسلة ، التجديد الطويل) {this.id = uuid.randomuid (). البريد الإلكتروني ؛ this.cellphone = الهاتف المحمول ؛ هذا. setPassword (سلسلة كلمة مرور) {this.password = password ؛} السلسلة العامة getEmail () {return email ؛} public void seteMail (string email) {this.email = email ؛} السلسلة العامة getCellPhone () {return cellphone ؛} public void setCellphone (string cellphone) setRegdate (regdate long) {this.gdate = regdate ؛}@orgretridepublic string toString () {return "يتم تجاهل التعليقات مثل notnull و @notempty و size و email في user.java مؤقتًا وشرحها لاحقًا.
repositorypublic interface userDao {void adduser (مستخدم المستخدم) ؛ المستخدم getUserByuserName (اسم المستخدم usern) ؛}4. قم بإنشاء ملف تعيين usermapper.xml في دليل SRC/Main/Resources/Mapper لتنفيذ الأساليب في واجهة userDao. ملاحظة: *يجب وضع ملف mapper.xml في دليل SRC/Main/Resources ، وتم وضعه مسبقًا في دليل SRC/Main/Java/Com/Everseeker/DAO ، مما أدى إلى خطأ لا يمكن تفسيره.
<؟ Namespace = "com.everseeker.dao.userdao"> <resultmap id = "resultMapuser" type = "com.everseeker.entity.user"> </sultmap> <insert id = "adduser" parameterty = "user"> insert in ide ، username ، password ، emplow ، value ، #{username} ، #{password} ، #{email} ، #{cellphone} ، #{regdate}) </insert> <select id = "getUserByUsername" parametertype = "string" resultmap = "resultMapuser"> select * from username = {username} ثالثا. IOC
1. إنشاء حاوية IOC ، واستخدم طريقة التعليقات التوضيحية إلى RootConfig.java.
@configuration@componentscan (basepackages = {"com.everseeker"} ، excludeFilters = {@componentscan.filter (type = filtertype.custom ، value = rootConfig.WebPackage.clas يمتد WebPackage regexpatterntypefilter {public webpackage () {super (pattern.compile ("com //. Everseeker //. web")) ؛}}} configuration: يشير إلى أن هذه فئة التكوين.
componentscan: تمكين المسح الضوئي للمكون ، basepackages: الحزمة الأساسية التي يجب مسحها ضوئيًا. ExpludeFilters: لا تقم بالمسح الضوئي إذا كان المرشح يفي بظروف المرشح.
ImporTresource: تقديم ملف XML.
propertysource: تقديم ملفات الخصائص.
2. منذ إنشاء مشروع WebApp واستخدام springMVC ، فإن Surpatcherservlet هو جوهر. في إصدارات الربيع السابقة ، تم تكوينه بشكل عام في web.xml. في ربيع 4 ، يمكن تنفيذها في كود Java. webappinitializer.java.
الطبقة العامة webappinitializer يمتد ملخصية antractAntationConfigDispatcherservletInitializer {// الفئة الوراثة agrectAntAntationConfigDispatcherservletInitializer سوف تقوم تلقائيًا بتكوين Secresservlet و spring string context [] } ؛}/*** يتم استخدام فئة RootConfig لتكوين الفاصوليا في سياق التطبيق الذي تم إنشاؤه بواسطة contextloaderListener ،*على سبيل المثال ، repository ، service والمكونات الأخرى*/ @orterideprotected <؟> [] سياق التطبيق ، استخدم الفاصوليا المحددة في فئة تكوين WebConfig ، * يستخدم لتحميل الفاصوليا التي تحتوي على مكونات ويب ، مثل وحدات التحكم ، وعرض المحلات التحليلية وترتيب المعالجات ، controller ، @requestmapping ، إلخ. } ؛}@@OverRideProtected void contractionizeregister (servletregistration.dynamic registration) {// الحد من حجم الملف الذي تم تحميله إلى ما لا يزيد عن 2 ميجابايت ، يجب أن يتجاوز الطلب بأكمله 4M ، ويجب كتابة جميع الملفات التي تم تحميلها على disk. 4194304 ، 0) ؛}}3. إنشاء WebConfig.java.
@configuration@enablewebmvc@componentscan ("com.everseeker.web") فئة عامة webConfig يمتد webmvcConfigureRadapter {// تكوين JSP View ParserBeanpublic ViewResolver ViewResolver () {internalResourceViewResolver ReservieRsolver = New internalResourceViewResolver () ؛ ResourceViewResolver.setPrefix ("/web-inf/") multipartresolver () يلقي ioException {إرجاع New ForderServletMultiParTresolver () ؛} // تكوين الموارد الثابتة معالجة @overridepublic configuredefaultservlethandling (DefaultServleThandLerConfigurer configurbean: إعلان أن هذه الطريقة تنشئ مثيلًا للنوع والسجلات المطلوبة كحبة في سياق تطبيق الربيع.
ما سبق هو التفسير التفصيلي لتعلم الربيع ملاحظة 1 IOC ، التي قدمها المحرر ، لك ، محاولة استخدام التعليقات التوضيحية ورمز Java قدر الإمكان. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!