SSM (Spring+SpringMVC+MyBatis), actualmente una solución de arquitectura de nivel empresarial relativamente convencional. El modelo de diseño MVC estándar divide todo el sistema en cuatro capas: capa de visualización, capa de controlador, capa de servicio y capa DAO. SpringMVC se usa para ser responsable de la gestión de reenvío y vista de solicitud, Spring implementa la gestión de objetos comerciales y MyBatis se utiliza como motor de persistencia del objeto de datos.
1. Detalles del marco
Spring es un marco de desarrollo Java ligero creado para resolver la complejidad del desarrollo de aplicaciones empresariales. El propósito de Spring no se limita al desarrollo del lado del servidor. Desde una simplicidad, probabilidad y una perspectiva de acoplamiento suelto, cualquier aplicación de Java puede beneficiarse de la primavera. En pocas palabras, Spring es un marco de contenedor de control de inversión ligero (COI) y orientado a tangentes (AOP)
SpringMVC es un producto posterior de Springframework, que separa los roles de los controladores, objetos modelo, despachadores y objetos de controladores. Esta separación los hace más fáciles de personalizar.
MyBatis es un marco de capa de persistencia basado en Java. MyBatis proporciona un marco de capa de persistencia que incluye mapas SQL y objetos de acceso a datos (DAO) que elimina la configuración manual de casi todos los códigos y parámetros JDBC y la recuperación de conjuntos de resultados. Mybatis mapas interfaces y java para registrar en bases de datos utilizando XML o anotaciones simples para la configuración y el mapeo sin procesar
2. Cree un proyecto Maven
1. Cree un proyecto usando Maven en Eclipse
2. Presione el siguiente valor predeterminado
3. Después de encontrar Maven-Archetype-WebApp, haga clic en Siguiente
4. Complete la información correspondiente. GroupID es el identificador único de la organización del proyecto, que en realidad corresponde a la estructura del paquete Java. ArtifactID es el identificador único del proyecto. El nombre del proyecto correspondiente real es el nombre del Directorio Root del Proyecto. Después de completar el paquete, puede crear un paquete para usted de forma predeterminada, y está bien no escribirlo.
5. El directorio recién construido es el siguiente
6. Maven estipula que se debe agregar la siguiente carpeta de origen:
src/main/recursos
src/main/java
src/test/recursos
src/test/java
Antes de este paso, es mejor hacer clic con el botón derecho en el proyecto y seleccionar propiedades, luego haga clic en la ruta de compilación de Java, en Bibliotecas, editar la biblioteca del sistema JRE y seleccionar JRE predeterminado del espacio de trabajo.
7. Cambie las rutas de salida por separado, y la relación correspondiente es la siguiente:
8. Convierta el proyecto en proyecto web dinámico, haga clic con el botón derecho en las propiedades en el proyecto y seleccione facetas del proyecto a la izquierda.
9. Establezca la ruta de publicación de archivos durante la implementación y elimine los dos elementos de prueba, porque la prueba se usa para la prueba y no requiere implementación.
Configuración Publicar el paquete JAR de Maven a Lib. Agregar -> Entradas de ruta de construcción de Java -> dependencias de maven -> terminar
3. Maven presenta los paquetes de jarra requeridos
<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> <MoupRoMid> com.ingjun.test </groupid> <artifactId> tradingstate </artifactid> <calage> war </paquete> <verase 2.0.1 </versión> <propias> <propiedades> <Project.Build.SourceEncoding> Utf-8 </project.build.build.build.build.timestamp.format> yyyymmddhmmss </maven.build.timestamp.format> <spring.version> 3.2.9.Release </spring.version> <mybatis.version> 3.1.1 </mybatis.version> <mybatisspring.version> 1.1.1 </mybatisspring.version> </propiences> <pendencies> <pendency> <proupid> org.springframework </groupid> <artifactid> treing-core </artifactid> <verserse </pendency> <ependency> <uproupid> org.springframework </groupid> <artifactid> spring-webmvc </arfactid> <version> $ {spring.version} </versión> </pendency> <pendency> <grupo> org.springframework </groupid> <artifactid> spring-test </artifactid> <versión> $ {spring.version} </versión> </pendency> <epardency> <uproupid> org.mybatis </groupid> <artifactid> mybatis </artifactid> <versión> $ {mybatis.version} </pone> </dependency> <epardency> <grupid> org.mybatis </groupid>> <artifactid> myBatis-spring </arfactid> <versever> $ {myBAtisspring.version} </versión> </pendency> <pendency> <MoupRupid> mysql </groupId> <artifactId> mysql-connector-java </artactid> <proonsion> 5.1.34 </versión> </ ///////dependente> <pendency> <MoupRid> Junit </proupid> <artifactid> Junit </artifactid> <versión> 4.11 </versions> <cope> test </cope> </pendency> <pendency> <proupid> c3p0 </groupid> <artifactid> c3p0 </artifactid> <verserse- 0.9.1.2 x <MoupRid> org.spectj </proupid> <artifactId> spightjweaver </artifactid> <versions> 1.8.1 </verversion> </pendency> <pendency> <proupid> javax.servlet </groupid> <artifactid> jstl </artifactid> <PROLEPONS> 1.2 </slection> </pendency> <pendency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </pendency> <pendency> <grupid> commons-FileUpload </proupid> <artifactid> commons-FileUpload </artifactid> <version> 1.3.1 </versión> </dependency> <pendency> <proupid> commons-lang </groupid> <artifactid> commons-lang </artifactid> <versersever> </version> </Versión> </Versión> </Dependency> <MoupRid> Commons-Codec </groupid> <artifactid> commons-Codec </artifactid> <versión> 1.9 </versión> </pendency> <pendency> <grupoid> org.apache.httpcomponents </proupid> <ariFactID> httpclient </arfactid> <version> 4.5 </versión> <//dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.10</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.10</version> </dependency> <dependency> <MoupRid> log4j </groupid> <artifactid> log4j </artifactid> <versión> 1.2.17 </versión> </pendency> <pendency> <grupo> com.alibaba </groupid> <artifactid> fastjson </artifactid> <lection> 1.1.41 </presion> </pendency> <pendency> <MoupRid> org.codehaus.jackson </groupid> <artifactid> jackson-mapper-asl </artifactid> <versión> 1.9.13 </versión> </pendency> </dependencias> <construcción> <gotins> <artifactid> maven-compiler-plugin </artifactid> <versever <Actact> 1.7 </gast> </figuration> </tugin> <glugin> <artifactid> maven-war-plugin </arfactid> <verserse> 2.2 </versewers> <necuteation> <verververs> 3.0 </verversion> <FailEnsingWebxml> false </aquetonmissingwebxml> </figuration> </tugin> </plugins> <FinalName> $ {Project.ArtifactId} _ $ {Project.version} _ $ {maven.build.timestamp} </finalName> </struct> </jection>4. Archivos de configuración relacionados e integración del marco SSM
web.xml
<? 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/j2ee" xmlns: web = "http://xmlns.jcp.org/xml/ns/javaee" xsi: schemalocation = "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_2_2_2_2_4SD" Version = "2.4"> <!-Configurar Spring-> <context-param> <amamname> contextConfigLocation </param-name> <amam-value> classpath: spring.xml </param-value> </context-param> <searcher> <eficial-class> org.sspringframework.web.context.contextloaderlistener </oyente-clas < <Oyerer-class> org.springframework.web.util.introspectORCleanupListener </searer-class> </oyinger> <!-configure springmvc-> <ervlet> <servlet-name> springmvc </servlet-name> <ervlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-name> <ervlet-class> org.springframework.weB.servlet.dispatcherservlet </Servlet-Name> <Init-param> <amamname> contextConfigLocation </param-name> <amam-value> classpath: spring-mvc.xml </param-value> </init-param> <load-on-startup> 1 </load on-startup> </servlet> <ervlet-mapping> <ervlet-name> treingmvc </servlet-name> <sl-pattern> </servlet-mapping> <S-Filtro de conjunto de caracteres-> <filter> <filter-name> EncodingFilter </filter-name> <filter-class> org.springframework.web.filter.characteriCoDodingFilter </filter-class> <itparam> <amamname-Name> encoding </param-name> <amam-value> Utff-8 </varam-varam> <amamname> encoder. <Init-param> <amamname> ForceEncoding </param-name> <amam-value> true </am-value> </it-param> </sille> <filter-mapping> <filter-name> encodingfilter </filter-name> <url-pattern>/*</url-pattern> </filter-papping> </beb-app>
primavera.xml
<? 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: mvc = "http://www.springframework.org/schema/mvc" xmlns: context = "http://www.springframework.org/schema/aop" xmlns: tx = "http://wwww.springframework.org//tx" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mv http://www.springframework.org/schema/mvc/spring-Mvc-3.0.xsd http://www.springframework.org/schema/ContextExt http://wwww.springframe. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> <!-escanear el servicio, componentes DAO-> <context: context: componente-scan-backage =" com.ingjun.test "/> <! JDBC.Properites-> <context: Property-placeholder ubicación = "classpath: jdbc.properties" /> <!-data fuente c3p0-> <bean id = "dataSource"> <Property name = "conductClass" valor = "$ {jdbc.drivinClassNNNNEn name = "user" value = "$ {jdbc.username}" /> <propiedad name = "contraseña" value = "$ {jdbc.password}" /> <propiedad name = "maxpoolSize" valor = "$ {c3p0.pool.size.max}" /> <name de propiedad = "minpoolSize" value = "$ {c3p0.pool.size.min}" <propiedad name = "inicialPoolSize" value = "$ {c3p0.pool.size.ini}" /> <propiedad name = "adquirincrement" value = "$ {c3p0.pool.size.increment}" /> < /bean> <!-Session Integrate Spring y myBatis-> <bean id = "sqlsession"> <nombre de propiedad "n. ref = "DataSource"/> <Property name = "configLocation" value = "classpath: spring-mybatis.xml"/> <propiedad name = "mapperlocations" value = "classpath*: com/yingjun/test/mapping/**/*. xml"/> </bean> <bean> <name de propiedad = "basePackage" value = "com, yingjun". <propiedad name = "sqlSessionFactoryBeanName" value = "sqlSessionFactory" /> </ bean> <bean id = "transaccionManager"> <propiedad name = "dataSource" ref = "dataSource" /> </reme> <tx: consejo id = "transaccionAdVice" transaccion-germanager = "transaccionManager"> <tx: atributes> <tx-tx = "addVice" ADD "ADD" ADTA ADMACT propagation = "requerido" /> <tx: método name = "append*" propagation = "requerido" /> <tx: name = "insert*" propagation = "requerido" /> <tx: método name = "salvar*" propagation = "requerido" /> <tx: name = "actualización*" propagation = "requerido" /> <tx: método name = "modify*" propagation = "requerido" name = "edit*" propagation = "requerido" /> <tx: método name = "eliminar*" propagation = "requerido" /> <tx: método name = "remo /> <tx: método name = "find*" propagation = "admites" /> <tx: método name = "load*" propagation = "admite" /> <tx: método name = "load*" propagation = "admite" /> <tx: método name = "búsqueda*" propagation = "admite" /> <tx: method name = "datigrid*" propagation = "apoya" /"Method": "Method": admite Methus name="*" propagation="SUPPORTS" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* com.yingjun.test.service..*Impl.*(..))" /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" /> </aop: config> </le beans>Para reemplazar el código manual de redacción de objetos de acceso a datos (DAOS) utilizando SQLSessionDaosupport o SQLSessionTemplate, MyBatis-Spring proporciona una implementación dinámica de proxy: mappactorybean. Esta clase le permite inyectar directamente la interfaz del mapeador de datos en su bean de capa de servicio. Cuando usa mapeadores, simplemente los llame como lo hace con sus DAO, pero no necesita escribir ningún código de implementación de DAO, porque MyBatis-Spring creará un proxy para usted.
primavera-mybatis.xml
<? xml versión = "1.0" encoding = "utf-8"?> <
primavera-mvc.xml
<? 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: p = "http://www.springframework.org/schema/p" xmlns: context = "http://www.springframework.org/schema/context" xmlns: mvc = "http://www.springframework.org/schema xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/contextExt http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd " Soporte de asignación de mapeo de anotaciones-> <mvc: anotación-conducida /> <!-escanear automáticamente el paquete, haciendo que SpringMVC piense que la clase anotada por @Controller en el paquete es el controlador-> <context: componente-scan base-plackage = "com.yingjun.test.controller" /> <!-Evite descargar archivos cuando sea EEE EJECUTES AJAX y regresar a JSON-JSON--JSON-- id = "mappingjacksonhttpMessageConverter"> <Property name = "SoportedMediatyPes"> <List> <value> text/html; charset = utf-8 </valor> </list> </sperties> </a-bean> <!-Definir el prefije prefix del archivo saltado, ver la configuración del modo-> <!-la configuración aquí está a la configuración aquí es a automáticamente Automáticamente a automáticamente automáticamente Automáticamente Automáticamente a Del método de la acción posterior para convertirse en una dirección de URL disponible-> <Property Name = "Prefix" Value = "/Web-Inf/Jsp/"/> <Property Name = "Suffix" Value = ". Jsp"/> </ Bean> <!-Carga del archivo de configuración, si no usa la carga de archivos, no necesita configurarlo. Por supuesto, si no coincide, entonces no hay necesidad de introducir paquetes de componentes de carga en el archivo de configuración-> <bean id = "multipartresolver"> <!-codificación predeterminada-> <name de propiedad = "defaultEncoding" valor = "utf-8" /> <!-valor máximo de tamaño de archivo-> <name de propiedad = "maxuploadsize" value = "10485760000" /valor de tamaño máximo-<name de propiedad = "maxuploadsize" value = "10485760000" " -> <Property name = "maxInMemorySize" value = "40960"/> </bean> </beans>
Log4J.Properties
JDBC.DrivClassName = com.mysql.jdbc.driver jdbc.Url = jdbc: mysql: //192.168.1.1.194: 3306/test? useUnicode = true & caracteresCoding = utf-8 jdbc.username = root jdbc.password = root c3p0.pool.size.max.max. c3p0.pool.size.min = 5 c3p0.pool.size.ini = 3 c3p0.pool.size.incement = 2
JDBC.Properties
log4j.rootlogger = info, console, depuración, aplicación, error ### Console ### log4j.appender.console = org.apache.log4j.consoleppender log4j.appender.console log4j.appender.console.layout.conversionPattern = %d %p [ %c: %l]- %m %n ### debug ### log4j.appender.debug = org.apache.log4j.dailyrollingfilePepepe log4j.appender.debug.file = log/debug.log log4j.appender. log4j.appender.debug.threshold = debug log4j.appender.debug.datePattern = '. ### App ### log4j.appender.app = org.apache.log4j.dailyrollingfileAppender log4j.appender.app.file = log/app.log log4j.appender.append = true log4j.appender.app.threshold = info log4j.appender.app.dateptern = '.' Yyyyyyyyyyyyyyyyyyyy log4j.appender.app.layout = org.apache.log4j.patternlayout log4j.appender.app.layout.conversionPattern = %d %p [ %c: %l] - %m %n ### error #### log4j.appender.error = org.apache.log4j.dailyRollingFileAppSepeppepepeppepepeppepepePepepepepePepepepeppender log/error.log log4j.appender.error.append = true log4j.appender.error.threshold = error log4j.appender.error.datePattern = '. %P [%C:%L] -%M%N
5. Use el generador MyBatis para crear automáticamente clases de entidad, mapear archivos e interfaces DAO
MyBatis pertenece a un marco de ORM semiautomático, por lo que su trabajo principal es configurar archivos de mapeo de mapeo. Sin embargo, dado que los archivos de mapeo escritos a mano son propensos a los errores, el generador MyBatis se puede usar para generar automáticamente clases de entidad, interfaces DAO y archivos de mapeo de mapeo. Esto ahorra mucho esfuerzo y copia el código generado en el proyecto.
Genere los archivos y frascos necesarios para el código y cree la siguiente estructura del directorio:
Configurar la conexión de base de datos relevante en GeneratorL.xml, y la tabla de la base de datos ya está disponible:
<? xml versión = "1.0" encoding = "utf-8"?> <! DOCTYPE GeneratorConfiguration public "-// mybatis.org//dtd Configuración del generador de MyBatis 1.0 // en" "http://mybatis.org/dtd/mybatis-Generator-config_1_0.dtdd" <200 ; name = "supressallComments" value = "true"/> </commentGenerator> <!-URL de enlace de base de datos, username, contraseña-> <jdbcconnection controlclass = "com.mysql.jdbc.driver" ConnectionUrl = "jdbc: mysql: //192.168.1.194: 3306/noc." Root "root =" root "" </jdbcconnection> <javatyperesolver> <Property name = "forceBigDecimals" value = "false"/> </javatyperesolver> <!-Genere el nombre del paquete y la ubicación del modelo-> <javamodelGenerator TargetPackage = "com.ingjun.test.model" Targetproject = "SRC"> <SREPTHERIAD = "ANABLECAGE" ANABLECAGAG value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- Generate the package name and location of the mapping file --> <sqlMapGenerator targetPackage="com.yingjun.test.mapping" targetProject="src"> <property name="enableSubPackages" value="true" /> </sqlmapGenerator> <!-Genere el nombre del paquete y la ubicación del DAO-> <javaclientGenerator type = "xmlmapper" targetPackage = "com.ingjun.test.dao" targetProject = "src"> <name de la propiedad = "en el valor" valor "valor =" true "/> </javaclientGenerator> <!-la tabla es la tabla de la tabla de la tabla de la tabla es la tabla de la tabla de la tabla. Nombre en la base de datos o en la vista El nombre de nombre de DomainObjectName es el nombre de la clase de entidad -> <table TableName = "Other_List" DomainObjectName = "OtherList" enableCountByExample = "fasle" EntableUpDateByExample = "false" FALSE "EndentELETYExample =" False "EnableByExample =" False "False" False -QuesterId = "" False "EntuendEletyByEmample =" False "EntuendyExample =" false "FALSE" FALSE "FALSE> <FALSE" <FALSE "<FALSE"> <TABLE "> <Anteil"> </contextEil "</context. </GeneratorConfiguration>
Abra la ventana CMD e ingrese la estructura del directorio e ingrese la línea de comando:
java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
Después de completar la ejecución, se generará el modelo y el modelo DAO correspondientes. ¿No es muy bueno?
6. Establezca la capa de servicio y la capa del controlador
paquete com.ingjun.test.service; interfaz pública otros servicei {public String getoterList (); } paquete com.ingjun.test.service; import java.util.arrayList; importar java.util.arrays; import java.util.hashset; import java.util.list; import java.util.map; import java.util.set; import java.util.set; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.stereotype.service; import com.alibaba.fastjson.json; import com.alibaba.fastjson.serializer.serializerFeature; import com.ingjun.test.dao.otherlistmapper; import com.ingjun.test.model.otherlist; import com.ingjun.test.model.otherlistdomain; @Service Public Class OtherserviceImpl implementa OTROSSVICEI {@aUtowired private OtherListMapper OtherListMapper; @Override public String getOterList () {set <string> set = new Hashset <String> (); List <totherlist> list = OtherListMapper.Selectall (); List <OtherListDomain> jsonList = new ArrayList <OtherListDomain> (); for (OTRYLIST OTRO: LIST) {string title = other.gettitle (); if (set.contains (title)) {continuar; } else {list <thereSlist> t_list = new ArrayList <OtherList> (); para (OTROS DATOS DEL ESTADO: LIST) {if (title.equals (data.gettitle ())) {t_list.add (data); }} OTRYLISTDOMIN DOMAIN = new OtherListDomain (); dominio.settitle (título); dominio.setItems (t_list); JSONLIST.Add (dominio); set.add (otro.gettitle ()); }} return json.tojSonstring (jsonList, SerializerFeature.WriteMapnullValue); }} paquete com.ingjun.test.controller; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.stereotype.controller; importar org.springframework.web.bind.annotation.requestMapping; importar org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.fastjson.json; import com.yingjun.test.service.omerservicei; import com.ingjun.test.service.stockstatusservicei; @Controller @RequestMapping (valor = "/") clase pública TSSCONTROLLER {@AUTOWIRED PRIVADO OTROSIVICEI OTROSSVICE; @RequestMapping (value = "/getotherlist", produce = "text/html; charset = utf-8") @ResponseBody private String getOtherSist () {String json = otherservice.getOterList (); regresar json; }} 7. Crea una clase de prueba
import java.util.list; importar org.apache.log4j.logmanager; importar org.apache.log4j.logger; importar org.junit.test; importar org.junit.runner.runwith; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.test.context.contextConfiguration; importar org.springframework.test.context.junit4.springjunit4classrunner; @RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (ubicaciones = {"classpath: spring.xml"}) clase pública testMyBatis {@aUtowired private lourteriServicei servicio; @Test public void test () {String list = servicio.getoterList (); logger.info (lista); }}8. Verifique a través del navegador
http: // localhost: 8080/tzyjstateservice/getotherlist
En este punto, la prueba fue exitosa y se completó la integración de los tres principales marcos SSM. Si tiene alguna otra necesidad, puede continuar agregándolas sobre esta base.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.