Изучение весны На практике конечной целью этой серии является завершение проекта, который реализует регистрацию пользователя и функцию входа в систему.
Ожидаемый базовый процесс заключается в следующем:
1. Зарегистрируйте веб -сайт пользователя, заполните имя пользователя, пароль, электронную почту и информацию о номере мобильного телефона и верните OK после того, как внесли его в базу данных в фоновом режиме. (Изучите базовые знания МОК, Mybatis, Springmvc, проверки данных формы, загрузки файлов и т. Д.)
2. Сервер отправляет электронные письма асинхронно зарегистрированному пользователю. (Узнайте очередь сообщений)
3. Пользовательский вход. (Кэш обучения, Spring Security)
4. Другие.
Изучите и суммируйте, и время от времени обновляйте. Проектная среда - IntelliJ + Spring4.
1. Подготовка работы.
1. Создайте базу данных и таблицы в MySQL.
2. Создайте проект Maven WebApp в IntelliJ.
(1) Импортируйте необходимые пакеты зависимостей в pom.xml.
<? xml version = "1.0" Encoding = "UTF-8"?> <Проект xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0. http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelversion>4.0.0.0</modelversion>образность> compauctionseeker</groupid>< Aartifactd> register</Artifactid> .Packaging>war<bagegaging> Maven WebApp </name> <url> http://maven.apache.org </url> <properties> <spring.version> 4.3.1.release </spring.version> </свойства> <Depertiencies> <!-Spring Core, Контекст-> <Depectident> <groupId> org.springframework </GroupId> <ArtifactId> Spring-Context </artifactid> <sersion> $ {Spring.version} </version> </depertive> <Dependency> <groupD> org.springframework </GroupId> <Artifa Ctid> Spring-Context-Support </artifactid> <sersion> $ {spring.version} </version> </regegindent> <depervice> <groupd> org.springframework </GroupId> <artifactid> Spring-core </artifactid> <sersion> $ {Spring.version} </ve rsion> </deperiancy> <dependency> <groupid> org.springframework </groupid> <artifactid> Spring-beans </artifactid> <sersion> $ {spring.version} </version> </repertive> <!-test-> <Dependency> <groupD> junit </GroupD> <AR tifactid> junit </artifactid> <sersive> 4.12 </version> <!-<Scope> test </scope>-> </depervice> <depervice> <groupid> org.springframework </GroupD> <artifactid> пружинный тест </artifactid> <sersion> $ {Spring.version} </ve rsion> </depertive> <!-Springmvc-> <depervice> <groupid> org.springframework </GroupId> <artifactid> spring-webmvc </artifactid> <sersion> $ {Spring.version} </version> </vehyed> <зависимость> <groupid> org.springfr amework </GroupId> <artifactid> Spring-web </artifactid> <sersion> $ {spring.version} </version> </ardestion> <DeyEdency> <groupId> javax.validation </GroupId> <ratifactid> valyation-api </artifactid> <sersion> 1.1.0.fin al </version> </resemency> <Depective> <groupId> org.hibernate </GroupId> <ArtifactId> hibernate-validator </artifactid> <sersive> 5.2.4.final </version> </deply> <!-Servlet-> <Dependency> <groupid> javax.servlet < /groupid>< artifactid> Javax.servlet-api</Artifactid><version>3.1.0,0,/Version></dePeendency><Dependency><groupid> Javax.servlet</groupid>< ArtifactId>jstl</ArtifactId><version>1.2</version> написаноээпендиация> mybatis-> <Depective> <groupId> org.springframework </GroupId> <strifactId> Spring-jdbc </artifactid> <serse> $ {spring.version} </version> </jependence> <Depective> <groupId> mySQL </GroupId> <strifactId> mySql-connector </artifact </artifact </artifact </artifact </artifact </artifact </artifact </artifact Id> <sersion> 6.0.3 </version> </vehysedure> <Dependency> <groupId> org.mybatis </GroupId> <strifactid> mybatis </artifactid> <serse> 3.4.1 </version> </argepact> <dependency> <groupid> org.mybatis </artifactid> mybatis-spring ifactid> <sersion> 1.3.0 </version> </dependency> <Dependency> <groupId> c3p0 </GroupId> <artifactid> c3p0 </artifactid> <sersion> 0.9.1.2 </version> </dependency> </dependenties> <buld> <finalname> java_config_web </finalname> <blicins> <buld> n> <groupid> org.apache.maven.plugins </GroupId> <ArtifactId> mavenwar-plugin </artifactid> <serse> 2.2 </версия> <configuration> <FableOnMissingWebxml> false </failOnmissingWebxml> </configuration> </plugin> </plugins> <//project> (2) Структура каталога проектов заключается в следующем:
2. mybatis
1. Настройте основную информацию базы данных MySQL.
# Databadeb.mysql.driverclass = com.mysql.jdbc.driverdb.mysql.jdbcurl = jdbc: mysql: // localhost: 3306/register_notice? Useunicode = rue & hareverencoding = utf-8 & ullowmultiqueries = truedb.mysql.user.sholdsmoding = utf-8 & AllingMultiqueries = truedB.MyScl.Ure.USRESR. 333db.minPoolSize = 10db.maxPoolSize = 100db.initialPoolSize = 20db.maxIdleTime = 60db.acquireIncrement = 5db.maxStatements = 100db.idleConnectionTestPeriod = 60db.acquireRetryAttempts = 30db.breakAfterAcquireFailure = truedb.testconnectionOncheckout = falsedb.properties
2. Настройте mybatis.xml и 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">конфигретинг> функции artyfiguration> псевдоним-> <TypeAliases> <!-Выберите один из следующих двух методов. Метод 1: Используйте Typealias, чтобы установить псевдонимы для одного класса. -> <!-<typealias type = "com.everseeker.entity.user" alias = "user" /> --- Метод 2: Используйте пакет для установки псевдонима для всех классов, под пакетом. Правило по умолчанию com.everseeker.entity.user установлено для пользователя и удалите предыдущее имя пакета. -> <name пакета = "com.everseeker.entity" /></typealiases></configuration> mybatis.xml<?xml version = "1.0" Encoding = "UTF-8"?> xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: contect = "http://www.springframework.org /schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xsi:schemalocation="http:/www.spw.spw.spw.spw. 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"><!-- Введение файла db.properties в этот файл может убедиться, что соответствующее значение можно найти в последующей конфигурации, такой как $ {db.mysql.driverclass}-в противном случае, если коллега напрямую загружает db.properties и Spring-mybatis.xml. Ошибка-> <Контекст: Property Placeholder location = "classPath: db.properties"/> <!-Конфигурация источника данных C3P0 имеет 2 общих пакета реализации источника данных, один-Apache DBCP (org.apache.commons.dbcp.basicdatasource), а другой-c3p0. -> <Bean Id = "DataSource" Dressome-method = "close"> <name = "DriverClass" value = "$ {db.mysql.driverclass}" /> <name = "jdbcurl" value = "$ {db.mysql.jdbcurl}" /> <name = "anust" value = "$" $ "$" $ "$" $ "$" $ "$" $ "$" $ "$" $ "$" $ "$" $ "db.mys xmys}" /> <valie = " /> <name = "password" value = "$ {db.mysql.password}" /> <!-минимальное количество соединений, оставленных в пуле соединений. -> <name = "minpoolsize" value = "$ {db.minpoolsize}" /> <!-Максимальное количество соединений, сохраняемых в пуле соединений. По умолчанию: 15-> <name = name = "maxpoolsize" value = "$ {db.maxpoolsize}" /> <!-Количество соединений, полученных во время инициализации, должно быть между minpoolsize и maxpoolsize. По умолчанию: 3-> <name = "initialPoolsize" value = "$ {db.initialPoolsize}" /> <!-Максимальное свободное время, если не используется в течение 60 секунд, соединение будет отброшено. Если это 0, это никогда не будет отброшено. По умолчанию: 0-> <name = "maxidletime" value = "$ {db.maxidletime}" /> <!-Количество соединений, полученных C3P0 в одно и то же время, когда соединение в пуле соединения исчерпано. По умолчанию: 3-> <name = "QuicireIncrement" value = "$ {db.acquireincrement}" /> <!-Стандартные параметры JDBC используются для управления числом подготовленных предприятий, загруженных в источник данных. Но потому что операторы Precache принадлежат одному соединению, а не весь пул соединений. Следовательно, установка этого параметра требует рассмотрения многих факторов. Если как максимум, так и MaxStatementsPerConnection 0, кэш закрыт. По умолчанию: 0-> <name = name = "maxstatements" value = "$ {db.maxstatements}" /> <!-Проверьте все соединения в пуле соединений каждые 60 секунд. По умолчанию: 0-> <name = "idleconnectionTestErtiod" value = "$ {db.idleconnectionTestPeriod}" /> <!-Определяет количество повторяющихся попыток после того, как новое соединение не удалось извлечь из базы данных. По умолчанию: 30-> <name = "acpireretryattempts" value = "$ {db.acquireretryattempts}" /> <!-Приобретение соединения приведет к тому, что все потоки ожидают, пока пул соединений заставит соединение, чтобы добавить исключение. Тем не менее, источник данных по -прежнему действителен и продолжает пытаться получить соединение в следующий раз, когда вы вызовите getConnection (). Если установить True, источник данных заявит, что он был отключен и навсегда закрыт после неудачных попыток получить соединение. По умолчанию: false-> <name = "breakafteracquirefailure" value = "$ {db.breakafteracquirefailure}" /> <!-Для высокого потребления производительности, пожалуйста, используйте его только при необходимости. Если установить True, его достоверность будет проверена при каждом представлении подключения. Рекомендуется использовать IdleConnectionTestEStEriod или AutomatictStable для повышения производительности тестирования подключения. По умолчанию: false-> <name = "testConnectionOncheckout" value = "$ {db.testConnectionOncheckout}" /> < /bean> <!-Разница между mybatis configuration.classpath и classpath*, см. Документ: http://blog.csdn.net/zl3450341/article/details/9306983.classpath только вернет первый соответствующий ресурс. Рекомендуется использовать ClassPath для одного документа, который определяет путь; Используйте ClassPath*При сопоставлении нескольких документов .--> <Bean id = "sqlSessionFactory" p: dataSource-ref = "dataSource" p: configlocation = "classpath: mybatis.xml" p: mapperlocations = "classpath*: mapper /*mapper.xml" /> <bean> <! Этот пакет будет искать. Можно указать несколько пакетов. MappersCannerConfigurer будет сканировать все классы интерфейса (включая подпакинги) в рамках пакета, указанного BasePackage. Если они были определены в файле отображения SQL, они будут динамически определены как пружинный фасоль. -> <name = name = "basepackage" value = "com.everseeker.dao" /> <name = "sqlSessionFactoryBeanName" value = "sqlSessionFactory" /> < /bean> <!-Конфигурация менеджера транзакций, использование транзакций JDBC-> <Bean id = "TransactionManager" class = "org.springframework.jdbc.datasource.datasourcetransactionmanager"> <name = "dataSource" Ref = "DataSource" /> < /bean> <!- Аннотация использования для определения транзакций и процессов, отмеченных @TransActionAl Annotation, чтобы соответствовать аспектам управления транзакциями. По умолчанию менеджер транзакций с именем TransactionManager используется автоматически. Proxy-Target Class верен, что указывает на то, что Spring будет прокси-бизнес-классы за счет создания подклассов, и необходимо добавить библиотеку классов Cglib.jar в класс. -> <TX: Annotation, управляемая транзакцией-manager = "transactionManager" Proxy-Class = "true" /></beans> spring-mybatis.xml3. Создайте пользовательский класс и интерфейс userdao.
Пользователь открытого класса {@size (min = 32, max = 32, message = "uuid должен быть 32-разрядной строкой") частной строки; @Size (min = 1, max = 32, message = "Длина учетной записи должна быть между 1-32-битным") приватное строковое имя; Формат неверен ") Private String Email; @Size (min = 11, max = 11, message =" Длина номера мобильного телефона составляет 11 цифр ") частный строковый сотовой телефон; частный длинный regdate; public user () {this.id = uuid.randomuuid (). tostring (). Строка restrane (strase stresser at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at erernate = sporname as publicer Email, String Complone) {this (имя пользователя, пароль, электронная почта, мобильный телефон, новый date (). gettime ());} public user (String username, String Password, String Email, String Complone, Long Regdate) {this.id = uuid.randomuuid (). toString (). replaceAlll ("-", ","); Email; this.cellphone = complone; this.regdate = regdate;} public String getId () {return id;} public void setId (String id) {this.id = id;} public String getUsernam SetPassword (String Password) {this.password = password;} public String getEmail () {return Email;} public void setEmail (string email) {this.email = email;} public String getCellPhone () {return complone;} public void setcellphone (string complephone) {this.cellphone = publicphone;} public getGdate (string rEgphone) {regnate) setRegdate (long regdate) {this.regdate = regdate;}@overridepublic string toString () {return "[user: id =" + id + ", username =" + username + ", password =" + password + ", email =" + email + ", мобильный телефон =" + cellphone + ", regdate =" + ".Такие комментарии, как @notnull, @notempty, @size и @email in user.java, временно игнорируются и объясняются позже.
@RepositoryPublic interface userdao {void Adduser (пользователь пользователя); user getUserbyusername (String username);}4. Создайте файл отображения usermapper.xml в каталоге SRC/Main/Resources/Mapper, чтобы реализовать методы в интерфейсе userDao. Примечание. *Файл mapper.xml должен быть размещен в каталоге SRC/Main/Resources, и ранее был размещен в каталоге SRC/MAIN/JAVA/COM/Everseeker/DAO, что привело к необъяснимой ошибке.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> mapper.org/dtd/mybatis-3-mapper.dtd"> mapper. namespace = "com.everseeeker.dao.userdao"> <resultmap id = "resultmapuser" type = "com.everseeker.entity.user"> </resultmap> <INSERT ID = "AddUser" ParameterType = "Пользователь"> Вставьте в пользователь (ID, USERNAME, Pally, Epletser, REGDATE) Значения (#идентификато #{username}, #{password}, #{email}, #{мобильный телефон}, #{regdate}) </insert> <select id = "getUserbyusername" parametertype = "string" resultmap = "resultmapuser"> select * us unsermer = #usernam Iii. МОК
1. Создайте контейнер IOC и используйте метод аннотации для rootconfig.java.
@Configuration@componentscan (basepackages = {"com.everseeker"}, excludefilters = {@componentscan.filter (type = filtertype.custom, value = rootconfig.webpackage.class)})@importresource ({"classpagt: spring-mybatis.class. Класс WebPackage Extends RegexPatterntyPefilter {public webpackage () {super (pattern.compile ("com //. everseeker //. web"));}}} @Configuration: указывает, что это класс конфигурации.
@Componentscan: включить сканирование компонентов, базовые пакет: базовый пакет, который необходимо сканировать. ExclideFilters: не сканируйте, если фильтр соответствует условиям фильтра.
@ImporTresource: ввести XML -файл.
@PropertySource: ввести свойства файлов.
2. Поскольку создается проект WebApp и используется SpringMVC, DispatcherServlet является ядром. В предыдущих весенних версиях это обычно было настроено в web.xml. Весной 4 он может быть реализован в коде Java. Webappinitializer.java.
Public Class WebAppinitializer расширяет AbstractAnnotationConfigDispatcherServlectInitializer {// Класс, унаследовавший AbstractAnnotationConfigDispatcherServlectinitializer, автоматически настраивает контекст DispatcherServlet и Spring @OverrideProtected String [] getServletMappings () {// Карта DispatcherSvelt to "/" return String string () {//""/"return String () {/" Map the DispatcherSvelt to };}/*** Класс rootconfig используется для настройки бобов в контексте приложения, созданном ContectlectLoaderListener,*Например, @Repository, @Service и другими компонентами*/ @overdeProted Class <?> [] GetRootConfigclass () {return new Class <?> [] Rootconfig.class}; Используйте бобы, определенные в классе конфигурации WebConfig, * используется для загрузки бобов, содержащих веб -компоненты, такие как контроллеры, просмотр анализаторов и сопоставления процессоров, @Controller, @Requestmapping и т. Д. CumentizereGistration (ServletRegistration.dynamic Registration) {// Ограничение загруженного размера файла не более 2 МБ, весь запрос не превышает 4M, и все загруженные файлы должны быть записаны в Disk Registration.SetMultipartConfig (new MultipartConfigement («/TMP/uptures», 209152, 41943304330433043304330433043304304330 гг.3. Создать webconfig.java.
@Configuration@enablewebmvc@componentscan ("com.everseeeker.web") открытый класс webconfig extends webmvcconfigureradapter {// configure jsp view parser @beanpublic viewresolver = InternalResourceViewResolver ();; resourceViewResolver.setPrefix ("/web-inf/vision/"); resourceviewResolver.setsuffix (". Jsp"); resourceViewResolver.setExposeContextBeansAsattributes (true); returneRpeviewRevelver; Multipartresolver Multipartresolver () Throws ioException {return new new StarndServletMultiparTresolver ();} // Настройка обработки статических ресурсов @OverridePublic void configuredEfauldervLethandling (defauldervalethandLerconfure configure) {configururer.enable ();}}}}}}}}}@Bean: Объявление этого метода создает экземпляр желаемого типа и регистрируется в качестве боба в контексте весеннего приложения.
Выше приведено подробное объяснение Spring Learning Note 1, IOC, представленное редактором, для вас, попытайтесь максимально использовать аннотации и код Java. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!