Apprentissage du printemps dans la pratique, l'objectif ultime de cette série est de terminer un projet qui met en œuvre la fonction d'enregistrement et de connexion des utilisateurs.
Le processus de base attendu est le suivant:
1. Enregistrez le site Web de l'utilisateur, remplissez le nom d'utilisateur, le mot de passe, le courrier électronique et les informations de numéro de téléphone mobile et retournez OK après les déposer dans la base de données en arrière-plan. (Apprenez les connaissances de base du CIO, MyBatis, SpringMVC, Vérification des données du formulaire, téléchargement de fichiers, etc.)
2. Le serveur envoie des e-mails de manière asynchrone à l'utilisateur enregistré. (Apprenez la file d'attente de messages)
3. Connexion de l'utilisateur. (Cache d'apprentissage, sécurité du printemps)
4. D'autres.
Étudiez et résumez et mettez à jour de temps en temps. L'environnement du projet est IntelliJ + Spring4.
1. Travail de préparation.
1. Créez une base de données et des tables dans MySQL.
2. Créez un projet Maven WebApp dans Intellij.
(1) Importer les packages de dépendance requis dans pom.xml.
<? xml version = "1.0" Encoding = "UTF-8"?> <Projet xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "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>gister</artifactid><packaging>war</packaging><version>1.0</version> Maven webapp </name> <url> http://maven.apache.org </url> <properties> <printemps.version> 4.3.1.release </spring.version> </ properties> <dépendants> <! - Core Spring, Spring, Context -> <Dependency> <proupId> org.springFramework </prowpingId> <ArtifActid> printemps-context </ artifactId> <DERSE> $ {printemps.version} </ version> </dependency> <dependency> <proupId> org.springframework </proupId> <artifa> CTID> Spring-Context-Support </ ArtifactId> <Dersion> $ {Spring.Version} </DERNIFRIENT> </DENDENCENCE> <Dependance> <GroupId> Org.SpringFramework </proupId> <ArtifActid> Spring-core </ Arfactive> <Dersion> $ {Spring.Version} </VE RSION> </ Dependency> <Dedency> <GroupId> org.springFramework </rom grouped> <ArtifactId> Spring-Beans </Retifactid> <DERNÉRATION> $ {Spring.Version} </prepwred> </Dependency> <! - Test -> <dependency> <proupId> JUNIT </proupId> <Arncy> <! TifactId> JUnit </ artifactid> <version> 4.12 </ version> <! - <Scope> Test </cope> -> </ Dependency> <Dependency> <ProupId> org.springFramework </proupId> <ArtifActid> Spring-test </ artifactid> <version> $ {Spring.Version} </eve RSION> </ Dependency> <! - Springmvc -> <dependency> <proupId> org.springFramework </proncId> <Artifactid> Spring-webmvc </lefactive> <De version> $ {Spring.SpringFrFrFr </DERNIFRESSE> </DENDENCENCE> <Dedendency> <proupId> ORG.SPRINGFRFFR> </ Version> AMEWork </rompuprid> <Artifactid> printemps-web </ artifactid> <in version> $ {printemps.Version} </ version> </dependency> <dependency> <proupId> javax.validation </proupId> <RetingActid> validation-api </ artifactid> <version> 1.1.0.fin al </-version> </dependency> <dependency> <proupId> org.hibernate </romp grouped> <Artifactid> Hibernate-Validator </ ArfactId> <De version> 5.2.4.4.Final </ version> </ Dependency> <! - Servlet -> <Dedency> <ProupId> Javax.Servlet <! /groupId><artifActid>javax.servlet-api</artifactid><version>3.1.0</version></dependency><Denpendency><groupId>javax.servlet</groupId><artifactid>jstl</artifactid>< Version>1.2</version></dependence><! MyBatis -> <dependency> <proupId> org.springframework </rom groupeid> <Artifactid> printemps-jdbc </ artifactid> <version> $ {printemps.version} </-version> </ dépendance> <dependency> <proupId> MySql </prounid> <Artifactid> Mysql-Connector-Java </ Artifact> Mysql-Connector-Java </ Artifact> Mysql-Connector-Java </ Artifact> Mysql-Connector-Java </ Artifact> Mysql-Connector-Java </ Artifact> MysQL-Connector-Java </ Artifact> Mysql-Connector-Java </ Artifact> Mysql-Connector-Java </ ARTIFACT> Id> <version> 6.0.3 </ version> </ dépendance> <dependency> <proupId> org.mybatis </prôdId> <Artifactid> Mybatis </retifactid> <in version> 3.4.1 </prètement> </Dedency> <Dedency> <ProupId> Org.mybatis </proupId> <ArtifActid> Mybatis-Spring </ Artory ifactid> <version> 1.3.0 </ version> </ dépendance> <dependency> <proupId> C3p0 </prôdId> <ArtifActid> C3p0 </ ArtifactId> <Dersion> 0.9.1.2 </ Version> </Dendency> </Detences> <Duild> <FinalName> Java_Config_web </INALNAME> N> <ProupId> org.apache.maven.plugins </prôdId> <Artifactid> Maven-War-Plugin </Retifactid> <Dersion> 2.2 </ Version> <FIFIGIFING> <CailOnMissingWebxml> False </ FailOnMissingWebxml> </FIGIGURATION> </KINGIN> </GLIGINS> (2) La structure du répertoire du projet est la suivante:
2. Mybatis
1. Configurez les informations de base de la base de données MySQL.
# Databasedb.mysql.driverclass = com.mysql.jdbc.driverdb.mysql.jdbcurl = jdbc: mysql: // localhost: 3306 / registre_notice? Useunicode = true & caractéristique = utf-8 & perteMulqueries = truedb.mysql.usère = rootdb.mysql.password = 333db.minpoolSize = 10db.maxpoolSize = 100db.InitialPoolSize = 20DB.MaxidleTime = 60DB.AcquireInCrement = 60DB.ACQUACQUIRESS = 100DB.idleConnectionTestperiod = 60DB.ACQUIREREMENTS = 100DB.IDLECECTION 30db.breakafteracquirefailure = truedb.testConnectionOncheckout = falsedb.properties
2. Configurez Mybatis.xml et Spring-Mybatis.xml.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype ConfigurationPublic "- // mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3config.dtd"><configuration> Alias -> <tyciases> <! - Choisissez l'une des deux méthodes suivantes. Méthode 1: Utilisez les typias pour définir des alias pour une seule classe. -> <! - <tycias type = "com.everseeker.entity.user" alias = "utilisateur" /> --- Méthode 2: Utilisez le package pour définir des alias pour toutes les classes sous le package. La règle par défaut est com.everseeker.entity.User est définie sur l'utilisateur et supprime le nom du package précédent. -> <package name = "com.everseeker.entity" /></typealiases></configuration>mybatis.xml<?xml version = "1.0" Encoding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" /schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xsi:schemocation="http://www.sp"xsi:schemocation="http://www.sp. ringframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.spring framework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!-- L'introduction du fichier db.properties dans ce fichier peut s'assurer que la valeur correspondante peut être trouvée dans la configuration suivante telle que $ {db.mysql.driverclass} - sinon, si un collègue charge directement db.properties et Spring-Mybatis.xml dans RootConfig. Erreur -> <contexte: propriété-placeholder location = "classPath: db.properties" /> <! - La configuration de la source de données C3P0 a 2 packages de classe d'implémentation de source de données communs, l'une est Apache DBCP (org.apache.commons.dbcp.basicDatasource), et l'autre est C3P0. -> <bean id = "dataSource" destrement-méthod = "close"> <propriété name = "driverclass" value = "$ {db.mysql.driverclass}" /> <propriété name = "jdbcurl" value = "$ {db.mysql.jdbcurl}" /> <propriété name = "user" value = "$ {db.mysqQune} /> <propriété name = "mot de passe" value = "$ {db.mysql.password}" /> <! - Le nombre minimum de connexions conservées dans le pool de connexions. -> <propriété name = "minpoolSize" value = "$ {db.minpoolsize}" /> <! - Le nombre maximum de connexions conservées dans le pool de connexions. Par défaut: 15 -> <propriété name = "maxpoolSize" value = "$ {db.maxpoolsize}" /> <! - Le nombre de connexions obtenues lors de l'initialisation doit être entre MinpoolSize et MaxpoolSize. Par défaut: 3 -> <propriété name = "initialPoolSize" value = "$ {db.initialpoolSize}" /> <! - Temps libre maximum, s'il n'est pas utilisé dans les 60 secondes, la connexion sera rejetée. S'il est 0, il ne sera jamais jeté. Par défaut: 0 -> <propriété name = "maxidleTime" value = "$ {db.maxidletime}" /> <! - Le nombre de connexions obtenues par C3P0 en même temps en même temps lorsque le pool de connexions dans le pool de connexions est épuisé. Par défaut: 3 -> <propriété name = "acquireIncrement" value = "$ {db.acquireIncrement}" /> <! - Les paramètres standard de JDBC sont utilisés pour contrôler le nombre de stades préparés chargés dans la source de données. Mais parce que les instructions pré-cache appartiennent à une connexion unique plutôt qu'à l'ensemble du pool de connexion. Par conséquent, la définition de ce paramètre nécessite de considérer de nombreux facteurs. Si les maxstations maximales et les maxstatementsPerConnection sont 0, le cache est fermé. Par défaut: 0 -> <propriété name = "maxstaxe" value = "$ {db.maxstatements}" /> <! - Vérifiez toutes les connexions dans le pool de connexions toutes les 60 secondes. Par défaut: 0 -> <propriété name = "idleConnectionTestPeriod" value = "$ {db.idleconnectiontestperiod}" /> <! - définit le nombre de tentatives répétées après qu'une nouvelle connexion n'a pas été récupérée de la base de données. Par défaut: 30 -> <propriété name = "acquerreetAtAmpts" value = "$ {db.acquireRetryTaTempts}" /> <! - L'acquisition d'une connexion provoquera tous les threads en attente du pool de connexion pour obtenir la connexion pour lancer une exception. Cependant, la source de données est toujours valide et continue d'essayer d'obtenir la connexion la prochaine fois que vous appelez getConnection (). Si elle est définie sur true, la source de données déclarera qu'elle a été déconnectée et clôturée en permanence après les tentatives infructueuses pour obtenir la connexion. Par défaut: false -> <propriété name = "BreakaFteracQuireFailure" value = "$ {db.breakafteracquirefailure}" /> <! - Pour une consommation de performances élevées, veuillez l'utiliser uniquement en cas de besoin. Si elle est définie sur true, sa validité sera vérifiée à chaque soumission de connexion. Il est recommandé d'utiliser IdleConnectionTestPeriod ou AutomaticTestable pour améliorer les performances des tests de connexion. Par défaut: false -> <propriété name = "TestConnectionOnCheckout" value = "$ {db.testConnectionOncheckout}" /> </ bean> <! - La différence entre Mybatis Configuration.classpath et Classpath *, référer au document: http://blog.csdn.net/zl3450341/article/dtails/9306333 ne renvoiera que la première ressource correspondante. Il est recommandé d'utiliser ClassPath pour un seul document qui détermine le chemin; Utilisez ClassPath * lors de la correspondance de plusieurs documents .--> <bean id = "SqlSessionFactory" P: DataSource-Ref = "DataSource" P: ConfigLocation = "ClassPath: Mybatis.xml" P: MAPPERLOCATIONS = "CLASSPATH *: MAPPER / * MAPPER.XML" Ce package sera recherché. Plusieurs packages peuvent être spécifiés. Le MAPPERSCANNERCONNIGURING analysera toutes les classes d'interface (y compris les sous-packages) sous le package spécifié par BasEpackage. S'ils ont été définis dans le fichier de mappage SQL, ils seront définis dynamiquement comme un haricot de printemps. -> <propriété name = "basepackage" value = "com.everseeker.dao" /> <propriété name = "sqlSessionFactoryBeanName" value = "sqlSessionFactory" /> </Ean> <! - Configuration du gestionnaire de transaction, en utilisant les transactions JDBC -> <Ean id = "TransactionManager" class = "org.springframework.jdbc.datasource.datasourcetransactionManager"> <propriété name = "dataSource" ref = "dataSource" /> </ank> <! - Utiliser l'annotation pour définir les transactions et les fèves de processus marquées avec @Transactional Annotation to weave des transactions de gestion des transactions. Par défaut, un gestionnaire de transactions nommé TransactionManager est automatiquement utilisé. La classe de cible proxy est vraie, indiquant que le printemps procurer les classes de commerce en créant des sous-classes et doit ajouter la bibliothèque de classe Cglib.jar au chemin de classe. -> <tx: Annotation-Driven Transaction-manager = "TransactionManager" Proxy-Target-Class = "true" /></beans>spring-mybatis.xml3. Créez une classe utilisateur et l'interface UserDao.
classe publique User {@Size (min = 32, max = 32, message = "uuid devrait être une chaîne 32 bits") ID de chaîne privée; @size (min = 1, max = 32, message = "la longueur du compte devrait être entre 1-32 bits") String Username; @Notempty (message = "ne peut pas être vide") Mot de passe privé; "Le format de messagerie est incorrect") Email de chaîne privées; @Size (min = 11, max = 11, message = "La longueur du numéro de téléphone mobile est 11 chiffres") Private String Phone; Private Long RegDate; Public User () {this.id = uuid.randomuuid (). String e-mail, chaîne de téléphonie cellulaire) {this (nom d'utilisateur, mot de passe, e-mail, téléphone portable, nouveau date (). GetTime ());} utilisateur public (nom d'utilisateur de chaîne, mot de passe de chaîne, courriel de chaîne, chaîne de téléphonie cellulaire, long régdate) {this.id = uuid.randomuuid (). ToString (). RepaceAnL ("," "); Mot de passe; this.email = e-mail; this.cellphone = cellulephone; this.regdate = regdate;} public String getID () {return id;} public void setid (String id) {this.id = id;} public String getUsername () {return userName;} public void seusername (string userName) {this.UserAm Mot de passe;} public void setPassword (chaîne mot de passe) {this.password = mot de passe;} public String getEmail () {return e-mail;} public void setemail (String e-mail) {this.email = email;} public String getcellphone () {return cellphone;} public void setcellphone (String Cellphone) {this.Cellphone = Cell Phone;} public Long () {retour RegDate;} public void setRegDate (long regdate) {this.regdate = regdate;} @ overRidepublic String toString () {return "[user: id =" + id + ", username =" + username + ", mot de passe =" + mot de passe + ", email =" + e-mail + ", cellule =" + cellule + ", regdate =" + régdate + "+" + cellphone + ", RegDate =" + régdate + " "]";}} User.javaDes commentaires tels que @notnull, @Notempty, @size et @email dans user.java sont temporairement ignorés et expliqués plus tard.
@RepositoryPublic Interface userDao {void addUser (utilisateur utilisateur); utilisateur getUserByUserName (String Username);}4. Créez le fichier de mappage userMapper.xml dans le répertoire SRC / Main / Resources / Mapper pour implémenter les méthodes de l'interface UserDAO. Remarque: * Le fichier MAPPER.xml doit être placé dans le répertoire SRC / Main / Resources, et a été précédemment placé dans le répertoire SRC / Main / Java / Com / Everseeker / DAO, résultant en une erreur inexplicable.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mappep Public "- // Mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><Mapper namespace = "com.everseeker.dao.userdao"> <résultatmap id = "resultemapuser" type = "com.everseeker.entity.user"> </sectmap> <insert id = "addUser" ParameterType = "user" # {nom d'utilisateur}, # {mot de passe}, # {e-mail}, # {téléphone portable}, # {RegDate}) </sert> <select id = "GetUserByUserName" ParameterType = "String" ResultMap = "ResultMapuser"> SELECT * parmi l'utilisateur où username = # {username} </lect> </preper> user. Iii. CIO
1. Créez un conteneur IOC et utilisez la méthode d'annotation pour rootconfig.java.
@ Configuration @ ComponentsCan (basepackages = {"com.everseeker"}, exclusionfilters = {@ componentscan.filter (type = filterType.custom, value = rootconfig.webpackage.class)}) @ importreSource ({"classpath: Spring-Mybatis.xml"}) CROODCONFIG {CLASSPATH: Spring-Mybatis.xml "}) PublicConconfig {ClassPath: Spring-Mybatis. WebPackage étend RegexPatterNTyPeFilter {public webPackage () {super (pattern.compile ("com //. Everseeker //. Web"));}}} @Configuration: indique qu'il s'agit d'une classe de configuration.
@ComponentScan: Activer la numérisation des composants, BasEpackages: le package de base qui doit être analysé. Exclusionfilters: Ne scannez pas si le filtre remplit les conditions du filtre.
@ImportResource: introduire le fichier XML.
@Propertysource: introduire des fichiers de propriétés.
2. Étant donné que le projet WebApp est créé et que SpringMVC est utilisé, le DispatcherServlet est le noyau. Dans les versions du printemps précédentes, il a été généralement configuré dans web.xml. Au printemps 4, il peut être implémenté dans Java Code. WebAppinializer.java.
classe publique WebAppinitializer étend AbstractannotationConfigDispatcherServleTinitializer {// La classe héritée de AbstractannotationConfigDispatcherServleTitializer configurera automatiquement le contexte de DispatterServlet et Spring le Dispatchersserv. };} / *** La classe RootConfig est utilisée pour configurer les beans dans le contexte de l'application créés par ContextLoaderListener, * par exemple, @Repository, @Service and Other Components * / @ OverRideProtected Class <?> [] GetrootConfigClass () {Return New Class <?> [] {RootCon.Class};} / *** lorsque les Dispatters sont les disposières. Context, Utilisez des haricots définis dans la classe de configuration WebConfig, * est utilisé pour charger des haricots contenant des composants Web, tels que les contrôleurs, les analyseurs de vue et les mappages de processeurs, @Controller, @Requestmapping, etc.*/@overrideProtected Class };}@Overrideprotected void customizeRegistration(ServletRegistration.Dynamic registration) {//Limit the uploaded file size to no more than 2MB, the entire request does not exceed 4M, and all uploaded files must be written to disk registration.setMultipartConfig(new MultipartConfigElement("/tmp/uploads", 2097152, 4194304, 0));}}3. Créez webconfig.java.
@ Configuration @ activerwebmvc @ componentscan ("com.everseeker.web") La classe publique WebConfig étend webmvcConfigurerAdapter {// configurer jsp View Parser @BeanPublic ViewResolver ViewResolver () {InternalResourceViewResolver RourceEVeReSolver = New InternalResourceViewResolver (); ResourceViewResolver.SetPrefix ("/ Web-Inf / Views /"); ResourceViewResolver.Setsuffix (". JSP"); ResourceViewResolver.SetExposeContextBeanSaSattributes (True); Return ResourceViewResolver;} // Configurer le multiparte MultipartResolver () lève IOException {return new StandardServletMultipArtResolver ();} // Configurer le traitement des ressources statiques @OverridePublic void ConfiguredEfaultServertHandling (defaultServertHandlerConfigurer configure) {configurer.enable ();}}}@Bean: Déclarer cette méthode crée une instance du type souhaité et enregistre en tant que bean dans le contexte d'application de printemps.
Ce qui précède est l'explication détaillée de Spring Learning Note 1, IOC, introduit par l'éditeur, à vous, essayez d'utiliser autant que possible les annotations et le code Java. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!