Aprendendo a prática na prática, o objetivo final desta série é concluir um projeto que implementa a função de registro e login do usuário.
O processo básico esperado é o seguinte:
1. Registre o site do usuário, preencha o nome de usuário, senha, email e informações do número de telefone celular e retorne OK depois de depositá -lo no banco de dados em segundo plano. (Saiba o conhecimento básico do COI, Mybatis, Springmvc, verificação de dados do formulário, upload de arquivos, etc.)
2. O servidor envia emails de forma assíncrona para o usuário registrado. (Aprenda a fila de mensagens)
3. Login do usuário. (Cache de aprendizado, segurança da primavera)
4 outros.
Estude e resuma e atualize de tempos em tempos. O ambiente do projeto é Intellij + Spring4.
1. Trabalho de preparação.
1. Crie banco de dados e tabelas no MySQL.
2. Crie um projeto MAVEN WebApp em Intellij.
(1) Importe os pacotes de dependência necessários no pom.xml.
<? xml versão = "1.0" coding = "utf-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-innstance" xsi: scheMalocation = "htttp://maven.ap.ap.ap.ap.p.p.p.p http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelversion><GroupId>com.everseeker</groupid> <artifactId> <artifactId1-15TerSoGersoMerSoGers MAVEN WebApp </name> <url> http://maven.apache.org </url> <Perts> <pring.version> 4.3.1.release <ringspring.version> </sperts> <pendencies> <!-núcleo da mola, núcleo da mola, núcleo Contexto-> <Ependency> <GrupidId> org.springframework </frugid> <ArtifactId> Spring-Context </ArtifactId> <Version> $ {spring.version} </sipers> </dependency> <pendencency> <voundid> org.springframework </purpuld> <stefa ctid> Spring-Context-support </starfactId> <versão> $ {spring.version} </version> </dependency> <pendencency> <voundid> org.springframework </foupid> <stifactId> spring-core </stifactid> <versão> $ {spring.version} </ve rsion> </dependency> <pendency> <puperiD> org.springframework </foupid> <TROTIFACTID> Spring-beans </ArtifactId> <versão> $ {spring.version} </sipers> </dependency> <!-test-> <pendency> <groupid> junit </groupid> <ar tifactId> Junit </sTifactId> <versão> 4.12 </sipers> <!-<cope> test </cope>-> </dependency> <pendesency> <puperid> org.springframework </frupid> <stifactId> spring-test </artifactId> <versão> $ {spring.version} rsion> </dependency> <!-springmvc-> <pendency> <voundid> org.springframework </foupiD> <stifactId> spring-webmvc </artifactId> <versão> $ {spring.version} </sipers> </dependency> <Pepence> <Pused> ou spring.springfringfringfringfringfringfringfringfringfringf. Amework </frupiid> <TarifactId> Spring-web </stutifactId> <versão> $ {spring.version} </version> </dependency> <pendence> <voupid> javax.validation </GroupId> <TarifactId> Validation-Api </Artifactid> <Versão> 1.1.0.fin Al </sipers> </pendence> <pendence> <puperid> org.hibernate </foupiD> <stifactId> hibernate-validador </artifactId> <versão> 5.2.4.Final </versão> </dependency> <!-servlet-> <pendency> <purbroupid> javax.Servlet < /groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><dependency><GroupId>javax.servlet</groupid> <artifactId>jstl</artifactid> <Servlet-ssion>2/06/10ssion/Groupid> mybatis-> <pendency> <puperiD> org.springframework </groupiD> <TRAFACTID> spring-jdbc </artifactId> <versão> $ {spring.version} </sipers> </dependency> <pendency> <voupid> mysql </purpuld> <stifactid> mysqlan-conn-Conn-Conn-Conn- Id> <versão> 6.0.3 </versão> </dependency> <pendency> <puperid> org.mybatis </groupid> <stifactId> mybatis </artifactId> <versão> 3.4.1 </version> </dependency> <pendency> <groupid> myrg.mybatis </brupId> artiftf </dependency> <purgId> myrg.mybatis <//grupo> </ArtIf ifactId> <versão> 1.3.0 </sistER> </dependency> <pendency> <puperid> c3p0 </groupiD> <TRAFACTID> C3P0 </ArtifactId> <versão 0.9.1.2 </suply> </dependency> </dependências> <bilt> <tuilame> java_config_web </dependencies> <tuild> <bilt> java_config_web </dependencies> <tuild> <tili> java_config 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) A estrutura do diretório do projeto é a seguinte:
2. Mybatis
1. Configure as informações básicas do banco de dados MySQL.
# Databasedb.mysql.driverclass = com.mysql.jdbc.driverdb.mysql.jdbcurl = jdbc: mysql: // localhost: 3306/register_notice = 333db.minPoolSize = 10db.maxPoolSize = 100db.initialPoolSize = 20db.maxIdleTime = 60db.acquireIncrement = 5db.maxStatements = 100db.idleConnectionTestPeriod = 60db.acquireRetryAttempts = 30db.breakAfterAcquireFailure = Truedb.testConnectionOncheckOut = FalsedB.Properties
2. Configure mybatis.xml e spring-mybatis.xml.
<? xml versão = "1.0" coding = "utf-8"?> <! Alias-> <TiPeAliases> <!-Escolha um dos dois métodos a seguir. Método 1: Use o TypeAlias para definir aliases para uma única classe. -> <!-<typeAlias type = "com.everseeker.entity.user" alias = "user" /> --- Método 2: use o pacote para definir aliases para todas as classes abaixo do pacote. A regra padrão é com.everseeker.entity.user está definida como usuário e remova o nome do pacote anterior. -> <Nome do pacote = "com.everseeker.entity" /></typealiases></configuration>mybatis.xml<?xml versão = "1.0" Encoding = "utf-8"?> <Beans <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-innstance" xmlns: context = "http./xmlschema-innstance" xmlns: context = "http./xmlschema-innstance" xmlns: context = "http./xmlschema-innstance" xmlns: context = "htttp./xmlschema" xmlns: "Http./xmlschema" /schema/Context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework. ringframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.spring estrutura.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx/spring-tx.xsd"><! Introdução ao arquivo db.properties neste arquivo pode garantir que o valor correspondente possa ser encontrado na configuração subsequente, como $ {db.mysql.driverclass}-caso contrário, se um colega carregar diretamente db.properties e spring-mybatis.xml in rootconfig.java, não pode ser garantido, que não pode ser garantido, não pode ser garantido, que não pode ser garantido. Erro-> <Contexto: Property-PlaceLitder Location = "ClassPath: DB.Properties"/> <!-Configuração da fonte de dados C3P0 possui 2 pacotes de classe de implementação de fonte de dados comuns, um é o Apache DBCP (org.apache.commons.dbcp.basicdatasource) e o outro é c3p0. -> <bean id = "DataSource" Destro-Method = "Close"> <propriedade name = "driverclass" value = "$ {db.mysql.driverclass}" /> <names name = "jdbcurl" value = "$ {db.mysql.jdbcurl}" /> <names = "$ {db.mysql.jdbcurl}" /> <names = "$ {db.mysql.jdbcurl}" /> <names = " /> <propriedade name = "senha" value = "$ {db.mysql.password}" /> <!-o número mínimo de conexões retidas no pool de conexões. -> <propriedade name = "minpoolsize" value = "$ {db.Minpoolsize}" /> <!-o número máximo de conexões retidas no pool de conexões. Padrão: 15-> <Propriedade name = "maxpoolsize" value = "$ {db.maxpoolsize}" /> <!-O número de conexões obtidas durante a inicialização deve estar entre Minpoolsize e MaxpoolSize. Padrão: 3-> <propriedade name = "InitialPoolSize" value = "$ {db.initialpoolsize}" /> <!-Tempo livre máximo, se não for usado dentro de 60 segundos, a conexão será descartada. Se for 0, nunca será descartado. Padrão: 0-> <Nome da propriedade = "maxidleTime" value = "$ {db.maxidleTime}" /> <!-O número de conexões obtidas por C3P0 ao mesmo tempo, quando a conexão no pool de conexão está esgotada. Padrão: 3-> <propriedade name = "adquiririncrement" value = "$ {db.acquireincrement}" /> <!-Os parâmetros padrão do JDBC são usados para controlar o número de estatutos preparados carregados na fonte de dados. Mas porque as instruções Precache pertencem a uma única conexão em vez de todo o pool de conexão. Portanto, definir esse parâmetro requer considerar muitos fatores. Se o Maxstatements e o MaxStatementsPerConnection forem 0, o cache será fechado. Padrão: 0-> <propriedade name = "maxstatements" value = "$ {db.maxstatements}" /> <!-Verifique todas as conexões no pool de conexões a cada 60 segundos. Padrão: 0-> <Nome da propriedade = "IdleConnectionTestPeriod" value = "$ {db.idleConnectionTestPeriod}" /> <!-Define o número de tentativas repetidas depois que uma nova conexão não foi recuperada do banco de dados. Padrão: 30-> <Propriedade name = "adquireretryattsepts" value = "$ {db.acquireretryattsepts}" /> <!-adquirir uma conexão fará com que todos os threads aguardem o pool de conexão para obter a conexão para lançar uma exceção. No entanto, a fonte de dados ainda é válida e continua tentando obter a conexão na próxima vez que você ligar para getConnection (). Se definido como true, a fonte de dados declarará que foi desconectada e fechada permanentemente após tentativas fracassadas de obter a conexão. Padrão: false-> <propriedade name = "breakafterAcquirefailure" value = "$ {db.breakafteracquirefailure}" /> <!-Para consumo de alto desempenho, use-o apenas quando necessário. Se definido como true, sua validade será verificada em cada envio de conexão. Recomenda -se usar o IDleConnectionTestperiod ou AutomaticTestTable para melhorar o desempenho dos testes de conexão. Padrão: false-> <propriedade name = "testConnectionOncheckOut" value = "$ {db.testConnectionOncheckout}" /> < /bean> <!-a diferença entre mybatis configuration.classpath e ClassPath*, consulte o documento: http://blog.csdn.net/zl3450341/article/details/9306983.classpath retornará apenas o primeiro recurso correspondente. Recomenda -se usar o ClassPath para um único documento que determina o caminho; Use ClassPath*ao corresponder a vários documentos .--> <Bean id = "SQLSessionFactory" P: DataSource-ref = "DataSource" P: configLocation = "Classpath: mybatis.xml" P: Mapperlocations = "Classpath*: mapper /*specspper.xml" /> <ean> <! será pesquisado. Vários pacotes podem ser especificados. O MapperScannerConfigurer digitalizará todas as classes de interface (incluindo subpackagens) no pacote especificado pelo BasePackage. Se eles tiverem sido definidos no arquivo de mapeamento SQL, eles serão definidos dinamicamente como um feijão de mola. -> <Property name = "BasEpackage" value = "com.everseeker.dao" /> <propriedade name = "sqlsessionFactoryBeanName" value = "sqlsessionFactory" /> </ Bean> <!-Configuração do gerenciador de transações, usando transações JDBC-> <Bean> id = "transactionManager" class = "org.springframework.jdbc.dataSource.dataSourceTransactionManager"> <propriedade name = "DataSource" ref = "DataSource" /> </ Bean> <!- Use a anotação para definar transações e processos com beans marcados. Por padrão, um gerente de transação chamado TransactionManager é usado automaticamente. A classe proxy-alvo é verdadeira, indicando que a primavera irá aulas de negócios proxy criando subclasses e precisa adicionar a biblioteca de classes do CGLIB.JAR ao caminho de classe. -> <TX: transação acionada por anotação-manager = "transactionManager" proxy-target-class = "true" /></beans>spring-mybatis.xml3. Crie a classe de usuário e a interface Userdao.
Public class User {@size (min = 32, max = 32, message = "uuid deve ser uma string de 32 bits") Private String ID; @Size (min = 1, max = 32, message = "O comprimento da conta deve estar em emails não pode estar em emails; formato está incorreto ") email de sequência privada; @size (min = 11, max = 11, message =" O comprimento do número de telefone celular é de 11 dígitos ") private String Cellphone; private Long RegDate; public user () {this.id = uuid.randomuuid (). tostring (). String Cellphone) {this (nome de usuário, senha, email, celular, new Date (). GetTime ());} User Public User (String Name, String Senha, String email, String Cellphone, Long Regdate) {this.id = uuid.randomuuid (). email; this.Cellphone = celular; this.regDate = regDate;} public String getId () {return id;} public void setId (string id) {this.id = id;} public string getUserName () {return nome; setPassword (string senha) {this.password = senha;} public string getEmail () {retorna email;} public void setEmail (string email) {this.email = email;} public string getCellphone () {return Cellphone;} public void setCellphone (string celular) {this.Cellphone = Cellphone;} publicphone public SetChone (stringphone) {this.Cellphone = Cellphone;} Public Set. setRegdate (long RegDate) {this.regdate = regDate;}@SubsteridePublic string tostring () {return "[user: id =" + id + ", userName =" + username + ", senha =" + senha + "," + email + "," = " +" +;Comentários como @NotNull, @NotEmpty, @Size e @Email no user.java são temporariamente ignorados e explicados posteriormente.
@Repositorypublic interface userdao {void adduser (usuário do usuário); usuário getUserByUserName (nome de usuário da string);}4. Crie o arquivo de mapeamento UsermApper.xml no diretório SRC/Main/Recursos/Mapper para implementar os métodos na interface Userdao. Nota: *O arquivo Mapper.xml deve ser colocado no diretório SRC/Main/Recursos, e foi anteriormente colocado no diretório SRC/Main/Java/Com/Everseeker/DAO, resultando em um erro inexplicável.
<? xml versão = "1.0" coding = "utf-8"?> <! namespace="com.everSeeker.dao.UserDao"><resultMap id="ResultMapUser" type="com.everSeeker.entity.User"></resultMap><insert id="addUser" parameterType="User">INSERT INTO user(id, username, password, email, cellphone, regDate) VALUES(#{id}, #{nome de usuário}, #{senha}, #{email}, #{celular}, #{regdate}) </insert> <select id = "getUserByUserName" parameterType = "string" resultMap = "resultMapUser"> selecione * do usuário wherename = #{username}}}} Iii. COI
1. Crie um contêiner do IOC e use o método de anotação para rootconfig.java.
@Configuration@componentsCan (BasEpackages = {"com.everseeker"}, excludeFilters = {@componentscan.filter (type = filtertype.custom, value = rootconfig.webpackage.class)}@importResource ({"ClassPath: spring-mybatsbat.class)})@ImportrErm (" ClassPath: spring-mybat. WebPackage estende REGEXPATTERNTYPEFILTER {public webpackage () {super (padrony.compile ("com //. Everseeker //. Web");}}} @Configuration: indica que esta é uma classe de configuração.
@ComPONENTSCAN: Ativar digitalização de componentes, BasePackages: o pacote básico que precisa ser digitalizado. excludeFilters: Não digitalize se o filtro atender às condições do filtro.
@IMPORTRESOURCE: Introduce o arquivo XML.
@PropertySource: Apresente arquivos de propriedades.
2. Como o projeto do WebApp é criado e o SpringMVC é usado, o DispatcheserServlet é o núcleo. Nas versões anteriores da primavera, geralmente foi configurado no web.xml. Na primavera 4, ele pode ser implementado no código Java. WebAppinitializer.java.
classe pública WebAppinitializer estende abstrateNoTationConfigDispatcherservletLitializer {// A classe que herde o abstratoNotationConfigDispatcherServletLeTIlizer automaticamente configurará automaticamente o contexto de StringServlet e Spring @OverrideProtected [] GetStletMappings () {/ Map Mapt the Dispatch (//let (///ing (////////Spring e spring e mapa o contexto @OverrideProtected String [] GetsletLee };}/*** A classe RootConfig é usada para configurar os grãos no contexto do aplicativo criado pelo contextLoaderListener,*por exemplo, @Repository, @Service e outros componentes*/ @SubstertideProtected Class <?> [] GetRootConfigClass () {return Contexto, Use Beans definido na classe de configuração do WebConfig, * é usado para carregar feijões contendo componentes da Web, como controladores, visualizadores de analisadores e mapeamentos de processador, @Controller, @RequestMapping, etc.*/@@VoverRideProtected Class <? };}@Substitua prototeged Void Customizeregistration (ServletRegistration.dynamic Registration) {// Limite o tamanho do arquivo carregado a não mais que 2 MB, a solicitação inteira não excede 4m, e todos os arquivos uploados devem ser gravados no registro de disco. 4194304, 0));}}3. Crie webconfig.java.
@Configuration@enablewebmvc@componentsCan ("com.everseeker.web") classe public webconfig estende webmvcconfigureRAdApter {// configure jsp visualizador ParSer @Beanpublic ViewResolver ViewResolver () {InternalResourCeanwViewReResVuviewSolverSolverSolverSolver () {InternalResourCeanwViewRevVuew InternalResourceViewResolver (); ResourceViewResolver.SetPrefix ("/Web-Inf/Views/"); ResourceViewResolver.SetSuffix (". Multipartresolver multipartResolver () lança ioexception {retorna new StandardServletMultiparTResolver ();} // Configure recursos estáticos Processando @OverridePublic void ConfigureFaultServleThling (defaultServLetHandlerConfigurador)@Bean: Declarar este método cria uma instância do tipo desejado e se registra como um feijão no contexto do aplicativo da primavera.
O exposto acima é a explicação detalhada da Nota 1 da Spring Learning, IOC, introduzida pelo editor, para você, tente usar anotações e código Java o máximo possível. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!