Prefacio
Hoy revisaré la construcción de SpringMVC+Hibernate. Originalmente pensé que el marco de control de permiso de seguridad de primavera también se incluirá en él, pero descubrí que hay demasiado contenido. Dejémoslo en el siguiente artículo. Este artículo construye principalmente SpringMVC4.1.4 y Hibernate4.3.8. También he usado muchos SpringMVC antes. Esta parte está muy familiarizada con ella. Después de todo, SpringMVC se ha desarrollado durante más de un año. Esta vez, la capa de persistencia usa Hibernate, la fuente de datos usa C3P0 y la base de datos usa MySQL temporalmente. Principalmente quiero revisar Hibernate. La idea de construir el marco de SpringMVC+Hibernate es la siguiente:
1. Base de datos de diseño: diseñe la estructura de la tabla, es mejor cumplir con 3NF y utilizar herramientas de hibernación para generar automáticamente la entidad de entidad correspondiente.
1. Cree un proyecto Maven e ingrese las dependencias del paquete Maven según sea necesario.
2. Build Spring: Configure la inyección de resorte de los frijoles de la capa de control.
3. Cree Hibernate: Configure las fuentes de datos, configure SessionFactory, configure las transacciones y configure el caché secundario ehcache.
4. Pruebe la construcción del marco de Spring+Hibernate, escriba unidades de prueba Junit, Configuración de la transacción de prueba, etc.
5. Entrada SpringMVC: Configurar información de configuración de SpringMVC.
6. Configurar contenedor web.xml
7. Pruebe la integración de tres marcos: Maven compila, paquetes e implementa servidores y pruebas.
1. Diseño de base de datos
Diseñe una tabla de permisos, roles y usuarios. Por supuesto, si un usuario puede tener múltiples roles, un rol posee múltiples usuarios; Un papel tiene múltiples permisos, y un permiso corresponde a múltiples roles. Por lo tanto, de acuerdo con el diseño de la estructura de la tabla de la base de datos, si cumple con 3NF, necesitamos 5 tablas para existir. La información específica de la tabla no está enumerada (puede descargarla en el código fuente, y también hay una base de datos), y la relación de la tabla es la siguiente:
Solo en esta identificación se usa el UUID (36 bits)
2. Cree un proyecto maven y escriba un archivo pom.xml
Cree un proyecto Maven WebApp, escriba un archivo pom.xml e introduce las dependencias de paquetes requeridas. Mapearé todos los requeridos aquí.
El contenido del archivo pom.xml es el siguiente:
<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.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0. http://maven.apache.org/maven-v4_0_0.xsd "> <modelVersion> 4.0.0 </modelversion> <MoupRupid> org.andy.sh </groupid> <artifactId> springmvc_hibernate_demo </artifactid> <calageing> war </packageging> <lifiMe Version> <name> Springmvc_Hibernate_Demo Maven WebApp </name> <URL> http://maven.apache.org </sl> <properties> <proyecto.build.sourceEncoding> utf-8 </project.build.sourceoding> <ver.version> 4.1.4.Release </spring.version.version <hibernate.version> 4.3.8.final </hibernate.version> <jackson.version> 2.5.0 </jackson.version> </propiies> <pendencies> <! Junit-> <pendency> <proupId> Junit </groupId> <artifactid> Junit </artifactid> <version> 4.12 </versewers> </scope> scope </scope </scope Primavera-> <Spendency> <MoupRid> org.springframework </proupid> <artifactId> spring-core </arfactid> <versión> $ {spring.version} </versión> </dependency> <epardency> <proupid> org.springframework </groupid> <artactid> spring-beans <///artifiCid> <version> $ {springsionion </groupid> <artifactId> spring-beans </artifiCt> <version> $ {springsionion </} </thiLthersion </thiLthing> spring-beans </artifiCid> <versión> $ {springsionion </groupid> <ArtifactId> Spring-beans <///artifiCid> <version> $ {Spring. </pendency> <ependency> <uproupid> org.springframework </groupid> <artifactid> spring-context </artifactid> <verserse> $ {spring.version} </versión> </dependency> <pendency> <proupid> org.springframework </groupid> <artifactid> spring-tx </artifactid>>> <versión> $ {spring.version} </versión> </pendency> <ependency> <uproupid> org.springframework </groupid> <artifactid> spring-web </artifactid> <version> $ {spring.version} </versión> </dependency> <epardency> <proupid> org.springframework </groupid> <artifactID> spring-test </artifactid> <versión> $ {spring.version} </versión> <cope> test </cope> </pepertency> <!-Configuración con springmvc-> <ependency> <proupId> org.sspringframework </groupID> <artactID> spring-webmvc </artifactid> <version> $ {springeSion </} </dependencia> <!- Al integrar una base de datos relacional, debe configurar como Hibernate JPA. -> <Spendency> <MoupRoD> org.springframework </groupid> <artifactid> spring-anm </artifactid> <version> $ {spring.version} </versión> </pendency> <!-hibernate-> <pendency> <grupid> org.hibernate </groupid> <artifactid> hibernate-core </artfactid> <Persion> $ {hibernate.version} </verververs> </pepertency> <epardency> <grupid> org.hibernate </mupoid> <artifactid> hibernate-ehcache </artifactid> <versión> $ {hibernate.version} </presion> </pelepency> <!-Cachey Cachey Ehcache-> <Paper> <MoupRid> net.sf.ehcache </groupid> <artifactid> ehcache </artifactid> <versión> 2.9.0 </versión> </pendency> <!-log4j-> <pendency> <proupid> log4j </groupid> <artifactid> log4j </artifactid> <proonsion> 1.2.17 </versión> </dependente> <! <Spendency> <ProupId> mysql </proupid> <artifactid> mysql-confonnector-java </artifactid> <versión> 5.1.34 </versión> </pendency> <!-C3p0 Fuente de datos-> <pendency> <MoupRid> com.mchange </groupId> <artifactId> c3p0 </artifactid> <versión> 0. </pendency> <!-json-> <pendency> <MoupRid> com.alibaba </groupid> <artifactid> fastjson </arfactid> <versión> 1.2.3 </versión> </dependence> <pendency> <proupid> com.fasterxml.jackson.core </proupid> <artifactid> jackson-annotations </artifactid> <versión> $ {jackson.version} </ververy> </pendency> <epardency> <moupid> com.fasterxml.jackson.core </groupid> <artifactid> jackson-core </artifactid> <versión> $ {jackson.version} </versión> </dependency> <depentency> <grupid> com.fasterxml.Jackson. <AtifactId> Jackson-Databind </arfactid> <versión> $ {jackson.version} </ververy> </dependency> <!-aop-> <pendency> <proupid> org.aspectj </groupid> <artifactID> spightJWeaver </artifactId> <versión> 1.8.4 </versión> </dependence> <!-SERVLet----SERVLET---SERVETLET---SERVETLET> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <100ed> <finalName> springmvc_hibernate_demo </ finalName> <glugins> <!-Ejecute las pruebas de la unidad JUnit en un carga de clases aislado-> <glugin> <MoupRoupId> org.apache.maven.plugins </groupId> <arifactid> maven-tire-plugin </artifactid> <versión> 2.2. <skipTests>true</skipTests> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <webXml>src/main/webapp/WEB-INF/web.xml</webXml> </figuration> </tugin> <!-Generar Java Doc-> <glugin> <MoupRoMid> org.apache.maven.plugins </proupid> <arifactid> maven-javadoc-plugin </arfactid> <ververy> 2.9.1 </version> <figuration> <JavadocDirectory> objetivo/javadoc </javadirectory> <NortOutputDirectory> Target/Javadoc </ReportOutputDirectory> <HARSET> UTF-8 </charset> <coding> UTF-8 </coding> <doceCoding> UTF-8 </docenCoding> <show> private </show> </figuration> </plugin> <! Diploy a nativo-> <glugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.0</version> <configuration> <container> <containerId>tomcat6x</containerId> <home>D:/WebServer/apache-tomcat-6.0.39</home> </container> <configuration> <proye> existente </pype> <home> d: /webserver/apache-mocat-6.0.39 </use> </figuration> </figuration> </plugin> </glugins> </build> </proyect>3. Introducir la configuración del resorte
Escriba un archivo de configuración y coloque el archivo de configuración en el directorio de recursos SRC/Main/Resources (lo mismo a continuación).
Información de configuración requerida por el proyecto config.properties
#Application Configs#JDBC C3P0 configjdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc: mysql: // localhost: 3306/work? useunicode = true & caracteringoding = utf-8jdbc.username = rootjdbc.passwort = 12345#hihiebernate. org.hibernate.dialect.mysqldialEttHibernate.show_sql = trueHibernate.format_sql = falseHibernate.hbm2ddl.auto = updateHibernate.cache.use_second_level_cache = trueHibernate.cache.use_Query_cache = trueHiberNate org.hibernate.cache.ehcache.ehcacheregionFactoryHibernate.cache.provider_configuration_file_resource_path = ehcache.xml
3.1. Configuración de resorte
El archivo de configuración de Spring.xml es el siguiente:
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-be-4. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd "> <!-Carga de configuración de configuración-> <contexto: lugar-lugar de propiedad =" classpath: configu. configur./> <! -> <context: componente-escan-scan-package = "org.andy.work.service.impl, org.andy.work.dao.impl" /> </ beans>
La primavera anterior configura el manejo automático de la inyección de frijoles de los frijoles componentes correspondientes en el paquete. Necesitamos entregar la clase de implementación de DAO y Servicio para que Spring para administrar, como (@Repository, @Service).
3.2. Introducir la configuración del archivo de registro log4j
El archivo de configuración de log4j.properties es el siguiente: ### Establecer niveles de registro ### log4j.rootlogger = info, c, d, e ### Console ### log4j.appender.c = org.apache.log4j.consoleppenderlog4j.appender.c.Target = system.outlog4j.appender.c.c.layout = org.apache.log4j.patternlayoutlog4j.appender.c.cloyout.conversionPattern = [springmvc_hibernate_demo] [%p] [%-d {yyyyy-mm-dd hh: mm: ss}]%c.%m (%l) | %m%n ### archivo de registro ### log4j.appender.d = org.apache.log4j.DailyRollingFilePeppenderlog4j.appender.d.file = ../logs/springmvc_hibernate_demo.loglog4j.appender.d.append = truelog4j.appender.d.thresholdold log4j.appender.d.layout = org.apache.log4j.patternlayoutlog4j.appender.d.layout.conversionpattern = [springmvc_hibernate_demo] [%p] [%-d {yyyyy-mm-dd hh: mm: ss}]%m (%l) | %m%n ### Excepción ### log4j.appender.e = org.apache.log4j.dailyRollingFileAppenderlog4j.appender.e.file = ../logs/springmvc_Hibernate_Demo_error.loglog4j.appender.e.apend = truelog4j.appender.e.thresshold = error log4j.appender.e.layout = org.apache.log4j.patternlayoutlog4j.appender.e.layout.conversionpattern = [sspringmvc_hibernate_demo] [%p] [%-d {yyyy-mm-dd hh: mm: ss}]%c.%m (%l) | %Minnesota 4. Configuración de hibernación
La configuración de Hibernate incluye principalmente: Configuración de la fuente de datos C3P0, Configuración de SessionFactory, Configuración de Transaction Manager y Configuración de administración de transacciones. El archivo Spring-Hibernate.xml es el siguiente:
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation 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/schema/aop/spring-aop-4.1.xsd "> <! id = "dataSource" destruye-method = "Close"> <Property Name = "DriverClass" value = "$ {jdbc.driver}" /> <propiedad name = "jdbcurl" valor = "$ {jdbc.url}" /> <propiedad name = "user" user = "$ {jdbc.username}" /> <sperty name = "contraseña" contraseña " value = "$ {jdbc.password}" /> <!-Solicitar Tiempo de espera-> <Property Name = "CheckoutTimeOut" Value = "30000" /> <!-Verifique todas las conexiones inactivas en el grupo de conexión cada 60 segundos. Valor predeterminado: 0, no verificar-> <propiedad name = "idleconnectionTestperiod" valor = "30" /> <!-Tiempo de inactividad máximo para la base de datos de la base de la conexión de la base de la conexión de conexión-> <propiedad name = "maxidletime" valor = "30" /> <!-Número de conexiones de conexión de conexiones en el grupo de conexiones-> <Nombre de propiedad = "Nombre de propiedad =" Initialsize "Valor =" 5 " /> <Nombre de propiedad =" MinPools de conexiones "Conexiones de conexiones" 5 "5", Nombre de propiedad ". <propiedad name = "maxpoolSize" value = "20" /> <!- Número de conexiones obtenidas por C3P0 al mismo tiempo a la vez cuando la conexión en el grupo de conexión está agotada. Default value: 3 --> <property name="acquireIncrement" value="5" /> </bean> <!-- Configure hibernate SessionFactory --> <bean id="sessionFactory"> <!-- See the source code for injecting data source--> <property name="dataSource" ref="dataSource" /> <!-- hibernate configuration information--> <property name="hibernateProperties"> <props> <prop key = "hibernate.dialect"> $ {hibernate.dialect} </prop> <prop key = "hibernate.show_sql"> $ {hibernate.show_sql} </prop> <prop key = "hibebernate.format_sql"> $ {Hiebernate.format_sql} </proppT = "propin key = "hibernate.hbm2ddl.auto"> $ {hibernate.hbm2ddl.auto} </prop> <!-Activar el nivel 2 caché ehcache-> <prop key = "hibernate.cache.use_second_level_cache"> $ {hibernate.cache.use_second_level_cevel} </prop>/prop>/prop>/prop>/prop> <ppnevel} <pat <propiLel key = "Hibernate.cache.use_query_cache"> $ {hibernate.cache.use_Query_cache} </pr> <proping key = "hibernate.cache.region.factory_class"> $ {hibernate.cache.region.factory_class} </pit> <proping key = "Hibernate.cache.provider_configuration_file_resource_path"> $ {hibernate.cache.provider_configuration_file_resource_path} </prop> </props> </Property> <!-Escanee la entidad de la configuración de anotación de hibertura-> <name de propiedad = "PackageScan" value = "org.andy.work.entity" /> < /bean> <!-Configurar Transaction Manager-> <Bean ID = "TransActionManager"> <Property Name = "SessionFactory" ref = "SessionFactory" /> < /bean> <!-Configurar la mejora de la transacción Processing Beans y especificar el administrador de transacciones-> <tx: consejo id = "TransactionAdvice" Transaction-Manager = "Transaction Processing Beans Semántica de procesamiento de transacciones-> <tx: atributos> <tx: método name = "insert*" propagation = "requerido" /> <tx: método name = "update*" propagation = "requerido" /> <tx: name = "delete*" propagation = "requerido" /> <tx: método name = "get*" propagation = "léase" lectura "n. propagation = "admite" read-Only = "true" /> <tx: método name = "find*" propagation = "admite" read-nly = "true" /> <!-Otros usan métodos de transacción predeterminados-> <tx: name de método = "*" /> < /tx: atributes> < /tx: consejo> <!-spring aop transaction management id = "TransactionPointCut" Expression = "Ejecution (*org.andy.work.service ..*impl.*(..))" /> <!-Especifique para aplicar TXAdVice Transaction Mejoration Processing en txadvice PointCut-> <aOp: Advisor PointCut-REF = "TransactionPointcut" Advication-Ref = "TRANSACCIÓN" /> <ATOOP: < /aOP El anterior está configurado con el caché secundario y el ehcache. Para obtener la información específica relevante, consulte el artículo anterior Hibernate Secondary Cache y la configuración de construcción de Ehcache. La siguiente es la configuración del caché secundario.
4.1. Configuración de ehcache.xml
<? xml versión = "1.0" encoding = "utf-8"?> <ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: nonamespaceschemalocatation = "../ config/eHcache.xsd"> <shstore path Configuración de defaultcache. -> <Defaultcache maxelementsInmemory = "1000" eternal = "false" timetoidleseConds = "120" timetoliveSeconds = "120" maxelementsondisk = "1000000" overflowTodisk = "true" MemorySteeVictionPolicy = "LRU"> </faitionCache> <!-Sesgo de objetos especiales. -> <cache name = "org.andy.work.entity.acctuser" maxelementsInmemory = "2" MemorySteeVictionPolicy = "lru" eternal = "true" diskpersistent = "false" overflowtisk = "falso" maxElementEdisk = "100000000" /> < /ehcache>>
El caché secundario hibernado anterior ehcache es d:/ehcache
5. Generar entidad comercial
Después de diseñar la tabla de datos, las entidades Hibernate tienen la herramienta Hibernate Tools generadas automáticamente. Eclipse requiere la instalación del complemento Hibernate Tools (lo he instalado en línea varias veces, pero no tiene éxito. Se recomienda usar enlaces para instalar fuera de línea, y el apéndice lo presentará). Por lo tanto, no hay necesidad de escribir manualmente. Aquí hay una entidad con información del usuario, accTuser.java
paquete org.andy.work.entity; // Generado 2015-2-3 10:43:00 por Hibernate Tools 4.0.0Import java.util.date; import java.util.hashset; import java.util.set; importar javax.persistence.column; import javax.persistence.entity; import javax.persistence; javax.persistence.id; import javax.persistence.Joincolumn; import javax.persistence.Jointable; import javax.persistence.ManyTomany; import javax.persistence.table; importación javax.persistence.temporal; import javax.persistence.temporaltspe; importación o importación; org.hibernate.annotations.cacheconcurrencyStrategy; import com.fasterxml.jackson.annotation.jsonignoreproperties;/** * accTuser generado por hbm2java */@entity@table (name = "ACCT_USER", catalog = "trabajo")@cache (usege = CacheconCurrencyStrategy.read_write) Class pública Acctuser implementa java.io.Serializable { / ** * * / private static final Long SerialVersionUid = 6980093847795726310l; ID de cadena privada; apodo de cadena privada; Teléfono de cadena privada; Fecha privada de registro de registro; set private <AcCtrole> actroles = new Hashset <CacTrole> (0); public Acctuser () {} public accTuser (ID de cadena, String Nickname) {this.id = id; this.nickName = Nickname; } public accTuser (ID de cadena, apodo de cadena, teléfono de cadena, date registertime, establecer <AcCtrole> actroles) {this.id = id; this.nickName = Nickname; this.telephone = teléfono; this.RegisterTime = Registertime; this.acCtroles = Actroles; } @Id @column (name = "id", unique = true, nullable = false, longitud = 36) public String getId () {return this.id; } public void setid (ID de cadena) {this.id = id; } @Column (name = "nick_name", nullable = false) cadena pública getNickName () {return this.nickName; } public void setNickName (String Nickname) {this.nickName = Nickname; } @Column (name = "Telephone") String public getTelephone () {return this.telephone; } public void settelephone (teléfono de cadena) {this.telephone = teléfono; } @Temporal (temporaltype.timestamp) @column (name = "registre_time", longitud = 19) fecha pública getRegisterTime () {return this.registertime; } public void setRegisterTime (date registertime) {this.registertime = registertime; } @Jsonignoreproperties (valor = {"Actusers", "AccTauthorities"}) @ManyTomany (fetch = fetchType.Lazy) @cache (use = cacheconcurrencyStrateGy.read_write) @Jointable (name = "ACCT_USER_ROL = "user_id", nullable = false, updateable = false)}, inversejoincolumns = {@Joincolumn (name = "role_id", nullable = false, actualizable = false)}) conjunto público <AcCtrole> getACCtroles () {return this.acCtroles; } public void setAcCtroles (set <AcCtrole> actroles) {this.acctroles = actroles; }} Hay algunas cosas a tener en cuenta:
La mayoría de las anteriores son generadas automáticamente por Hibernate Herramients, pero hay varios que deben agregarse manualmente:
1. Si esta entidad usa la memoria caché de nivel 2, debe agregar la anotación @cache;
2. Si hay elementos establecidos (establecer, mapa, lista) en la entidad, y si la entidad quiere usar un caché secundario, entonces estos elementos establecidos también deben agregarse con la anotación @cache.
3. @JsonignoreProperties La anotación es evitar que SpringMVC produce la salida de bucle cuando JSON regresa. Si no está configurado, JSON Dead Loop ocurrirá (y de muchas a muchos, de uno a muchos).
4. @Jsonignore se está convirtiendo en JSON para ignorar esta propiedad, mientras que @JsonignoreProperties (valor = {"AccTusers", "AccTAuthorities"}) ignora las propiedades de Acctusers y AccTAuthorities en Acctroles.
6. Crea una capa DAO
6.1DAO Interfaz
Debemos adoptar la idea de la programación de la interfaz facial en la capa DAO y la capa de servicio, por lo que primero definimos una interfaz DAO general, Genericdao.java
paquete org.andy.work.dao; import java.io.serializable; import java.util.list;/** * Tiempo creado: 2015-2-6 2:26:42 PM * * @author andy * @version 2.2 * * DAO Interface */Interface GenericDao <t, PK extiende serializable> {TOB (POK ID); T Get (PK ID); List <t> findall (); nulo persist (entidad t); PK Save (T entidad); nulo saveorUpdate (entidad t); Eliminar void (ID PK); vacío FLUSH ();}Defina la interfaz de userdao.java específica
paquete org.andy.work.dao; importar org.andy.work.entity.acctuser;/** * Tiempo de creación: 2015-2-6 2:43:50 pm * * @author andy * @version 2.2 * * Interfaz DAO de usuario */Interface public UserDao extiende Genericdao <accTuser, cadena>}}}
6.2. Clase de implementación de la capa DAO
Necesitamos inyectar la clase de implementación de la capa DAO en frijoles, por lo que necesitamos agregar la anotación @Repository, UserDaoImpl es el siguiente:
paquete org.andy.work.dao.impl; import java.util.list; importar org.andy.work.dao.userdao; importar org.andy.work.entity.acctuser; importación org.hibernate.session; importación de importación; org.springframework.stereotype.repository;/** * Tiempo de creación: 2015-2-6 2:45:14 pm * * @author andy * @version 2.2 */ @repository ("userdao") clase pública userDaoMpl implementa userdao {@autowined session factory factory; sesion privada getCurrentSession () {return this.sessionFactory.getCurrentSession (); } @Override public Actuser Load (ID de cadena) {return (accTuser) this.getCurrentSession (). Load (AccTuser.Class, ID); } @Override public accTuser get (ID de cadena) {return (accTuser) this.getCurrentSession (). Get (accTuser.class, id); } @SupplesWarnings ("sin verificar") @Override List Public <AcCtuser> findAll () {list <AcCtuser> accTusers = this.getCurrentSession (). CreateQuery ("de AccTuser"). SetCacheable (true) .List (); devolver acctusers; } @Override public void persist (entidad accTuser) {this.getCurrentSession (). Persist (entidad); } @Override public String Save (Entity AccTuser) {return (String) this.getCurrentSession (). Save (entidad); } @Override public void saveRUpdate (entidad accTuser) {this.getCurrentSession (). SaveorUpdate (entidad); } @Override public void Delete (ID de cadena) {accTuser entity = this.load (id); this.getCurrentSession (). Eliminar (entidad); } @Override public void flush () {this.getCurrentSession (). Flush (); }}7. Crea una capa de servicio
7.1. Interfaz de capa de servicio
paquete org.andy.work.service; import java.util.list; import org.andy.work.entity.acctuser;/** * Tiempo de creación: 2015-2-6 3:18:57 pm * * @author andy * @version 2.2 * Interfaz de ussereService */Interface pública UserService {Acctuser Load (String id); AccTuser get (ID de cadena); Lista <AcCtuser> findall (); Vacío persist (entidad accTuser); String save (entidad accTuser); void saveorUpdate (entidad accTuser); Eliminar void (ID de cadena); vacío FLUSH ();}7.2. Clase de implementación de la capa de servicio
UserServiceImpl necesita inyectar el frijol de capa DAO definido anteriormente.
paquete org.andy.work.service.Impl; import java.util.list; import org.andy.work.dao.userdao; importar org.andy.work.entity.acctuser; importar org.andy.work.service.userService; import og.springframework.beans.factory.annotation.aUtowed; org.springframework.stereotype.service;/** * Tiempo de creación: 2015-2-6 3:24:16 PM * * @author Andy * @Version 2.2 UserService Implementación */ @Service ("UserService") Public ClasserServiceIm implementa UserService {@autowied userdao userdao userdao; @Override public accTuser Load (ID de cadena) {return userDao.load (id); } @Override public accTuser get (ID de cadena) {return userDao.get (id); } @Override Public List <AcCtuser> findall () {return userDao.findall (); } @Override public void persist (entidad accTuser) {userDao.persist (entidad); } @Override public String Save (Entity AccTuser) {return userDao.save (entidad); } @Override public void saveRUpdate (entidad accTuser) {userdao.saveorupdate (entidad); } @Override public void Delete (ID de cadena) {userDao.Delete (id); } @Override public void flush () {userDao.flush (); }}8. Pruebe la integración de la primavera y la hibernación
Podemos escribir una clase de prueba en SRC/Test/Java para probar la configuración anterior. Si la prueba es exitosa, básicamente se completará.
paquete org.andy.work.service; import java.util.date; import java.util.list; import java.util.uuid; import og.andy.work.entity.acctuser; import org.apache.log4j.logger; import og.junit.test; import og.junit.runner.runwith; import; org.springframework.beans.factory.annotation.aUtowired; import org.springframework.test.context.contextConfiguration; import org.springframework.test.context.junit4.springjunit4classRunner; import com.alibaba.faster.json;/*** creion time 3:31:07 pm * * @author Andy * @version 2.2 */ @runwith (springjunit4classrunner.class) @ContextConfiguration (ubicaciones = {"classpath: spring.xml", "classpath: spring-hibernate.xml"}) clase pública testuserService {private static logger = logger = logger = logger = logger .getLogger (testUservice.class); @AutoWired private UserSerervice UserService; @Test public void save () {accTuser accTuser = new Actuser (); accTuser.setId (uuid.randomuuid (). toString ()); accTuser.setNickName ("Andy"); accTuser.setRegisterTime (nueva fecha ()); accTuser.settelephone ("130222211111"); String id = Userservice.save (accTuser); Logger.info (json.tojsonstring (id)); }}9. Introducir a SpringMVC
Agregar archivo Spring-Mvc.xml
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: mvc = "http://www.springframework.org/schema/mvc" "" "" "" "" "" "" "" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: p = "http://www.springframework.org/schema/p" xmlns: context = "http://www.springframe xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/contextExt 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. Inyección automática de escaneo @Controller como bean-> <context: component-scan base-package = "org.andy.work.controller" /> <!-La siguiente configuración de SpringMVC-> <mvc: annotation-doriven> <!-return json data, @respuesta-usado-> <mvc: mensajes-concipter name = "SupportedMediatyPes"> <List> <Value> Text/Html; Charset = UTF-8 </value> <value> Application/Json; Charset = Utf-8 </alon valor> </list> </propiedad> </bean> </mvc: mensajes-converters> </mvc: annotation-driven> <! <Bean> <Property Name = "ViewClass" Value = "org.springframework.web.servlet.view.jstlview"/> <propiedad name = "prefix" valor = "/web-inf/vistas"/> <Property name = "suffix" value = ". Jsp"/> </le Beans> </beachs>
El controlador de escaneo de paquetes, [correo electrónico protegido] ��, y las configuraciones de la capa de vista se configuran arriba.
10. Configurar el contenedor web.xml
Los contenedores web son el cerebro de los proyectos web, por lo que los contenedores web primero deben introducir Spring, dejar que Spring administre varios marcos e inyectarlos en frijoles. Luego configure la información de filtro de la capa de control. Y la URL interceptada por SpringMVC está configurada para las solicitudes que terminan en .hmls.
El archivo web.xml es el siguiente:
<? xml versión = "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_5.xsd" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id = "webapp_id" version = "2.5"> <Display-Name> Springmvc_DemO </Display-Name-Name <Amam-name> contextConfigLocation </param-name> <amam-value> classpath: spring.xml, classpath: spring-hibernate.xml </amam-value> </text-param> <filter> <filter-name> codingfilter </filter-name> <Tilter-Class> org.springframework.web.filter.CharacterIncodingFilter </filter-class> <Init-Param> <amamname> codificación </param-name> <amam-value> UTF-8 </amam-value> </init-param> <Init-param> <Amamname> forceEnning </param-name> <Amam-Value> true </amam-value> </it-param> </filter> <filter-mapping> <filter-name> EncodingFilter </filter-name> <url-pattern>/*</ url-pattern> </filter-mapping> <!-La configuración de revisión de opensessionSonsionSeSwewer para retrasar el cierre de la sesión de la sesión-> <filter> <filter-name> opensessessionInviewFilter </sille-name> <filter-class> org.springframework.orm.hibernate4.support.opensessessionInviewFilter </filter-class> <sit-param> </param-name> singleSession </param-name> <Armarr-Value> true </param-value> </initLe- Param> </aamname> SingleSession </param-name> <Armarr-Value> true </amarr-value> </initLi ServletContext e Inicie la información de configuración de Spring en contextConfigLocation-> <Oyerer> <Oyerer-class> org.springframework.web.context.contextloaderListener </siding-class> </yearner> <!-oyente> <searcher-class> org.ssspingframework.web.context.contextloaderlistener </oyecher-class ClasscLeer < <Servlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <it-param> <amamname> contextconfiglocation </amamname> <!-Aquí está el archivo de configuración de SpringMVC-> <Scalue> classpath: spring-mvc.xml </param-value> </inyel-param> <OAD-ONSTARTUP> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-mapping> <ervlet-name> REST </servlet-name> <url-pattern>*. htmls </url-Pattern> </servlet-mapping> <filter-mapping> <filter-name> openSessionInviewfilter </filter-name> <Url-Tattern>*. Htmls </sul-Tattern> </filter-mapping> <!-Configurar el tiempo de espera de la sesión, en minutos-> <session-config> <session timeOut> 30 </session timeOut> </session-config> <bequey-file-list> <deche-file> /index.jsp </ beating-file> </le bienvenido--file> </web-app>
11. Cree un controlador de capa de control
Control de la capa de control userController
paquete org.andy.work.controller; import java.util.list; import org.andy.work.entity.acctuser; importar org.andy.work.service.userservice; import org.apache.log4j.logger; import og.springframework.beans.annotation.autowired; importar; import org. org.springframework.web.bind.annotation.ResponseBody;/** * Tiempo de creación: 2015-2-7 11:49:00 AM * @author Andy * @version 2.2 * Descripción: controlador de usuario */ @controlador @requestmapping ("/user") Class de clase pública Eercoller {logger final de logger final de logger de logger. @AutoWired private UserSerervice UserService; @RequestMapp ("/showInfo/{userId}") Cadena pública showUserInfo (modelMap modelMap, @PathVariable String UserId) {logger.info ("Query User:" + userId); Acctuser userInfo = Userservice.load (userId); modelmap.addattribute ("UserInfo", UserInfo); return "/user/showInfo"; } @RequestMapping ("/showinfos") public @ResponseBody List <AcCtuser> showUserInfos () {logger.info ("consulta a todos los usuarios del usuario"); Lista <AcCtuser> userInfos = Userservice.findall (); devolver 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. ¡Gracias por su apoyo para este sitio!