Prefácio
Hoje vou revisar a construção do Springmvc+Hibernate. Originalmente, pensei que a estrutura de controle de permissão de segurança da mola também será incluída nela, mas descobri que há muito conteúdo. Vamos deixá -lo para o próximo artigo. Este artigo cria principalmente Springmvc4.1.4 e Hibernate4.3.8. Eu também usei muito Springmvc antes. Esta parte está muito familiarizada com ela. Afinal, o SpringMVC foi desenvolvido há mais de um ano. Desta vez, a camada de persistência usa o hibernato, a fonte de dados usa C3P0 e o banco de dados usa o MySQL temporariamente. Eu quero principalmente revisar o Hibernate. A idéia de construir a estrutura do springmvc+hibernate é a seguinte:
1. Banco de dados de design: projete a estrutura da tabela, é melhor conhecer o 3NF e usar as ferramentas de hibernato para gerar automaticamente a entidade da entidade correspondente.
1. Crie um projeto Maven e insira as dependências do pacote Maven, conforme necessário.
2. Construa a mola: configure a injeção de mola do feijão da camada de controle.
3. Construa Hibernate: Configure fontes de dados, configure o SessionFactory, configure transações e configure o ehcache do cache secundário.
4. Teste a construção da estrutura da mola+hibernato, escreva Junit de teste de unidade, configuração de transação de teste, etc.
5. Entrada Springmvc: Configure informações de configuração Springmvc.
6. Configure o contêiner web.xml
7. Teste a integração de três estruturas: Maven compilam, pacotes e implanta servidores e testes.
1. Design de banco de dados
Projete uma tabela de permissões, funções e usuários. Obviamente, se um usuário pode ter várias funções, uma função possui vários usuários; Uma função tem várias permissões e uma permissão corresponde a várias funções. Portanto, de acordo com o design da estrutura da tabela do banco de dados, se atender ao 3NF, precisamos de 5 tabelas para existir. As informações específicas da tabela não estão listadas (você pode baixá -las no código -fonte e também há um banco de dados), e o relacionamento da tabela é o seguinte:
Somente neste ID é usado é o UUID (36 bits)
2. Crie um projeto Maven e escreva um arquivo pom.xml
Crie um projeto MAVEN WebApp, escreva um arquivo pom.xml e apresente as dependências de pacote necessárias. Vou mapear todos os necessários aqui.
O conteúdo do arquivo pom.xml é o seguinte:
<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/Maven-V4_0_0.XSD "> <ModelVersion> 4.0.0 </modelVersion> <puperid> org.andy.sh </groupid> <chaging> warsing> springmvc_hiber_demo </artifactId> <backaging> warsing> warersing> springmvc_hiber_demo </artifactId> <backaging> warersing> warSerSer versão </Packaging> wartid> springmvc_hibe_demo </artifactId> <backaging> <name> springmvc_hibernate_demo maven webApp </name> <url> http://maven.apache.org </url> </properties> <projeto.build.sourceEncoding> utf-8 </project.build.sourcencoding.pring.version> <hibernate.version>4.3.8.Final</hibernate.version> <jackson.version>2.5.0</jackson.version> </properties> <dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- spring -> <Depencency> <roupidId> org.springframework </frupidId> <ArtifactId> Spring-core </ArtifactId> <Version> $ {spring.version} </sipers> </dependency> <ipendency> <runerd> org.springframewil </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <TRATIFACTID> Spring-test </ArtifactId> <versão> $ {spring.version} </version> <cope> teste </scope> </dependency> <!-Configurando com Springmvc-> <pendency> spring-webmv> artesn {/springftring> {springer> wering> org.springframe </groupid> <strifactiM> spring-webmv> </dependency> <!- Ao integrar um banco de dados relacional, você precisa configurar como o Hibernate JPA. -> <Depencency> <voundid> org.springframework </frupidId> <TRATIFACTID> Spring -form </sutifactId> <Version> $ {spring.version} </sipers> </dependency> <!-hibernate-> <pendency> <puperid> org.ibernate </groupIid> <ArtifactImate-> HiBernate Hib Hib HiM HIB HIB HIB HIB HIB HIB HUM HIB- <Versão> $ {hibernate.version} </sipers> </dependency> <pendence> <puperiD> org.hibernate </foupiid> <ArtifactId> hibernate-ehcache </artifactId> <versão <PuerpId> net.sf.ehcache </groupiD> <stifactId> ehcache </artifactId> <versão> 2.9.0 </version> </dependency> <!-log4j-> </dependency> <pUrPuld> log4j </groupid> <stifactId> log4j </spendency> <! Versão> 1.20h2s </groupid> <tifactId> log4j </artifactid> <versão> 1.2.20. <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <!-- c3p0 data source--> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5-pre10</version> </dependency> <!-JSON-> <Depency> <Puperid> com.alibaba </groupiD> <TRARFACTID> fastjson </stutifactId> <versão> 1.2.3 </sipers> </dependency> <spendency> <vroupid> com.fasterxml.jackson.core </proupid> <sterfactId> jackson- jackson- jackson- com.fasterxml.jackson.core </proupid> <sterfactId> jackson- jackson- jackson- jackson-casterxml.jackson.core </groupid> <striftid> <Versão> $ {Jackson.version} </siers> </dependency> <pendency> <puperiD> com.fasterxml.jackson.core </foupidId> <ArtifactId> Jackson-Core </ArtifactId> <sunders> $ {Jackson.version} </versão> </dependence> <PersiceM> Combr. <TarifactId> Jackson-Databind </ArtifactId> <versão> $ {Jackson.version} </Version> </dependency> <!-AOP-> <Depency> <puperid> org.aspectj </groupid> <stifactId> aspecjweaver </stifactId! <PuerpId> javax.servlet </frupiD> <TRAFACTID> servlet-api </artifactId> <versão> 3.0-alpha-1 </version> <cope> fornecido </scope> </dependency> <sstery> <suseriFact> javax.servlet </grupid> <uft> <finname> springmvc_hibernate_demo </nounName> <flugins> <!-Execute os testes da unidade Junit em um carregador de classe isolado-> <flugin> <plugId> org.apache.maven.plugins </groupid> <stifactId> MAVEN-SureFire-Plugin.Maven.Plugins </grupId> <stifactId> MAVEN-SureFire-PLUGINMENGIMA </versão </Artifactid> MAVEN-SureFire-PLUGINGINNE </ARTIFTID> <skiptests> true </skiptests> </figuration> </plugin> <lugin> <puperid> org.apache.maven.plugins </groupiD> <TRARFACTID> MAVEN-WAR-PLUGIN </ArtifactId> <versão 2.3 </version> <bigurm> <xxml> </configuration> </plugin> <!-- generate java doc --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>2.9.1</version> <configuration> <javadocDirectory>target/javadoc</javadocDirectory> <ReportOutdputDirectory> Target/javadoc </reportoutputDirectory> <charset> utf-8 </charset> <coding> utf-8 </coding> <docEncoding> utf-8 </docencoding> <show> privado </show> </figurt> </plugin> <! <PuerpId> org.codehaus.cargo </frupiD> <TRARFACTID> cargo-maven2-plugin </stutifactId> <versão> 1.0 </version> <figuration> <i container> <ipacheRid> Tomcat6x </testerid> <home> d: /webserver/apache-tomcat-. <type> existente </pype> <home> d: /webserver/apache-tomcat-6.0.39 </SHOME> </figuration> </figuration> </plugin> </plugins> </build> </project>3. Introduzir a configuração da primavera
Escreva um arquivo de configuração e coloque o arquivo de configuração no diretório de recursos src/main/recursos (o mesmo abaixo).
Informações de configuração exigidas pelo projeto Config.Properties
#Application Configs#JDBC C3P0 configjdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc: mysql: // localhost: 3306/work? useunicode = trueCoding = utf-8jdbc.UsernNamenking = jATENJATENJATEJATEJATEJATENSBETENSBETEJATESTERSBC.USBC.USBC.USBC.USTERSB.USTRATENSB.USTENSBESTESTESTESTESTE = ConfighiBernate.dialect = org.hibernate.dialect.mysqldialecThibernate.show_sql = truehibernate.format_sql = falsehibernate.hbm2ddl.auto = updateibernate.cache.use_second_level_cache = trueBrome.cache = updatenate.cache.use_second_level_cache = trueBernate.cache = truehibernate.cache.region.factory_class = org.hibernate.cache.ehcache.ehcacheregionfactoryhibernate.cache.provider_configuration_file_resource_path = ehcache.xml
3.1. Configuração da primavera
O arquivo de configuração do spring.xml é o seguinte:
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/Context/spring-context-4.1.xsd "> <! Injetado como Bean-> <Contexto: componente-Scan-Package = "org.andy.work.service.impl, org.andy.work.dao.impl" /> </ Beans>
A mola acima configura o gerenciamento automático de injeção de feijão dos grãos de componentes correspondentes sob o pacote. Precisamos entregar a classe de implementação do DAO e o serviço para o Spring para gerenciar, como (@repository, @service).
3.2. Introduce Configuração do arquivo de log Log4J
O arquivo de configuração de log4j.properties é o seguinte: ### Defina níveis de log ### log4j.rootlogger = info, c, d, e ### console ### log4j.appender.cpt.outget.outGache.Log4j.consolEapPenderLog4J.Append.C.Target.Opache.Log4j.ConsOnEppendLog4J. org.apache.log4j.patternlayoutLog4j.appender.c.layout.conversionPattern = [springmvc_hibernate_demo] [%p] [%-d {yyyy-mm-dd hh: mm: ss}]%C.%m (%) | %m%n ### Arquivo de log ### log4j.appender.d = org.apache.log4j.dailyrollingFileAppenderLog4j.appender.d.file = ../logs/springmvc_hibernate_demo.loglog4j.appender.dapnden = truelMvc_hibernate_demo.logLog4j.appender.dappend = truel log4j.appender.d.layout = org.apache.log4j.patternlayoutLog4j.appender.d.layout.conversionPattern = [springmvc_hibernate_demo] [%p] [%-d {yyyy-mm-dd hh: mm: ss]%. %m%n ### Exceção ### log4j.appender.e = org.apache.log4j.dailyrollingFileAppenderLog4j.appender.e.file = ../logs/springmvc_hibernate_demo_error.LogLog4j.appender.eppendsvc_ibernate_demo_error.LogLog4J.Append.eppend = Truel = Truel_Demo_error.LogLog4J.Append.eppend = Truel = Truel_Demo_error.LogLog4J.Append.eppend = Truel = Truel_Demo_error.LogLog4J.Append.eppend = Truel = Truel_Demo_error.LogLog4J.Append.eppend = Truel = Truel_Demo_error.LogLog4J.Append.eppend. log4j.appender.e.layout = org.apache.log4j.patternlayoutLog4j.appender.e.layout.conversionPattern = [sspringmvc_hibernate_demo] [%p] [%-d {yyyy-mm-dd hh: mm: ss] [%p] [%-d {yyyyy-mm-dd hh: mm: ss: ss] [%p] [%-d {yyyyy mm-dd hh: mm: ss: ss] [%p] [%-d {yyyyy-mm-dd hh: mm: ss: ss] [%p] [%-d {yyyyy mm-dd hh: mm: ss: ss] [%p] [%-d {yyyyy mm-dd hh: mm: ss: ss. %m%n 4. Configuração de hibernação
A configuração do hibernato inclui principalmente: configurar a fonte de dados C3P0, configurar o SessionFactory, configurar o gerenciador de transações e configurar o gerenciamento de transações. O arquivo Spring-hibernate.xml é o seguinte:
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/aop/aop/spring-a-4 id = "DataSource" Destro-Method = "Close"> <Property name = "driverclass" value = "$ {jdbc.driver}" /> <propriedade name = "jdbcurl" value = "$ {jdbc.url}" /> <nome da propriedade " /" = "$" {jdbc.url} " /> <name =" user "=" " value = "$ {jdbc.password}" /> <!-Solicite Timeout-> <propriedade name = "checkoutTimeout" value = "30000" /> <!-Verifique todas as conexões ociosas no pool de conexões a cada 60 segundos. Valor padrão: 0, não check-> <propriedade name = "idleConnectionTestPeriod" value = "30" /> <!-Tempo máximo de marcha lenta para conexão Pool de conexão de banco de dados-> <names name = "maxidleTime" value = "30" /> <!-Número de conexões inicializadas em conexões em conexão /> <names = "inicialPoolsize" " /> <propriedade name = "maxpoolsize" value = "20" /> <!- Número de conexões obtidas por C3P0 ao mesmo tempo em que a conexão no pool de conexão está esgotada. Valor padrão: 3-> <Propriedade name = "adquiririncrement" value = "5" /> < /bean> <!-Configure o Hibernate SessionFactory-> <bean id = "sessionFactory"> <!-consulte o código-fonte para injetar fonte de dados-> <nome da propriedade "DataSource" Ref = "DataSource" /> <! name = "hibernateproperties"> <ports> <propr = "hibernate.dialect"> $ {hibernate.dialect} </prop> <propr key = "hibernate.show_sql"> $ {hibernate.show_sql} </prop> <Prop key = "hibernate.format_sql"> $ {hibernate.format_sql} </prop> <prop) key = "hibernate.cache.use_second_level_cache"> $ {hibernate.cache.use_second_level_cache} </prop> <props key = "hibernate.cache.use_quer_cache"> $ {hibernate.cache.use_query_cache_} </propina <(hiBernate.cache.use_quache_cache_} key = "hibernate.cache.region.factory_class"> $ {hibernate.cache.region.factory_class} </prop> <prop key = "hibernate.cache.provider_configuration_file_resource_path"> $ {hibernate.cache.proviver_file_resource_path "> $ {hibernate.cache.provers </props> </propriedade> <!-Digitalizar a entidade da configuração da anotação de hibernato-> <propriedade name = "packAgestoscan" value = "org.andy.work.entity"/> </i bean> <!-Configure Transaction Manager-> <bean = "transactionManager"> <erprody Name = "fator Beans de processamento de aprimoramento e especifique o gerenciador de transações-> <tx: conselhos id = "transactionAdvice" transação-manager = "transactionManager"> <!-configure semântica de processamento de transação detalhada:> <TewertX: Method name = "insert*" propagation = "requery" /> <tx: método = "Method):" Method name = "insert*propagation =" " /> <tx: método =" Method name = "insert*. name = "delete*" propagação = "requerir" /> <tx: name método = "get*" propagation = "suporta" somente leitura = "true" /> <tx: método name = "find*" propagation = "suporta" read-uly = "true" /> <tx: método = "find*" propagation = "suportes" name = "*" /> < /tx: atributos> < /tx: conselhos> <!-Spring AOP Transaction Management-> <AOP: config> <!-Configure Pointcut-> <AOP: Pointcut id = "transactionPointCut" Expression = "Execution (*org.andy.work.-ToSevice TOPT. em txadvice Pointcut-> <AOP: Advisor Pointcut-ref = "TransactionPointCut" conselhos-ref = "transactionAdvice"/> </AOP: config> </ Beans> O acima é configurado com o cache secundário e o ehcache. Para obter informações específicas relevantes, consulte o artigo anterior Hibernate o cache secundário e a configuração de construção do ehcache. A seguir, é apresentada a configuração do cache secundário.
4.1. Configuração ehcache.xml
<? xml versão = "1.0" coding = "utf-8"?> <ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-innstance" xsi: nonameschemalocation = "../ config/ehcache.xcache.xi. <!- Configuração do DefaultCache. -> <DefaultCache maxElementsInMemory = "1000" eternal = "false" timeToidleSeconds = "120" timeToliveSeconds = "120" maxElementsOndisk = "1000000" OverflowTodisk = "True" MemoryStoreEvictionPolicy = "LRU"> </Séfalha -> <cache name = "org.andy.work.entity.acctUser" maxElementsinMemory = "2" MemoryStoreEvictionPolicy = "lru" eternal = "true" diskPersistent = "false" flowtodisk = "false" maxElementsisk = "1000000" /> < /ehcche>
O ehcache do cache secundário de hibernato acima é d:/ehcache
5. Gere entidade comercial
Depois de projetar a tabela de dados, as entidades de hibernato têm a ferramenta Hibernate Tools gerada automaticamente. O Eclipse requer a instalação do plug-in Hibernate Tools (eu o instalei on-line várias vezes, mas não é bem-sucedido. Recomenda-se usar links para instalar offline, e o apêndice o apresentará). Portanto, não há necessidade de escrever manualmente. Aqui está uma entidade com informações do usuário, acctuser.java
pacote org.andy.work.entity; // gerou 2015-2-3 10:43:00 por Hibernate Tools 4.0.0Import java.util.date; importar java.util.hashSet; importPaxSistence.util.Set; Import.; javax.Joincolumn; importar javax.persistence.Jointable; importar javax.persistence.Manytomany; import javax.persistence.tabable; import javax.persistence.temporal; importação; org.hibernate.annotações.cache; importar org.hibernate.annotações.cachecoCurncyStrategy; importar com.fasterxml.jackson.annotation.jsonignoreproperties;/** * acctUser gerado por hbm2java */@entity@tabela (nome = "" CACHECONCURRENCYStrategy.read_write) a classe pública acctuser implementa java.io.serializable { / ** * * / private estático final serialversionuid = 6980093847795726310l; ID de string privado; apelido de string privada; telefone de corda privada; data de data privada tempo de registro; Conjunto privado <Ctrole> Acctroles = new Hashset <Ctrole> (0); public acctUser () {} public acctUser (string id, apelido de string) {this.id = id; this.nickname = apelido; } public acctUser (string ID, apelido de string, string telefone, data registratime, set <cctrole> acctroles) {this.id = id; this.nickname = apelido; this.telephone = telefone; this.registerTime = registroTime; this.acctroles = acctroles; } @Id @column (name = "id", exclusivo = true, anulável = false, comprimento = 36) public string getId () {return this.id; } public void setId (string id) {this.id = id; } @Column (name = "nick_name", nullable = false) public string getNickName () {return this.nickname; } public void setNickName (String apelido) {this.nickname = apelido; } @Column (name = "telefone") public string getTelephone () {return this.telephone; } public void STETELHONE (String Telephone) {this.telephone = telefone; } @Temporal (temporalType.timestamp) @column (name = "registr_time", comprimento = 19) date public getRegisterTime () {return this.RegisterTime; } public void setRegisterTime (Data RegisterTime) {this.registertime = registringTime; } @JsonignoreProperties (value = {"acctusers", "acctauthorities"}) @ManyTomany (fetch = fetchtype.lazy) @cache (usage = cacheConcurncystrategy.read_write) @Jointable (name = "acct_user_role", catall = @write "@JONTABLE (names =" acct_user_role "user_id", anulable = false, updatable = false)}, inversojOincolumns = {@joincolumn (name = "role_id", anulable = false, atualizável = false)}) se set <cectrole> getAcctroles () {return this.actRoles; } public void SetAcctroles (set <Ctrole> Acctroles) {this.acctroles = Acctroles; }} Existem algumas coisas a serem observadas acima:
A maioria das opções acima é gerada automaticamente pelas ferramentas de hibernação, mas há várias que precisam ser adicionadas manualmente:
1. Se essa entidade usar o cache do Nível 2, você precisará adicionar a anotação @cache;
2. Se houver elementos definidos (definido, mapa, lista) na entidade e, se a entidade quiser usar um cache secundário, esses elementos definidos também deverão ser adicionados à anotação @cache.
3. A anotação @jsonignoreproperties deve impedir que a SpringMVC produza a saída do loop quando o JSON retornar. Se não estiver configurado, o JSON Dead Loop ocorrerá (e muitos para muitos, propriedades individuais).
4. @Jsonignore está convertendo para JSON para ignorar esta propriedade, enquanto @jsonignoreproperties (value = {"acctusers", "acctauthorities"}) ignora as propriedades Acctusers e Acctauthoridades em Acctroles.
6. Crie uma camada DAO
Interface 6.1DAO
Devemos adotar a idéia de programação de interface facial na camada DAO e na camada de serviço, por isso definimos uma interface da DAO em geral, genericdao.java
pacote org.andy.work.dao; importar java.io.Serializable; importar java.util.list;/** * Tempo criado: 2015-2-6 14:26:42 * * @author Andy * @version 2.2 * * dao interface geral */interface Gericdao <t, PK Extrends T Get (PK ID); Lista <T> findAll (); Void persist (entidade T); Pk salvar (entidade T); void saveorupdate (entidade T); Excluir void (PK ID); void Flush ();}
Defina a interface Userdao.java específica
pacote org.andy.work.dao; importar org.andy.work.entity.acctUser;/** * Tempo de criação: 2015-2-6 14:43:50 * * @Author Andy * @Version 2.2 * * interface dao do usuário */public interface {interface {interface pública {interface Public interface:6.2. Classe de implementação da camada DAO
Precisamos injetar a classe de implementação da camada DAO em feijão, por isso precisamos adicionar a anotação @Repository, o userdaoimpl é o seguinte:
pacote org.andy.work.dao.impl; importar java.util.list; importar org.andy.work.dao.userdao; importar org.andy.work.entity.acctUser; importação org.hibernate.session; importação.Inmeran.Inying.Oning.SetraT.SPRINGFRINGFRINGFRINGFRINGFRINGFRINGFRINGFRINGFRINGFRINGFRINGFRINGFRING. org.springframework.stereotype.repository;/** * Tempo de criação: 2015-2-6 14:45:14 * * @Author Andy * @Version 2.2 */ @repositório ("userDao") public class UserDaoMPLEMPLESTEMENTES UserDAO {@AUTOWIRDATFATFATFACTILTIVATION; sessão privada getCurrentSession () {return this.SessionFactory.getCurrentSession (); } @Override public AcctUser LOAD (string id) {return (acctUser) this.getCurrentSession (). Load (acctuser.class, id); } @Override public acctUser get (string id) {return (acctUser) this.getCurrentSession (). Get (acctuser.class, id); } @Suppresswarnings ("desmarcado") @Override Public List <CctUser> findAll () {list <CctUser> acctusers = this.getCurrentSession (). CreateEquery ("de acctUser"). SetCachable (true) .list (); retornar actusers; } @Override public void persist (entidade acctusser) {this.getCurrentSession (). Persist (entidade); } @Override public string salvar (entidade acctUser) {return (string) this.getCurrentSession (). Salvar (entidade); } @Override public void saveorUpdate (entidade acctUser) {this.getCurrentSession (). SaveorUpdate (entidade); } @Override public void delete (string id) {acctUser entity = this.load (id); this.getCurrentSession (). delete (entidade); } @Override public void Flush () {this.getCurrentSession (). Flush (); }}7. Crie uma camada de serviço
7.1. Interface da camada de serviço
pacote org.andy.work.service; importar java.util.list; importar org.andy.work.entity.acctUser;/** * tempo de criação: 2015-2-6 15:18:57 pm * * @author Andy * @version 2.2 * Uservice Interface */interface pública Uservice {ACCTUSER; AcctUser Get (string ID); Lista <CctUser> findAll (); Void persist (entidade acumuladora); String save (entidade acctusser); void saveorupdate (entidade acctusser); excluir void (string id); void Flush ();}7.2. Classe de implementação da camada de serviço
UserServiceImpl precisa injetar o feijão da camada DAO definido acima.
package org.andy.work.service.impl; importar java.util.list; importar org.andy.work.dao.userdao; importar org.andy.work.entity.acctUser; importação org.andy.work.service.UserSevice; import.sPringFramewan.Bean.Bean.Bean.Bean.Bean.Andy.Service.Uservice; org.springframework.stereotype.service;/** * Tempo de criação: 2015-2-6 15:24:16 * * @Author Andy * @Version 2.2 Uservice Implementação */ @Service ("Uservice") Public class UserViceImpl implementos {@autoteired private ") userrDa userriceImpl; @Override public AcctUser Load (string id) {return userdao.load (id); } @Override public acctUser Get (string id) {return userdao.get (id); } @Override Public List <CctUser> findAll () {return userdao.findall (); } @Override public void persist (entidade acctusser) {userdao.persist (entidade); } @Override public string salvar (entidade acctUser) {return userdao.save (entidade); } @Override public void saveorUpdate (entidade acctUser) {userdao.saveorupdate (entidade); } @Override public void Delete (string id) {userdao.delete (id); } @Override public void Flut () {userdao.flush (); }}8. Teste a integração da primavera e Hibernate
Podemos escrever uma classe de teste no SRC/Test/Java para testar a configuração acima. Se o teste for bem -sucedido, ele será basicamente concluído.
pacote org.andy.work.service; importar java.util.date; importar java.util.list; importar java.util.uuid; importar org.andy.work.entity.acctUser; importação org.apache.log4j.logger; importUnrg.Rit.Test; importação; org.springframework.beans.factory.annotation.autowired; importar org.springframework.test.context.ContextConfiguration; importar org.springframework.test.context.junit4.springjunit4sonnOnClassRunner; importação.Test.Cantext.Junit4.PringJunit4Onson; 3:31:07 pm * * @Author Andy * @version 2.2 */ @runwith (springjunit4classrunner.class) @ContextConfiguration (Locations = {"classPath: spring.xml", "ClassPath: spring-hibernate.xml"}) classe pública TestUs .getLogger (testUserservice.class); @AUTOWIRED PRIVADO UserService UserService; @Test public void save () {acctUser acctUser = new acctUser (); acctUser.setId (uuid.randomuuid (). ToString ()); acctuser.SetnickName ("Andy"); acctuser.SetRegisterTime (new Date ()); acctuser.setTelephone ("130222111111"); String id = userservice.save (acctuser); Logger.info (json.tojSonstring (id)); }}9. Introduzir Springmvc
Adicione o arquivo spring-mvc.xml
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: mvc = "http://www.springframew.org/schema/fschemer/fschema/http://www.springframway.org/Schema/SCHEMA/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!-Voltor automático @Controller injeção como feijão-> <Contexto: component-scan-package = "org.andy.work.controller" /> <!-a seguir é springmvc configuration-> <mvc: annotation-driven> <! name = "SupportedMediTypes"> <TIST> <Value> text/html; charset = utf-8 </value> <value> Application/json; charset = utf-8 </value> </list> </propriedade> </bEan> </MVC: Message-Converters> Model <svc: ANDRUST> <! Nome-> <Bean> <propriedade name = "viewclass" value = "org.springframework.web.servlet.view.jstlview"/> <propriedade name = "prefixo" value = "/web-inf/views"/> <nome da propriedade = "sufixo" = "jsp".
O controlador de digitalização de pacotes, [email protegido] ��, e as configurações da camada de exibição estão configuradas acima.
10. Configure o contêiner web.xml
Os contêineres da web são o cérebro de projetos da web; portanto, os contêineres da web precisam primeiro introduzir a primavera, deixar a primavera gerenciar várias estruturas e injetar -as em feijão. Em seguida, configure as informações do filtro da camada de controle. E o URL interceptado pelo SpringMVC é configurado para solicitações que terminam em .hmls.
O arquivo web.xml é o seguinte:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns: web = "http://java.sun.com/xml/ns/javaee" xmlns: web = "http://java.sun.com/xml/ns/javaee/web-app_2.xsd" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" od "webApp_id" = "2.5">> <flam-nam> <amam-name> contextConfigLocation </param-name> <amam-value> classPath: spring.xml, classpath: spring-hibernate.xml </param-value> </xcenti--param> <filter> <filter-name> codingfilter </filter-class-cls> org.springfamebring.webilter <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-Pattern>/*</url-pattern> </filter-mapping> <!-A configuração do OpenSessionInView é atrasar o fechamento da sessão para a camada de visualização-> <filter> <filter-name> openSessionInviewFilter </ftrid-Name> <filtro-class> org.springFrameStwork.orm. <amam-name> singlessession </amon-name> <amam-value> true </amam-value> </irit-param> </filter> <!-Ouça o servletContext e inicie informações de configuração de mola em contextConfigLocation-> <Falener> <listerner-class> org.springFramework.weblocation> <Conter> <lister> O ouvinte> <Ilvener-Class> org.springframework.web.context.contextLoaderListener </lister-class> </ouvinte> <!-prevenir a memória do spring overring ouviu-> <IntroSporer-class> org.springframework.web.util.util.IntrostorterClist> MVC servlet </cription> <Verlet-name> REST </servlet-name> <Servlet-class> org.springframework.web.servlet.dispatcherServlet </servlet-class> <init-param> <amam-name> contextClonfigLocation </param-name> <!-aqui é o springmv confling filefigling- <Maver-value> ClassPath: spring-mvc.xml </amam-value> </irit-param> <adarble-on-startup> 1 </olload-on-startup> </servlet> <sutlet-mapping> <Vapp-Mapping> </url-name> Rest </arerlet-name> <url-pattern>*. <Filter-Name> OpenSessionInViewFilter </filter-Name> <url-Pattern>*. htmls </url-pattern> </ftrids-mapping> <!-Configure o tempo limite da sessão, em minutos-> <lorde-fig-list> </session-timeout> 30 </timeout> <//-config> <lorde-list >-list> <liedile> <lorde-timeout> 30 </timeout> </-config> <lorde-list> </list-list> </web-App>
11. Crie um controlador de camada de controle
Camada de controle UserController
pacote org.andy.work.controller; importar java.util.list; importar org.andy.work.entity.acctUser; importar org.andy.work.service.userService; importação org.apache.log4j.logger; import.siredFramework.beanS.Factory.annotation.annot.notation.logger; org.springframework.stereotype.controller; importar org.springframework.ui.modelmap; importar org.springframework.web.bind.annotation.pathvariable; importação org.springframework.web.bind.annotation.requestMapping; importante org.springframework.web.bind.annotation.Responsebody;/** * Tempo de criação: 2015-2-7 11:49:00 * @author Andy * @VERSion 2.2 * Descrição: UserTroller */ @controller @requestmapping ("/user") public classe userCroller {private static Log Final Log (private " @AUTOWIRED PRIVADO UserService UserService; @RequestMapping ("/ShowInfo/{userId}") public String showUserinfo (ModelMap ModelMap, @Pathvariable string userID) {Logger.info ("Usuário de consulta:" + UserID); AcctUser UserInfo = UserService.load (UserID); modelMap.addattribute ("userInfo", userInfo); retornar "/user/showinfo"; } @RequestMapping ("/SHOWINFOS") LISTA DE Public @ResponseBody <CctUser> showUserinfos () {Logger.info ("Consulte todos os usuários do usuário"); List <CctUser> userInfos = userService.findall (); return userInfos; }}12、创建视图层
在src/main/webapp/WEB-INF/views下创建user/showInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><base href="<%=basePath%>" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script type="text/javascript" src="js/jquery-1.9.1.min.js"></script><title>userInfo</title></head><body> User information nickname: ${userInfo.nickName} User id: ${userInfo.id} User phone: ${userInfo.telephone } Registration time: <fmt:formatDate value="${userInfo.registerTime }" pattern="yyyy-MM-dd HH:mm:ss" /> Role: [ <c:forEach items="${ userInfo.acctRoles}" var="role"> ${role.name } Permissions[ <c:forEach items="${ role.acctAuthorities}" var="authority"> ${authority.name } </c:forEach> ] </c:forEach> ] <br /> ajax displays all user information: <div id="show_all_user"></div></body><script type="text/javascript"> $.ajax({ type : "get", url : "user/showInfos.htmls", dataType : "json", success : function(data) { $(data).each( function(i, user) { var p = "<p>Nickname:" + user.nickName + " Phone:" + user.telephone + " Registration time:" + user.registerTime + " id:" + user.id + "</p>"; $("#show_all_user").append(p); }); }, async : true });</script></html>13、部署服务器测试
使用Maven打包部署:clean compile package
部署到tomcat,测试主要测试上面的http://localhost:8080/springmvc_hibernate_demo/user/showInfo/6e5afb1d-50e1-45fe-b6fe-b9e399415387.htmls
和http://localhost:8080/springmvc_hibernate_demo/user/showInfos.htmls (json数据返回)
上面视图层就包含了这两条url请求的测试:
ok,到此Spring+SpringMVC+Hibernate搭建完毕。
博客来源:http://blog.csdn.net/fengshizty?viewmode=list
项目源码:http://download.csdn.net/detail/fengshizty/8432647
I hope to help friends in need and continue to add relevant information in the future. Obrigado pelo seu apoio a este site!