실제로 Spring의 학습,이 시리즈의 궁극적 인 목표는 사용자 등록 및 로그인 기능을 구현하는 프로젝트를 완료하는 것입니다.
예상되는 기본 프로세스는 다음과 같습니다.
1. 사용자 웹 사이트를 등록하고 사용자 이름, 암호, 이메일 및 휴대폰 번호 정보를 작성하고 백그라운드의 데이터베이스에 입금 한 후 확인을 반환하십시오. (IOC, MyBatis, SpringMVC, Form Data Verification, File Upload 등의 기본 지식을 배우십시오.)
2. 서버는 이메일을 등록 된 사용자에게 비동기 적으로 보냅니다. (메시지 대기열 배우기)
3. 사용자 로그인. (학습 캐시, 스프링 보안)
4. 다른.
공부하고 요약하고 때때로 업데이트하십시오. 프로젝트 환경은 Intellij + Spring4입니다.
1. 준비 작업.
1. MySQL에서 데이터베이스 및 테이블을 만듭니다.
2. Intellij에서 Maven WebApp 프로젝트를 만듭니다.
(1) POM.XML에서 필요한 종속성 패키지를 가져옵니다.
<? xml 버전 = "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/pom/0.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <hodelversion>/modelversion> groupid>com.everseeker</groupid> artifactid> reger</artifactid><packaging</packagings Maven WebApp </name> <url> http://maven.apache.org </url> <properties> <spring.version> 4.3.1. Release </spring.version> </properties> <!-Spring Core, Context-> <pectionency> <groupId> org.springframework </groupid> <artifactid> spring-context </artifactid> <버전> $ {spring.version} </version> </dependency> <groupid> org.springframwork </groupid> <artifa CTID> Spring-Context-Support </artifactid> <버전> $ {spring.version} </version> </dependency> <pectionement> <groupid> org.springframework </groupId> <ArtifactID> 스프링 코어 </artifactid> <bersion> $ {spring.version} </ve rsion> </dependency> <pectinement> <groupId> org.springframework </groupid> <artifactid> spring-beans </artifactid> <버전> $ {spring.version} </version> <!-테스트-> <pection> <groupid> junit </groupid> <ar tifactid> junit </artifactid> <bersion> 4.12 </version> <!-<cope> test </scope>-> </fectionency> <pectionency> <groupid> org.springframework </groupid> <artifactid> string-test </artifactid> <버전> $ {spring.version} </ve rsion> </dependency> <!-SpringMVC-> <pectionement> <groupId> org.springframework </groupid> <artifactid> spring-webmvc </artifactid> <버전> $ {spring.version} </version> </dependency> <groupid> org.springfr Amework </groupid> <artifactid> spring-web </artifactid> <bersion> $ {spring.version} </version> </dependency> <pectiency> <groupid> javax.validation </groupid> <artifactid> validation-api </artifactid> <1.1.0.fin al </version> </dependency> <pectinement> <groupid> org.hibernate </groupid> <artifactid> Hibernate-Validator </artifactid> <bersion> 5.2.4. 4.final </version> </dependency> <!-servlet-> <fexendency> <groupid> javax.servlet < /groupid> artifactid> javax.servlet-api</artifactid> version> 3.1.0</version></delection> <dependency>< groupid> javax.servlet</groupid> artifactid> jstl</artifactid>< versionion>1.2</versionion>/depeloncy>/dectorty> <versention>/verstlency> aversion> <aversion> haversion> haversion> * artupactid> areversion> haversion> mybatis-> <pectionement> <groupid> org.springframework </groupid> <artifactid> spring-jdbc </artifactid> <version> $ {spring.version} </dependency> <pectionency> <groupid> mysql </groupid> <artifactid> mysql-connect-java </artifact id> <bersion> 6.0.3 </version> </dependency> <pectionement> <groupid> org.mybatis </groupid> <artifactid> mybatis </artifactid> <bersion> 3.4.1 </dependency> <pelection> <groupid> org.mybatis </groupid> <artifactid> mybatis spronat ifactid> <3.0 </version> </dependency> <pectionency> <groupId> c3p0 </groupId> <artifactid> c3p0 </artifactid> <bersion> 0.9.1.2 </version> </fexendencies> <build> <finalname> java_config_web </finalname> <flugi n> <groupid> org.apache.maven.plugins </groupid> <artifactid> maven-war-plugin </artifactid> <version> 2.2 </version> <configuration> <feaelonmissingwebxml> false </failonmissingwebxml> </plugin> </plugins> </build> </project> (2) 프로젝트 디렉토리 구조는 다음과 같습니다.
2. mybatis
1. MySQL 데이터베이스의 기본 정보를 구성하십시오.
# databasedb.mysql.driverclass = com.mysql.jdbc.driverdb.mysql.jdbcurl = jdbc : mysql : // localhost : 3306/register_notice? useUnicode = true & factureModing = utf-8 & alludmultiTuperies = rootdB.MySql.Myl.Porser = 333db.minpoolsize = 10db.maxpoolsize = 100db.initialpoolsize = 20db.maxidletime = 60db.acquireincrement = 5db.maxstatements = 100db.idleconnectionTestPeriod = 60db.acquireretryattempts = 30DB.BreakTERACQUIREFALE truedb.testConnectionOnCheckout = falsedb.properties
2. mybatis.xml 및 spring-mybatis.xml을 구성하십시오.
<? xml version = "1.0"alcoding = "utf-8"?> <! doctype configurationpublic "-// mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>! 별칭-> <failiases> <!-다음 두 가지 방법 중 하나를 선택하십시오. 방법 1 : 변형기를 사용하여 단일 클래스의 별칭을 설정하십시오. -> <!-<FANDEALIAS TYPE = "COM.EVERSEEKER.ENTITY.USER"ALIAS = "USER" /> --- 메소드 2 : 패키지를 사용하여 패키지 아래의 모든 클래스에 대한 별명을 설정합니다. 기본 규칙은 com.everseeker.entity.user가 사용자로 설정되어 이전 패키지 이름을 제거합니다. -> <package name = "com.everseeker.entity"/></typealiases></configuration> mybatis.xml<?xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://www.w3.org/2001/xmlschema-instance"xmlns : context = "http://www.spramwork.org /schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"x"xsi:schemalocation="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">< !-- 이 파일에 db.properties 파일을 소개하면 해당 값이 $ {db.mysql.driverclass}와 같은 후속 구성에서 해당 값을 찾을 수 있도록 보장 할 수 있습니다. 그렇지 않으면 동료가 DB.Properties를 직접로드하고 Spring-Mybatis.xml을 RootConfig.java에 직접로드하는 경우 DB.Properties가 소개 될 수 없다는 것을 보장 할 수는 없습니다. 오류-> <context : property-placeholder location = "classpath : db.properties"/> <!-데이터 소스 구성 C3P0에는 2 개의 공통 데이터 소스 구현 클래스 패키지가 있습니다. -> <bean id = "dataSource"Destroy-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-> <속성 이름 = "maxpoolsize"value = "$ {db.maxpoolsize}" /> <!-초기화 중에 얻은 연결 수는 minpoolsize와 maxpoolsize 사이에 있어야합니다. 기본값 : 3-> <property name = "initialpoolsize"value = "$ {db.initialpoolsize}" /> <!-최대 자유 시간, 60 초 이내에 사용되지 않으면 연결이 폐기됩니다. 그것이 0이라면, 그것은 결코 폐기되지 않습니다. 기본값 : 0-> <속성 이름 = "maxIdletime"value = "$ {db.maxidletime}" /> <!-연결 풀의 연결이 소진 될 때 한 번에 C3P0에 의해 얻은 연결 수. 기본값 : 3-> <속성 이름 = "AcquireIncrement"value = "$ {db.acquireIncrement}" /> <!-JDBC의 표준 매개 변수는 데이터 소스에로드 된 준비 상태의 수를 제어하는 데 사용됩니다. 그러나 Precache 문은 전체 연결 풀이 아닌 단일 연결에 속하기 때문입니다. 따라서이 매개 변수를 설정하려면 많은 요소를 고려해야합니다. MaxStatements와 MaxStatementsPerconnection이 모두 0이면 캐시가 닫힙니다. 기본값 : 0-> <속성 이름 = "maxstatements"value = "$ {db.maxstatements}" /> <!-60 초마다 연결 풀의 모든 연결을 확인하십시오. 기본값 : 0-> <속성 이름 = "idleconnectionTestPeriod"value = "$ {db.idleConnectionTestPeriod}" /> <!-데이터베이스에서 새로운 연결을 검색하지 못한 후 반복 시도의 수를 정의합니다. 기본값 : 30-> <속성 이름 = "AcquiReretRecTempts"value = "$ {db.acquireretrictempts}" /> <!-연결을 획득하면 연결 풀이 연결되기를 기다리는 모든 스레드가 예외를 던지게됩니다. 그러나 데이터 소스는 여전히 유효하며 다음에 getConnection ()을 호출 할 때 계속 연결하려고합니다. true로 설정되면 데이터 소스는 연결을 얻으려는 시도가 실패한 후 연결이 끊어지고 영구적으로 닫혔다 고 선언합니다. 기본값 : false-> <property name = "breakfteracquirefailure"value = "$ {db.breakefteracquirefailure}" /> <!-고성능 소비를 위해 필요할 때만 사용하십시오. true로 설정되면 각 연결 제출시 유효성이 확인됩니다. 연결 테스트의 성능을 향상시키기 위해 IdleConnectionTestPeriod 또는 AutomaticTestTable을 사용하는 것이 좋습니다. 기본값 : false-> <property name = "testConnectionOnCheckout"value = "$ {db.testConnectionOncheckout}"/> </bean> <!-myBatis configuration.classpath와 classPath*의 차이점은 문서를 참조하십시오. 첫 번째 일치 리소스 만 반환하십시오. 경로를 결정하는 단일 문서에 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> <!- @Transactional Innotation으로 표시된 거래 및 프로세스 Beans를 사용하여 전송 관리 측면을 지정합니다. 기본적으로 TransactionManager라는 트랜잭션 관리자가 자동으로 사용됩니다. 프록시-표적 클래스는 사실이며, 스프링은 서브 클래스를 만들어 비즈니스 클래스를 프록시 할 것이며 cglib.jar 클래스 라이브러리를 클래스 경로에 추가해야한다는 것을 나타냅니다. -> <tx : 주석 중심의 트랜잭션-매너 = "TransactionManager"proxy-target class = "true"/></beans>spring-mybatis.xml3. 사용자 클래스 및 userDAO 인터페이스를 만듭니다.
공개 클래스 사용자 {@size (min = 32, max = 32, messag ") 개인 문자열 이메일; @size (min = 11, max = 11, message ="휴대폰 번호의 길이는 11 자리입니다 ") 개인 문자열 핸드폰; private long regdate; public user () {this.id = uuid.randomuuid (). helsphone) {this (사용자 이름, 비밀번호, 이메일, 휴대폰, 새 날짜 (). gettime ());} 공개 사용자 (문자열 사용자 이름, 문자열 암호, 문자열 이메일, 스트링 핸드폰, Long Regdate) {this.id = uuid.randomuuid (). 이메일; this.cellphone = 핸드폰; this.regdate = regdate;} public string getId () {return id;} public void setId (} public void setId (string id) {this.id = id;} public string getUserName () {return username;} public void setusername (string username) {public string = username; setPassword (string password) {this.password = password;} public string getEmail () {return email;} public void seteMail (string email) {this.email = email;} public string getCellphone () {return void setCellphone (String hontphone) {this.cell phlone;} public long getREGDATE () {return getREGDATE ()} setRegdate (long regdate) {this.regdate = regdate;}@atriadepublic string toString () {return "[user : id =" + id + ", username =" + username + ", password =" + password + ", 이메일 =" + email + ", clown +", hondrone = " + clossphone +", regdate + ";user.java의 @notnull, @notempty, @size 및 @email과 같은 의견은 일시적으로 무시되고 나중에 설명됩니다.
@RepositoryPublic Interface userDao {void addUser (사용자); user getUserByUserName (String username);}4. src/main/resources/mapper 디렉토리에서 usermapper.xml 매핑 파일을 만듭니다. 참고 : *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">> inhinkseeker. id = "resultmapuser"type = "com.everseeker.entity.user"> </resultmap> <insert id = "adduser"parameterType = "user"> user (id, username, password, 이메일, 핸드폰, regdate) 값 ( #{id}, #{username}, #el}, #{ #{{{{{{{{{{{{{{vasket}) #{regdate}) </insert> <select id = "getUserByUserName"parameterType = "string"resultMap = "resultMapUser"> select * userEname = #{username} </select> usermpper.xml III. IOC
1. IOC 컨테이너를 만들고 rootconfig.java에 주석 메소드를 사용하십시오.
@configuration@componentscan (basepackages = { "com.everseeker"}, excludefilters = {@componentscan.filter (type = filtertype.custom, value = rootconfig.webpackage.class)@issortresource ({ "classpath : sprast-mybatis.xml}))). 클래스 webpackage는 regexpatterntypefilter {public webpackage () {super ( "pattern.compile ("com //. everseeker //. web "));}}} 확장됩니다. @Configuration : 구성 클래스임을 나타냅니다.
@ComponentSCAN : 컴포넌트 스캔을 활성화, 기본 사항 : 스캔 해야하는 기본 패키지. 제외 필터 : 필터가 필터 조건을 충족하는 경우 스캔하지 마십시오.
@importresource : XML 파일을 소개합니다.
@PropertySource : 속성 파일을 소개합니다.
2. WebApp 프로젝트가 생성되고 SpringMVC가 사용되므로 Dispatcherservlet이 핵심입니다. 이전 스프링 버전에서는 일반적으로 web.xml에서 구성되었습니다. 4 월 4 일에는 Java 코드로 구현 될 수 있습니다. WebAppinitializer.java.
Public Class WebAppinItializer 확장 AbstractAntationConfigDispatcherServleTinitializer {// class abstractAntationConfatcherServleTinitializer를 상속하는 클래스는 DispatcherserVlet 및 Spring Application Contex를 자동으로 구성합니다. };}/*** rootconfig 클래스는 ContextLoaderListener에 의해 생성 된 응용 프로그램 컨텍스트에서 Bean을 구성하는 데 사용됩니다.*예를 들어 @Repository, @Service 및 기타 구성 요소*/ @atredrideprotected class <?> [] getRootConfigClass () {return new Class <?> [] {rootconfig. Application Context, WebConfig 구성 클래스에 정의 된 Bean을 사용하면 컨트롤러, 파자 및 프로세서 맵핑, @Controller, @Controller, @RequestMapping 등과 같은 웹 구성 요소가 포함 된 Bean을로드하는 데 사용됩니다. };}@atredgreprotected void customizeregertration (servletregistration.dynamic registration) {// 업로드 된 파일 크기를 2MB 이하로 제한하면 전체 요청이 4m를 초과하지 않으며 모든 업로드 된 파일은 디스크 등록에 작성해야합니다. 4194304, 0));}}3. WebConfig.java를 만듭니다.
@configuration@enablewebmvc@componentscan ( "com.everseeker.web") public class webconfig 확장 webmvcconfigureradapter {// 구성 JSP보기 parser parser @beanpublic viewresolver () {internableresourceviewresolver viewresolver = new InternalResourceViewResolver (); ResourceViewResolver.setPrefix ( "/web-inf/views/"); resourceViewResolver.setSuffix ( ". jsp"); ResourceViewResolver.setexposeContextBeansAsattributes (true); returneviewresolver; @BeanPublic multipartresolver multipartresolver ()는 ioexception {return new 표준 returnservletmultipartresolver ();} // 정적 리소스 처리 @overridepublic void supgaultservleThandling (defaultservleThandlerConfigurer) {supergurer.enable ()}@Bean :이 메소드를 선언하면 원하는 유형의 인스턴스가 생성되고 스프링 응용 프로그램 컨텍스트에서 콩으로 등록합니다.
위의 내용은 편집자가 소개 한 Spring Learning Note 1, IOC에 대한 자세한 설명입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!