Das letztendliche Ziel dieser Serie ist es, ein Projekt zu vervollständigen, das die Registrierung und Anmeldefunktion der Benutzer implementiert.
Der erwartete Grundprozess ist wie folgt:
1. Registrieren Sie die Benutzerwebsite, geben Sie den Benutzernamen, das Kennwort, die E -Mail- und Mobiltelefonnummer ein und kehren Sie nach der Einzahlung in der Datenbank im Hintergrund OK zurück. (Erfahren Sie die Grundkenntnisse von IOC, MyBatis, SpringMVC, Formulardatenüberprüfung, Datei -Upload usw.)
2. Der Server sendet E -Mails asynchron an den registrierten Benutzer. (Lernen Sie Nachrichtenwarteschlange)
3. Benutzeranmeldung. (Lerncache, Frühlingssicherheit)
4. Andere.
Studieren und fassen Sie von Zeit zu Zeit zusammen und aktualisieren Sie. Die Projektumgebung ist Intellij + Spring4.
1. Vorbereitungsarbeit.
1. Erstellen Sie Datenbank und Tabellen in MySQL.
2. Erstellen Sie ein Maven WebApp -Projekt in Intellij.
(1) Importieren Sie die erforderlichen Abhängigkeitspakete in pom.xml.
<? xml Version = "1.0" coding = "utf-8"?> <Project 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> Everseeker</groupid><ArtIDId></artifactid><packung><packGharning><packung><packing><packing><packung>< <version><packing><packung>< <version><packung><packung><packing>< <version><packung>< <version><packung><packung>< <version> <version Maven WebApp </name> <URL> http://maven.apache.org </url> <properties> <spring.version> 4.3.1.Release </spring.version> </properties> <abhängigenzen> <!-Spring Core, CONTEXT-> <DEeichnen> <GroupID> org.springFramework </Groupid> <artifactId> Spring-Context </artifactId> <version> $ {Spring.version} </Version> </abhängig> <depelzus> <gruppe> org.springFramework </GroupId> <artifa CTID> Spring-Context-Support </artifactId> <version> $ {Spring.version} </Version> </abhängig> <depeopcy> <gruppe> org.springFramework </Groupid> <artifactid> Spring-Core </artifactID> <version> $ {veversion} </ve RSION> </abhängig> <depeaponcy> <GroupId> org.springFramework </Groupid> <artifactId> Spring-Beer </artifactId> <version> $ {Spring.version} </Version> </abhängig> <!-test-> <depectIncy> <gruppe> junit </Groupid> <ar TifactID> junit </artifactId> <version> 4.12 </Version> <!-<Scope> test </scope>-> </abhängig> <depeopecy> <gruppe> org.springFramework </Groupid> <artifactid> Spring-Test </artifactID> <version> $ {spring.version} </ve RSION> </abhängig> <!-SpringMVC-> <Depopentcy> <gruppe> org.springFramework </Groupid> <artifactid> Spring-webmvc </artifactid> <version> $ {Spring.version.version} </Version> </abhängig> <Diefency> <gruppe> rot AMEWork </GroupID> <artifactId> Spring-Web </artifactId> <version> $ {Spring.version} </Version> </abhängig> <depeaponcy> <gruppe> javax.validation </Groupid> <artifactid> validierung-api </artifactId> <version> 1.1.1.0.fin Al </Version> </abhängig> <depeopcy> <GroupId> org.hiNNTE </GroupId> <artifactId> hibernate-Validator </artifactId> <version> 5.2.4.Final </Version> </abhängig> <!-Servlet-> <Deponcy> <Gruppe> Javax.Servlet < /groupId><ArtifactId>javax.servlet-api</artifactid><VERSION >3.1.0</version></dependency><Dependency> <groupid>javax.servlet</groupid><ArtifactId>jstl</artifactIveration>< •- & mysk> < MyBatis-> <De vorstellen> <GroupId> org.springFramework </GroupId> <artifactId> Spring-Jdbc </artifactId> <version> $ {Spring.version} </Version> </abhängig> <abhängig> <GroupId> MySQL </gruppe <artifactid> mysql-connector- ID> <version> 6.0.3 </Version> </abhängig> <depeopcy> <gruppe> org.mybatis </GroupId> <artifactId> mybatis </artifactId> <version> 3.4.1 </Version> </abhängig> <Depopact> <gruppe </art ifactID> <version> 1.3.0 </Version> </abhängig> <depeopcy> <gruppe> c3p0 </Groupid> <artifactID> c3p0 </artifactID> <version> 0.9.1.2 </Version> </abhängig> </abhängig> <build> <finanzname> java_config_web </abhunge> <plugins> </finalname n><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.2</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins></build></project> (2) Die Projektverzeichnisstruktur lautet wie folgt:
2. Mybatis
1. Konfigurieren Sie die grundlegenden Informationen der MySQL -Datenbank.
# DatabasedB.mysql.driverClass = com.mysql.jdbc.driverdb.mysql.jdbcurl = jdbc: mysql: // localhost: 3306/register_notice? UseUnicode = true & charakterencoding = utf-8 & duldMulsMysql.smysql.smysql.Smultiqueries = TruteB.Mysql.Smysql. = 333db.minpoolSize = 10db.maxpoolSize = 100db.initialPoolSize = 20db.maxidletime = 60 db.acquireIncrement = 5db.Maxstatements = 100db.IdleconnectionTeTeTeTPeriod = 60DB.Acquireretremption = 30DB.BreakfaTraPerioNiods = 30DB.BreakfaTrakaRaVeStatements = 30DB.BreakfaTrakaRaVeStatements = 30db.BreakafterIgaSpectaPlace = 30db.BreakafteraThb.AcquireretryPents = 30db.Breakafteriods truedb.TestConnectionOneCheckout = falssedb.Properties
2. Konfigurieren Sie mybatis.xml und fing-mybatis.xml.
<? alias-> <typealiases> <!-Wählen Sie eine der folgenden zwei Methoden. Methode 1: Verwenden Sie Typen, um Aliase für eine einzelne Klasse zu setzen. -> <!-<typealias type = "com.everseeker.entity.user" alias = "user" /> --- Die Standardregel lautet com.everseeker.entity.User wird auf den Benutzer eingestellt und entfernen Sie den vorherigen Paketnamen. -> <package name = "com.everseeker.entity" /></typealiases></configuration>mybatis.xml<?xml Version = "1.0" coding = "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 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"><!- Wenn Sie die Datei db.Properties in diese Datei einführen, kann sichergestellt werden, dass der entsprechende Wert in der nachfolgenden Konfiguration wie $ {db.mysql.driverclass} gefunden werden kann. Andernfalls lädt ein Kollege direkt DB.Properties und Spring-Mybatis.xml. ERROR-> <CONTEXT: Eigenschafts-Placeholder-Standort = "ClassPath: DB.Properties"/> <!-Datenquellenkonfiguration C3P0 hat 2 gemeinsame Datenquellen-Implementierungsklassenpakete, einer ist Apache dbcp (org.apache.commons.dbcp.basicdataSource) und der andere ist C3P0. --><bean id="dataSource"destroy-method="close"><property name="driverClass" value="${db.mysql.driverClass}" /><property name="jdbcUrl" value="${db.mysql.jdbcUrl}" /><property name="user" value="${db.mysql.user}" /> <Eigenschaft name = "password" value = "$ {db.mysql.password}" /> <!-Die minimale Anzahl der im Verbindungspool erhaltenen Verbindungen. -> <Eigenschaft name = "minpoolsize" value = "$ {db.minpoolsize}" /> <!-Die maximale Anzahl der im Verbindungspool aufbewahrten Verbindungen. Standard: 15-> <Eigenschaft name = "maxpoolsize" value = "$ {db.maxpoolsize}" /> <! Standard: 3-> <Eigenschaft name = "initialPoolSize" value = "$ {db.initialpoolsize}" /> <!-Maximale Freizeit, wenn nicht innerhalb von 60 Sekunden verwendet wird, wird die Verbindung verworfen. Wenn es 0 ist, wird es niemals verworfen. Standard: 0-> <Eigenschaft name = "maxidletime" value = "$ {db.maxidletime}" /> <! Standard: 3-> <Eigenschaft name = "AccireIncrement" value = "$ {db.acquireIncrement}" /> <!-Die Standardparameter von JDBC werden verwendet, um die Anzahl der in der Datenquelle geladenen Vorbereitungsstatus zu steuern. Aber weil Precache -Anweisungen eher zu einer einzelnen Verbindung als zu dem gesamten Verbindungspool gehören. Das Festlegen dieses Parameters erfordert daher viele Faktoren. Wenn sowohl MaxStatements als auch MaxstatementsPerConnection 0 sind, ist der Cache geschlossen. Standard: 0-> <Eigenschaft name = "maxstatements" value = "$ {db.maxStatements}" /> <!-Überprüfen Sie alle Verbindungen im Verbindungspool alle 60 Sekunden. Standard: 0-> <Eigenschaft name = "idleconnectionTestPeriod" value = "$ {db.idleconnectionTestPeriod}" /> <!-Definiert die Anzahl der wiederholten Versuche, nachdem eine neue Verbindung nicht aus der Datenbank abgerufen wurde. Standard: 30-> <Eigenschaft name = "accocireretryattempts" value = "$ {db.acquireretryattemptes}" /> <!-Die Erfassung einer Verbindung führt dazu, dass alle Threads darauf warten, dass der Verbindungspool die Verbindung erhält, um eine Ausnahme zu werfen. Die Datenquelle ist jedoch weiterhin gültig und versucht weiterhin, die Verbindung beim nächsten Aufruf von GetConnection () zu erhalten. Wenn die Datenquelle auf TRUE eingestellt ist, erklärt sie, dass sie nach fehlgeschlagenen Versuchen, die Verbindung zu erhalten, getrennt und dauerhaft geschlossen wurde. Standard: false-> <Eigenschaft name = "BreakAfteracquireFailure" value = "$ {db.breakAfteracquireFailure}" /> <!-Für hohen Leistungsverbrauch verwenden Sie ihn bitte nur bei Bedarf. Wenn er auf TRUE eingestellt ist, wird seine Gültigkeit bei jeder Anschlussübermittlung überprüft. Es wird empfohlen, IdleConnectionTestPeriod oder automaticTesttable zu verwenden, um die Leistung von Verbindungstests zu verbessern. Default: false --><property name="testConnectionOnCheckout" value="${db.testConnectionOnCheckout}" /></bean><!-- The difference between myBatis configuration.classpath and classpath*, refer to the document: http://blog.csdn.net/zl3450341/article/details/9306983.classpath will Geben Sie nur die erste passende Ressource zurück. Es wird empfohlen, ClassPath für ein einzelnes Dokument zu verwenden, das den Pfad bestimmt. Verwenden Sie CLASSPATH*, wenn Sie mehrere Dokumente abgleichen .--> <bean id = " Paket wird durchsucht. Mehrere Pakete können angegeben werden. Der MapperscannerConfiger scannt alle Schnittstellenklassen (einschließlich Unterpackungen) unter dem von Basepackage angegebenen Paket. Wenn sie in der SQL -Mapping -Datei definiert wurden, werden sie dynamisch als Federbohnen definiert. -> <Eigenschaft name = "Basepackage" value = "com.everseeker.dao" /> <Eigenschaft name = "sqlSessionFactoryBeAnname" value = " id = "transactionManager" class = "org.springframework.jdbc.datasource.datasourcetransactionManager"> <Property name = "dataSource" ref = "dataSource" /> < /bean> <!- Verwenden Sie Annotation, um Transaktionen zu definieren und mit @transactional-Annotation Aspekte zu verarbeiten. Standardmäßig wird ein Transaktionsmanager namens TransactionManager automatisch verwendet. Die Proxy-Target-Klasse ist wahr, was angibt, dass Spring Proxy-Business-Klassen durch das Erstellen von Unterklassen Proxy-Business-Klassen wird und die CGGlib.Jar-Klassenbibliothek zum Klassenpfad hinzufügen muss. -> <tx: Annotationsgetriebene transaction-Manager = "TransactionManager" proxy-target-class = "true" /></beans>spring-mybatis.xml3. Erstellen Sie Benutzerklassen und Benutzerdao -Schnittstelle.
Public Class User {@Size (min = 32, max = 32, message = "uUid sollte eine 32-Bit-String sein") private String-ID; @size (min = 1, max = 32, Message = "Die Kontolänge sollte zwischen 1-32-Bit") private String-Benutzername; @notempty (Message = "-Kassel leer"). "E-Mail-Format ist falsch") Private String-E-Mail; @size (min = 11, max = 11, Message = "Die Länge der Handynummer beträgt 11 Ziffern") Private String-Handy; String-Handy) {this (Benutzername, Kennwort, E-Mail, Handy, neues Datum (). GetTime ());} public Benutzer (String-Benutzername, String-Passwort, String-E-Mail, String-Handy, langes Regdate) {this.id = UUID.RandomuUid (). email;this.cellphone = cellphone;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;}public String getPassword() {return password;}public void setPassword (String -Passwort) {this.password = password;} public String getemail () {return -E -Mail;} public void setemail (String -E -Mail) {this.email = E -Mail;} public String getCellphone () {return Handy return Handy;} public void setCellphone (String -Mobiltelefon) {this.cellphone = mobile;} öffentlicher Long -Get -Regdate () {{cellphone}; setRegdate (Long Regdate) {this.regdate = Regdate;}@oversidePublic String toString () {return "[Benutzer: id =" + id + ", userername =" + userername + ", password =" + password + ", E -Mail =" + E -Mail + ", Cellphone =" +} uswader.Kommentare wie @notnull, @notEmpty, @size und @email in user.java werden später vorübergehend ignoriert und erklärt.
@RepositoryPublic interface userDao {void adduser (Benutzer Benutzer); Benutzer getUserByUnername (String -Benutzername);};};V. HINWEIS: *Mapper.xml -Datei muss in das Verzeichnis SRC/Main/Ressourcen platziert werden und wurde zuvor in das Verzeichnis SRC/Main/Java/Com/Everseeker/DAO platziert, was zu einem unerklärlichen Fehler führte.
<? namespace = "com.everseeker.dao.userdao"> <resultMap id = "resultMapuser" type = "com.everseeker #{Passwort}, #{E -Mail}, #{Handy}, #{Regdate}) </insert> <select id = "getUserByUnername" parameterType = "String" resultmap = "resultmapuser"> select * from username III. IOC
1. Erstellen Sie einen IOC -Container und verwenden Sie eine Annotationsmethode, um RootConfig.java zu erhalten.
@Configuration@componentscan (basepackages = {"com.everseeker"}, excludeFilters = {@componentscan.filter (Typ = filterType.custom, value = rootconfig.webpackage.class.class)})@Importresource ({{"ClassPad: Spring-Mybatis.xm. Webpackage erweitert regexPatternTypeFilter {public webpackage () {super (mustertechnisch.comPile ("com //. Everseeker //. Web"));}}} @Configuration: Zeigt an, dass dies eine Konfigurationsklasse ist.
@Componentscan: Aktivieren Sie das Scannen von Komponenten, Basispackages: Das Basispaket, das gescannt werden muss. Ausschlussfilter: SCROCKEN SIE NICHT, wenn der Filter die Filterbedingungen erfüllt.
@ImporTresource: Einführung der XML -Datei.
@PropertySource: Einführung von Eigenschaftendateien.
2. Da das WebApp -Projekt erstellt und SpringMVC verwendet wird, ist der DispatcherServlet der Kern. In früheren Federversionen wurde es in der Regel in web.xml konfiguriert. Im Frühjahr 4 kann es im Java -Code implementiert werden. WebAppinitializer.java.
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { //The class inheriting AbstractAnnotationConfigDispatcherServletInitializer will automatically configure the DispatcherServlet and Spring application context @Overrideprotected String[] getServletMappings() { //Map the DispatcherServlet to "/"return new String[] { "/" };}/*** Die RootConfig -Klasse wird verwendet, um die Beans im Anwendungskontext zu konfigurieren, der von ContextloaderListener erstellt wurde. Kontext, Verwenden Sie Bohnen, die in der Webconfig -Konfigurationsklasse definiert sind. * Sie werden verwendet, um Bohnen mit Webkomponenten wie Controllern, Parsers und Prozessorzuordnungen zu laden, @Controller, @RequestMapping usw.. Void Customizeregistration (ServletRetRegistration.Dynamische Registrierung) {// Die hochgeladene Dateigröße auf nicht mehr als 2 MB beschränken, die gesamte Anfrage überschreitet nicht 4 m, und alle hochgeladenen Dateien müssen in die Diskregistrierung geschrieben werden.3. Erstellen Sie Webconfig.java.
@Configuration@enableWebmvc@componentscan ("com.everseeker.web") public class webconfig erweitert webmvcconFigurerAdapter {// JSP View Parser @BeanPublic ViewResolver ViewResolver () {InternalResOrceViewResolver ResourceViewresolver = new InternalResourceViewResolver (); ResourceViewResolver.setPrefix ("/web-inf/views/"); ResourceViewResolver.Setsuffix (". JSP"); ResourceViewResolver.setExposeContextbeanSasatTribute (true). @BeanPublic Multipartresolver multipartresolver () löscht ioException {Neue StandardsServletMultipartresolver () zurück@Bean: Das Deklarieren dieser Methode erstellt eine Instanz des gewünschten Typs und Register als Bean im Frühlingsanwendungskontext.
Das obige ist die detaillierte Erklärung von Spring Learning Note 1, IOC, die vom Herausgeber vorgestellt wurde, versuchen Sie, Anmerkungen und Java -Code so weit wie möglich zu verwenden. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!