SSM (Spring+SpringMVC+Mybatis), 현재 비교적 주류 엔터프라이즈 수준 아키텍처 솔루션입니다. 표준 MVC 설계 모델은 전체 시스템을 디스플레이 레이어, 컨트롤러 계층, 서비스 계층 및 DAO 계층의 네 개의 레이어로 나눕니다. SpringMVC는 요청 전달 및보기 관리를 담당하는 데 사용되며 Spring은 비즈니스 객체 관리를 구현하며 MyBatis는 데이터 객체 지속성 엔진으로 사용됩니다.
1. 프레임 세부 사항
Spring은 엔터프라이즈 애플리케이션 개발의 복잡성을 해결하기 위해 만들어진 가벼운 Java 개발 프레임 워크입니다. Spring의 목적은 서버 측 개발에만 국한되지 않습니다. 단순성, 테스트 가능성 및 느슨한 커플 링 관점에서 모든 Java 응용 프로그램은 스프링의 혜택을받을 수 있습니다. 간단히 말해, Spring은 가벼운 반전 제어 (IOC) 및 탄젠트 지향 (AOP) 컨테이너 프레임 워크입니다.
SpringMVC는 SpringFramework의 후속 제품으로 컨트롤러, 모델 객체, 디스패처 및 처리기 객체의 역할을 분리합니다. 이 분리는 더 쉽게 사용자 정의 할 수있게합니다.
Mybatis는 Java 기반 지속성 계층 프레임 워크입니다. MyBatis는 SQL 맵 및 데이터 액세스 개체 (DAO)를 포함한 지속성 계층 프레임 워크를 제공하여 거의 모든 JDBC 코드 및 매개 변수의 수동 설정과 결과 세트 검색을 제거합니다. MyBatis는 단순한 XML 또는 구성 및 원시 매핑을 사용하여 데이터베이스의 레코드에 인터페이스 및 Java를 맵핑합니다.
2. Maven 프로젝트를 만듭니다
1. Eclipse에서 Maven을 사용하여 프로젝트를 만듭니다
2. 다음 기본값을 누릅니다
3. Maven-Archetype-Webapp을 찾은 후 다음을 클릭하십시오
4. 해당 정보를 작성하십시오. GroupID는 프로젝트 조직의 고유 식별자이며 실제로 Java 패키지 구조에 해당합니다. Artifactid는 프로젝트의 고유 식별자입니다. 실제 해당 프로젝트의 이름은 프로젝트 루트 디렉토리의 이름입니다. 패키지를 채우면 기본적으로 패키지를 만들 수 있으며 작성하지 않아도됩니다.
5. 새로 제작 된 디렉토리는 다음과 같습니다
6. Maven은 다음 소스 폴더를 추가해야한다고 규정합니다.
SRC/메인/리소스
SRC/메인/자바
SRC/테스트/리소스
SRC/Test/Java
이 단계 전에 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택한 다음 Java 빌드 경로를 클릭하고 라이브러리 아래에서 JRE 시스템 라이브러리를 편집하고 작업장 기본 JRE를 선택하는 것이 가장 좋습니다.
7. 출력 경로를 별도로 변경하면 해당 관계는 다음과 같습니다.
8. 프로젝트를 동적 웹 프로젝트로 변환하고 프로젝트의 속성을 마우스 오른쪽 버튼으로 클릭 한 후 왼쪽에서 프로젝트 측면을 선택하십시오.
9. 배포 중에 파일 게시 경로를 설정하고 테스트에 사용되며 배포가 필요하지 않기 때문에 두 가지 테스트 항목을 삭제하십시오.
설정 설정 Maven의 JAR 패키지를 LIB에 게시합니다. 추가 -> Java 빌드 경로 항목 -> Maven 종속성 -> 마무리
3. Maven은 필요한 JAR 패키지를 소개합니다
<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/0.0.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <modelversion> 4.0.0 </modelversion> <groupid> com.yingjun.test </groupid> <artifactid> tradingstate </artifactid> <parkaging> war </packaging> 2.0.1 </version> <properies> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <maven.build.timestamp.format> yyyymmddhhmmss </maven.build.timestamp.format> <spring.version> 3.2.9.release> <mybatis.version> 3.1.1 </mybatis.version> <mybatisspring.version> 1.1.1 </mybatisspring.version> </properties> <pectioniles> <pectionency> <groupId> org.springframework </groupid> <artifactid> spring-core </artifactid> <version> $ {spring </의존성> <pectionency> <groupId> org.springframework </groupid> <artifactid> spring-webmvc </artifactid> <version> $ {spring.version} </version> </dependency> <groupid> org.springframwork </groupid> <artifactid> spring-test> <버전> $ {spring.version} </version} </version> </dependency> <pectionency> <groupid> org.mybatis </groupid> <artifactid> mybatis </artifactid> <버전> $ {mybatis.version} </version> </dependency> <groupid> org.mybatis </groupid> <artifactid> mybatis-spring </artifactid> <버전> $ {mybatisspring.version} </version> </dependency> <pectionement> <groupid> mysql </groupId> <artifactID> mySQL-connector-java </artifactid> version> 5.1.34 </dependency> <groupid> junit </groupid> <artifactid> junit </artifactid> <bersion> 4.11 </version> <scope> test </scope> </fectionency> <pectionency> <groupid> c3p0 </groupid> <artifactid> c3p0 </artifactid> <bersion> 0.9.1.2 </version> <pelection> <groupid> org.aspectj </groupid> <artifactid> Sageweaver </artifactid> <bersion> 1.8.1 </version> </fectionement> <pectionement> <groupid> javax.servlet </groupid> <artifactid> jstl </artifactid> <2 </dependency> <pelection> <groupid> javax.servlet </groupid> <artifactid> servlet-api </artifactid> <bersion> 3.0 </version> <cope> 제공 </scope> </fectionency> <prectionency> <groupid> javax.servlet.jsp </groupid> <artifactid> jsp-api </artifactid> </의존성> <pectionency> <groupId> Commons-FileUpload </groupId> <artifactID> Commons-FileUpload </artifactid> <version> 1.3.1 </version> </fectionency> <groupID> Commons-lang </groupId> <artifactID> Commons-lang </infection> 2.6 </version> 2.6 </version> </version> </version> </version> </version> </version. <groupId> Commons-Codec </groupid> <trifactid> Commons-Codec </artifactid> <bersion> 1.9 </version> </fextency> <pectionency> <groupid> org.apache.httpcomponents </groupid> <atifactid> httpclient </arepictid> 4.5 </dependency> </dependency> </version> </version> </version> <groupid> org.slf4j </groupid> <artifactid> slf4j-api </artifactid> <bersion> 1.7.10 </version> </fectionency> <prectionency> <groupid> org.slf4j </groupid> <artifactid> slf4j-log4j12 </artifactid> 1.7.10 </version> 1.7.10. <groupid> log4j </groupid> <artifactid> log4j </artifactid> <bersion> 1.2.17 </version> </dependency> <pectionency> <groupid> com.alibaba </groupid> <artifactid> fastjson </artifactid> <bers> 1.1.41 </delation> <pelection> <groupid> org.codehaus.jackson </groupid> <artifactid> Jackson-mapper-asl </artifactid> <bersion> 1.9.13 </version> </dectientency> </fectionencies> <build> <plugins> <artifactid> maven-compiler-plugin </artifactid> 2.3.2 </version> <source> </version>. <garget> 1.7 </target> </configuration> </plugin> <플러그인> <artifactid> maven-war-plugin </artifactid> <version> 2.2 </version> <configuration> <버전> 3.0 </version> <feaelonmissingwebxml> false </failonmissingwebxml> </configuration> </configuration> </configuration> <Finalname> $ {project.artifactid} _ $ {project.version} _ $ {maven.build.timestamp} </finalname> </build> </project>4. 관련 구성 파일 및 SSM 프레임 워크의 통합
web.xml
<? 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/j2ee" xmlns : web = "http://xmlns.jcp.org/xml/ns/javaee"xsi : schemalocation = "http://java.sun.com/xml/ns/j2ee http://java.s.com/xml/ns/j2ee/web-pop_4.wep_2_4. version = "2.4"> <!-Spring을 구성합니다-> <countxt-param> <Param-name> ContextConfigLocation </param-value> classPath : spring.xml </param- value> </context-param> <layer> <liseer-class> org.springframework.weaterclass> </larkeer> <!-스프링 메모리 오버플로 리스너 방지-> <layer> <Leater-Class> org.springframework.web.util.introspectorcleanUplistener </laiseer-class> <!-스프링 메모리 오버 플로우 리스너 방지-> <lariser> <Leater-Class> org.springframework.web.util.introspectorcleanUplistener </laiseer-class> </liareer> <!-springmvc-> <servlet> <servlet-name> springmvc </servlet-name> <servlet-class> org.springframewort.wepllet.disportorververcervlet>를 구성하십시오 <init-param> <param-name> contextConfigLocation </param-name> <param- value> classpath : spring-mvc.xml </param-mvc.xml </param- value> </init-param> <load-on-startup> 1 </servlet-mapping> <servlet-mapping> <servlet-name> </servletn>/servlet-name> </servlet-mapping> <!-문자 세트 필터-> <filter> <filter-name> encodingfilter </filter-name> <filter-class> org.springframework.web.filter.characterencodingfilter </filter-class> <init-param> <param-name> encoding </param-name> </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> </web-mapping>
Spring.xml
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xmlns : mvc = "http://www.springframework.org/schema/mvc"xmlns : context = "http://www.springframework.org/schema/schema/aop"xmlns : tx = "http://www.spramframwork.org/schema/org/schema/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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/sprging-context-3 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://wwwww.spramegme http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> <!-스캔 서비스, dao 구성 요소-> 컨텍스트 : component-scan base-package ="com.yingjun.test "/> <!-분해 jdbc.properites-> <context : Property-holholder 위치 = "classPath : jdbc.properties" /> <!-데이터 소스 c3p0-> <bean id = "dataSource"> <property name = "driver class"value = "$ {jdbc.driverclassname}" /> <속성 이름 = "jdbcurl"value = "$ jdbc.url}" /> <property name = "user" value = "$ {jdbc.username}" /> <속성 이름 = "password"value = "$ {jdbc.password}" /> <속성 이름 = "maxpoolsize"value = "$ {c3p0.pool.size.max}" /> <property name = "minpoolsize"{c3p0.poool.pole.p0.size. 이름 = "InitialPoolSize"value = "$ {c3p0.pool.pool.size.ini}" /> <property name = "acquireIncrement"value = "$ {c3p0.pool.size.increment}" /> < /> < /> < /> < /> < /> < /bean> <bean id = "sqlsessionceforcory"> sqlsessionceforcor "> sqlsessiont. ref = "dataSource"/> <property name = "configlocation"value = "classpath : spring-mybatis.xml"/> <property name = "mapperlocations"value = "classpath*: com/yingjun/test/맵핑/**/*. 이름 = "sqlsessionCactoryBeanName"value = "sqlsessionFactory" /> < /bean> <bean id = "transactionManager"> <속성 이름 = "dataSource"ref = "dataSource" /> < /bean> <TX : 조언 Id = "transactionAdvice"transaction-manager = "transactionManager"> <tx : <tx : method> 전파 = "필수" /> <tx : 메소드 이름 = "Append*"propagation = "필수" /> <tx : 메소드 이름 = "삽입*"전파 = "필수" /> <tx : "save*"propagation = "필수" /> <tx : 메소드 이름 = "propagation ="requagation = "required" /> <tx : methodify*""tx = "tx ="togate*"togate*. 이름 = "edit*"propagation = "필수" /> <tx : 메소드 이름 = "delete*"propagation = "필수" /> <tx : 메소드 이름 = "remove*"propagation = "필수" /> <tx : "method name ="repora "propagation ="required : "delandrepair ="proplagation = "getgagation ="gettagation " />. /> <tx : 메소드 이름 = "find*"propagation = "supports" /> <tx : 메소드 이름 = "load*"propagation = "supports" /> <tx : method name = "load*"propagation = "supports" /> <tx : 메소드 이름 = "search*"propagation = "supports" /> <tx : datagrid*"supporation ="supporation = "supporation ="supporation = "supporation ="supporation = "supporation ="supporation = "supplagation ="supplagation = "supporation ="tx*" name = "*"propagation = "supports" /> < /tx : attributes> < /tx : 조언> <aop : config> <aop : pointcut id = "transactionpointcut"expression = "execution (*com.yingjun.test.service .. /> </aop : config> </beans>sqlsessiondaosupport 또는 sqlsessiontemplate을 사용하여 DAOS (Data Access Objects) 작성 수동 코드를 교체하기 위해 MyBatis-Spring은 동적 프록시 구현을 제공합니다 : MapPerfactoryBean. 이 클래스를 사용하면 데이터 맵퍼 인터페이스를 서비스 계층 Bean에 직접 주입 할 수 있습니다. Mappers를 사용할 때는 DAO와 같이 전화를 걸지만 Mybatis-Spring이 프록시를 만들기 때문에 DAO 구현 코드를 작성할 필요는 없습니다.
Spring-mybatis.xml
<? xml version = "1.0"alcoding = "utf-8"?> <! docType configuration public "-// mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <! <!
Spring-mvc.xml
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.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.springframwork.org/schema/mvc.org/schema/mvc. xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/contet http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/sprapt 주석 매핑 지원-> <mvc : 주석 구동 /> <!-패키지를 자동으로 스캔하고, 스프링 미트가 패키지 아래에서 @controller가 주석을 달린 클래스가 컨트롤러라고 생각하게합니다 .-> <context : component-scan base-package = "com.yingjun.test.controller" />-ajax를 실행할 때 ajax를 피하고 json ~ j-been을 피하십시오. id = "Mapping JacksonhttpMessageConverter"> <property name = "supportedMediAtypes"> <list> <taluct/html; charset = utf-8 </value> </list> </property> </bean> <!-점프 된 파일의 사전 참조, 뷰 픽스 픽스 픽스 픽스에 대한 정의는 다음과 같은 구성과 함께, 다음과 같은 정의된다. 사용 가능한 URL 주소가되기위한 후속 조치 방법의 문자열-> <property name = "prefix"value = "/web-inf/jsp/"/> <property name = "접미사"value = ". jsp"/> </bean> <!-구성 파일 업로드를 사용하지 않으면 구성 할 필요가 없습니다. 물론 일치하지 않으면 구성 파일에 업로드 구성 요소 패키지를 소개 할 필요가 없습니다.-> <bean id = "multipartresolver"> <!-기본 인코딩-> <속성 인코딩 = "defaultencoding"value = "utf-8" /> <!-<속성 크기 값-> <속성 이름 = "maxuploadsize"1048570000 "" "value" 메모리 -> <속성 이름 = "MaxInMemorySize"value = "40960"/> </bean> </beans>
log4j.properties
jdbc.driverclassname = com.mysql.jdbc.driver jdbc.url = jdbc : mysql : //192.168.1.194 : 3306/test? useUnicode = true & characterencoding = utf-8 jdbc.username = root jdbc.pass.pass.pons.size c3p0.pool.size.min = 5 c3p0.pool.size.ini = 3 c3p0.pool.size.increment = 2
jdbc.properties
log4j.rootlogger = info, console, debug, app, error ### console ### log4j.appender.console = org.apache.log4j.consoleappender log4j.appender.console.target = system.out log4j.appender.console.layout = org.apache.log4j.plantnllonllog4j.plantnllonllog4j.plantnllog4J. log4j.appender.console.layout.conversionpattern = %d %p [ %c : %l]- %m %n ### debug ### log4j.appender.debug = org.apache.log4j.dailyrollingfileappender log4j.appender.debug.file = log.log.log.log.log.log.log.log.log.log.log.log.log.log.log.log.log.log.log.log.log. log4j.appender.debug.threshold = debug log4j.appender.debug.datepattern = '. %m %n ### app ### log4j.appender.app = org.apache.log4j.dailyrollingfileAppender log4j.appender.app.file = log/app.log log4j.appender.app.App.App.Appn = true log4J.appender.app.App.App.App.App.App.App.App.App.App.Appender.App.DatePattern = ''. log4j.appender.app.layout = org.apache.log4j.patternlayout log4j.appender.app.layout.conversionpattern = %d %p [ %c : %l] - %m %n ### 오류 #### yog4j.error = org.apache.log4j.dailyrollingfileoppender log4j. log/erro.log log4j.appender.error.append = true log4j.appender.error.errshold = error log4j.appender.error.datepattern = '.'yyyy-mm-dd log4j.appender.error.layout = org.apache.log4j.patternlayout.erpender.error.layout.conever.conever. %p [%C :%L] -%m%n
5. MyBatis 생성기를 사용하여 엔티티 클래스, 매핑 파일 및 DAO 인터페이스를 자동으로 작성합니다.
Mybatis는 반자동 ORM 프레임 워크에 속하므로 주요 작업은 매핑 매핑 파일을 구성하는 것입니다. 그러나 손으로 쓴 매핑 파일이 오류가 발생하기 쉽기 때문에 MyBatis 생성기를 사용하여 엔티티 클래스, DAO 인터페이스 및 매핑 매핑 파일을 자동으로 생성 할 수 있습니다. 이것은 많은 노력을 절약하고 생성 된 코드를 프로젝트에 복사합니다.
코드에 필요한 파일 및 항아리를 생성하고 다음 디렉토리 구조를 만듭니다.
Generatorl.xml에서 관련 데이터베이스 연결을 구성하고 데이터베이스 테이블이 이미 사용 가능합니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype generatorconfiguration public "-// mybatis.org//dtd mybatis generator configuration 1.0 // en" "http://mybatis.org/dtd/mybatis-conerator-config_1_0.dtd"> 데이터베이스 드라이버-> <classPathentry location = "mysql-connector-java-5.1.34.jar" /> <context id = "db2tables"targetruntime = "mybatis3"> <commentgenerator> <property name = "value ="true " /> <!-exagned ameptrically : no-" value = "true"/> </commentgenerator> <!-데이터베이스 링크 URL, 사용자 이름, 암호-> <jdbcconnection driver class = "com.mysql.jdbc.driver"connectionUrl = "jdbc : mysql : //192.168.1.194 : 3306/noc"root "> in root"> <javatyperesolver> <property name = "forceBigDecimals"value = "false" /> < /javatyperesolver> <!-모델의 패키지 이름과 위치를 생성-> <javamodelgenerator targetpackage = "com.yingjun.test.model"src "<property name = enablesubackages"enablesubackages ""com.yingjun.test.model "src" " 이름 = "trimstrings"value = "true" /> < /javamodelgenerator> <!-매핑 파일의 패키지 이름과 위치를 생성합니다-> <sqlmapgenerator targetpackage = "com.yingjun.test.mapping"targetProject = "src"> <propertion name = "enerpackpackages ="value "! 그리고 dao의 위치-> <javaclientgenerator type = "xmlmapper"targetpackage = "com.yingjun.test.dao"targetproject = "src"> <property name = "enablesubpackages"value = "true" /< /javaclientgenerator> <!-생성 될 테이블의 이름은 Database의 이름입니다. 클래스 이름 -> <table tableName = "Other_List"domainObjectName = "OtherList"enableCountByExample = "Fasle"enableUpdateByexampl = "false"enabledeTeByexampl = "false"enableSelectByexample = "selectbyexamplequeryId ="false "> </context> </generator conconfigation>
CMD 창을 열고 디렉토리 구조를 입력하고 명령 줄을 입력하십시오.
java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
실행이 완료되면 해당 DAO 매퍼 및 모델이 생성됩니다. 아주 좋지 않습니까?
6. 서비스 계층과 컨트롤러 계층을 설정하십시오
패키지 com.yingjun.test.service; public interface OthersErvicei {public String getoTerList (); } 패키지 com.yingjun.test.service; java.util.arraylist 가져 오기; import java.util.arrays; java.util.hashset 가져 오기; Java.util.list 가져 오기; java.util.map import; java.util.set import; java.util.set import; org.springframework.beans.factory.annotation.autowired; org.springframework.stereotyp.service; com.alibaba.fastjson.json import; com.alibaba.fastjson.serializer.serializerfeature import; com.yingjun.test.dao.otherlistmapper import; com.yingjun.test.model.otherlist import; com.yingjun.test.model.otherlistdomain import; @Service public class OtherServiceimpl은 OtherserVicei {@autowired private listmapper otherlistmapper; @override public string getoterlist () {set <string> set = new Hashset <string> (); 목록 <otherList> list = OtherListMapper.selectall (); List <OtherListDomain> JSONLIST = New ArrayList <AteryListDomain> (); for (otherlist other : list) {String title = other.getTitle (); if (set.contains (title)) {계속; } else {list <AterceList> t_list = new ArrayList <AtergleList> (); for (기타리스트 데이터 : list) {if (title.equals (data.getTitle ())) {t_list.add (data); }} OtherListDomain Domain = New OtherListDomain (); Domain.settitle (제목); domain.setitems (t_list); JSONLIST.ADD (도메인); set.add (기타 .getTitle ()); }} return JSON.TOJSONSTRING (jsonList, SerializerFeature.WriteMapNullValue); }} 패키지 com.yingjun.test.controller; org.springframework.beans.factory.annotation.autowired; org.springframework.stereotyp.controller import; org.springframework.web.bind.annotation.requestmapping; org.springframework.web.bind.annotation.responsebody; com.alibaba.fastjson.json import; import com.yingjun.test.service.otherservicei; import com.yingjun.test.service.stockstatusservicei; @Controller @RequestMapping (value = "/") 공개 클래스 tsscontroller {@autowired private OtherServicei OtherService; @requestmapping (value = "/getotherList", produces = "text/html; charset = utf-8") @ResponseBody private string getOtherList () {String json = OthingService.getOterList (); json 리턴; }} 7. 테스트 클래스를 만듭니다
Java.util.list 가져 오기; import org.apache.log4j.logmanager; import org.apache.log4j.logger; import org.junit.test; import org.junit.runner.runwith; org.springframework.beans.factory.annotation.autowired; org.springframework.test.context.contextConfiguration import; org.springframework.test.context.junit4.springjunit4classrunner; @RunWith (SpringJunit4classRunner.class) @ContextConfiguration (위치 = { "ClassPath : Spring.xml"}) 공개 클래스 TestMyBatis {@autowired private oothervicei service; @test public void test () {문자열 list = service.getoTerList (); logger.info (목록); }}8. 브라우저를 통해 확인하십시오
http : // localhost : 8080/tzyjstateservice/getotherlist
이 시점에서 테스트는 성공했으며 세 가지 주요 SSM 프레임 워크의 통합이 완료되었습니다. 다른 요구가 있으면이 기준으로 계속 추가 할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.