I personally like to write comments, and I think highly of the importance of comments in my work, so most of the text is in the comments, and the text outside the code is less, as long as I can understand the key

Take a look at the integrated project catalog (single project, multiple projects will use Maven later)

The five packages correspond to Action, Entity, Mapper (namely DAO, using dynamic proxy), Service and Service implementation class respectively

Related resource files under Resources:

Db. properties: database connection parameter

Log4j. Properties: log

Applicationcontext-dao.xml: Spring and Mybatis integrate some configuration (sqlSessionFactory, mapper configuration) applicationContext-service.xml: spring and Mybatis integrate some configuration (sqlSessionFactory, mapper configuration) applicationContext-service.xml: Business ApplicationContext.xml: Spring core configuration file (which configures some common content, such as data sources and transactions) SpringMVC

Sqlmapconfig. XML: Mybatis global configuration file

 

I won’t go into the simplicity of WebApps

Maven poM:

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  4     <modelVersion>4.0.0</modelVersion>
  5     <groupId>com.lee</groupId>
  6     <artifactId>ssm</artifactId>
  7     <name>maven-ssm-hello</name>
  8     <packaging>war</packaging>
  9     <version>1.0.0-BUILD-SNAPSHOT</version>
 10     <properties>
 11         <java-version>1.7</java-version>
 12         <org.springframework-version>3.2.3.RELEASE</org.springframework-version>
 13         <org.aspectj-version>1.6.10</org.aspectj-version>
 14         <org.slf4j-version>1.6.6</org.slf4j-version>
 15     </properties>
 16     
 17     <dependencies>
 18         <!-- Spring -->
 19         <dependency>
 20             <groupId>org.springframework</groupId>
 21             <artifactId>spring-context</artifactId>
 22             <version>${org.springframework-version}</version>
 23             <exclusions>
 24                 <!-- Exclude Commons Logging in favor of SLF4j -->
 25                 <exclusion>
 26                     <groupId>commons-logging</groupId>
 27                     <artifactId>commons-logging</artifactId>
 28                  </exclusion>
 29             </exclusions>
 30         </dependency>
 31         <dependency>
 32             <groupId>org.springframework</groupId>
 33             <artifactId>spring-webmvc</artifactId>
 34             <version>${org.springframework-version}</version>
 35         </dependency>
 36         <dependency>  
 37             <groupId>org.springframework</groupId>  
 38             <artifactId>spring-jdbc</artifactId>  
 39             <version>${org.springframework-version}</version>  
 40         </dependency>
 41 
 42         <!-- data source: dbcp -->
 43         <dependency>
 44             <groupId>commons-dbcp</groupId>
 45             <artifactId>commons-dbcp</artifactId>
 46             <version>1.4</version>
 47         </dependency>
 48 
 49         
 50         <!-- AspectJ -->
 51         <dependency>
 52             <groupId>org.aspectj</groupId>
 53             <artifactId>aspectjrt</artifactId>
 54             <version>${org.aspectj-version}</version>
 55         </dependency>    
 56         
 57         <!-- Logging -->
 58         <dependency>
 59             <groupId>org.slf4j</groupId>
 60             <artifactId>slf4j-api</artifactId>
 61             <version>${org.slf4j-version}</version>
 62         </dependency>
 63         <dependency>
 64             <groupId>org.slf4j</groupId>
 65             <artifactId>jcl-over-slf4j</artifactId>
 66             <version>${org.slf4j-version}</version>
 67             <scope>runtime</scope>
 68         </dependency>
 69         <dependency>
 70             <groupId>org.slf4j</groupId>
 71             <artifactId>slf4j-log4j12</artifactId>
 72             <version>${org.slf4j-version}</version>
 73             <scope>runtime</scope>
 74         </dependency>
 75         <dependency>
 76             <groupId>log4j</groupId>
 77             <artifactId>log4j</artifactId>
 78             <version>1.2.15</version>
 79             <exclusions>
 80                 <exclusion>
 81                     <groupId>javax.mail</groupId>
 82                     <artifactId>mail</artifactId>
 83                 </exclusion>
 84                 <exclusion>
 85                     <groupId>javax.jms</groupId>
 86                     <artifactId>jms</artifactId>
 87                 </exclusion>
 88                 <exclusion>
 89                     <groupId>com.sun.jdmk</groupId>
 90                     <artifactId>jmxtools</artifactId>
 91                 </exclusion>
 92                 <exclusion>
 93                     <groupId>com.sun.jmx</groupId>
 94                     <artifactId>jmxri</artifactId>
 95                 </exclusion>
 96             </exclusions>
 97             <scope>runtime</scope>
 98         </dependency>
 99 
100         <!-- @Inject -->
101         <dependency>
102             <groupId>javax.inject</groupId>
103             <artifactId>javax.inject</artifactId>
104             <version>1</version>
105         </dependency>
106                 
107         <!-- Servlet -->
108         <dependency>
109             <groupId>javax.servlet</groupId>
110             <artifactId>servlet-api</artifactId>
111             <version>2.5</version>
112             <scope>provided</scope>
113         </dependency>
114         <dependency>
115             <groupId>javax.servlet.jsp</groupId>
116             <artifactId>jsp-api</artifactId>
117             <version>2.1</version>
118             <scope>provided</scope>
119         </dependency>
120         <dependency>
121             <groupId>javax.servlet</groupId>
122             <artifactId>jstl</artifactId>
123             <version>1.2</version>
124         </dependency>
125     
126         <!-- mybatis -->  
127         <dependency>  
128             <groupId>org.mybatis</groupId>  
129             <artifactId>mybatis</artifactId>  
130             <version>3.2.3</version>  
131         </dependency>  
132         <dependency>  
133             <groupId>org.mybatis</groupId>  
134             <artifactId>mybatis-spring</artifactId>  
135             <version>1.2.3</version>  
136         </dependency>  
137         <dependency>
138             <groupId>mysql</groupId>
139             <artifactId>mysql-connector-java</artifactId>
140             <version>5.1.38</version>
141         </dependency>
142     
143         <!-- Test -->
144         <dependency>
145             <groupId>junit</groupId>
146             <artifactId>junit</artifactId>
147             <version>4.7</version>
148             <scope>test</scope>
149         </dependency>  
150         
151         <dependency>  
152             <groupId>com.alibaba</groupId>  
153             <artifactId>druid</artifactId>  
154             <version>1.0.18</version>  
155         </dependency>  
156   
157         <dependency>  
158             <groupId>org.aspectj</groupId>  
159             <artifactId>aspectjweaver</artifactId>  
160             <version>1.7.2</version>  
161         </dependency>  
162         <dependency>  
163             <groupId>com.alibaba</groupId>  
164             <artifactId>fastjson</artifactId>  
165             <version>1.1.34</version>  
166         </dependency>  
167         <dependency>  
168             <groupId>com.fasterxml.jackson.core</groupId>  
169             <artifactId>jackson-core</artifactId>  
170             <version>2.2.2</version>  
171         </dependency>  
172         <dependency>  
173             <groupId>com.fasterxml.jackson.core</groupId>  
174             <artifactId>jackson-databind</artifactId>  
175             <version>2.2.2</version>  
176         </dependency>  
177               
178     </dependencies>
179     
180     <build>
181         <plugins>
182             <plugin>
183                 <artifactId>maven-eclipse-plugin</artifactId>
184                 <version>2.9</version>
185                 <configuration>
186                     <additionalProjectnatures>
187                         <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
188                     </additionalProjectnatures>
189                     <additionalBuildcommands>
190                         <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
191                     </additionalBuildcommands>
192                     <downloadSources>true</downloadSources>
193                     <downloadJavadocs>true</downloadJavadocs>
194                 </configuration>
195             </plugin>
196             
197             <plugin>
198                 <groupId>org.apache.maven.plugins</groupId>
199                 <artifactId>maven-compiler-plugin</artifactId>
200                 <version>2.5.1</version>
201                 <configuration>
202                     <source>1.7</source>
203                     <target>1.7</target>
204                     <compilerArgument>-Xlint:all</compilerArgument>
205                     <showWarnings>true</showWarnings>
206                     <showDeprecation>true</showDeprecation>
207                 </configuration>
208             </plugin>
209             
210             <plugin>
211                 <groupId>org.codehaus.mojo</groupId>
212                 <artifactId>exec-maven-plugin</artifactId>
213                 <version>1.2.1</version>
214                 <configuration>
215                     <mainClass>org.test.int1.Main</mainClass>
216                 </configuration>
217             </plugin>
218         </plugins>
219     </build>
220 </project>Copy the code

Related resource documents:

SqlMapConfig.xml

1 <? The XML version = "1.0" encoding = "utf-8"? 2 > <! DOCTYPE configuration 3 PUBLIC "- / / mybatis.org//DTD Config / 3.0 / EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd" > 5 <configuration> 6 7 <! -- Define aliases --> 8 <typeAliases> 9 <! 10 name: Specify the package name, alias all poJOs under the package, 11 --> 12 <package name="com.mybatis. Bean "/> 13 </typeAliases> 14 15 </configuration>Copy the code

 

applicationContext-dao.xml

1 <? The XML version = "1.0" encoding = "utf-8"? > 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> 7 <! DataSource ="dataSource" /> 9 <! -- configuration SqlMapConfig. XML - > 10 < property name = "configLocation" value = "classpath: mybatis/SqlMapConfig. XML" / > 11 < / bean > 12 13 <! -- use mapper batch scanner to scan mapper interface. Mapper. XML has the same name as mapper. Java and is scanned under the same package 16 mapper is automatically registered with the Spring container. Bean id is the name of the class (first letters lowercase) 17-18 > < bean class = "org. Mybatis. Spring. Mapper. MapperScannerConfigurer" > and <! -- -- > configuration session factory 20 < property name = "sqlSessionFactoryBeanName" value = "sqlSessionFactoryBean" > < / property > and <! 23 If there are multiple mapper packets, <property name="basePackage" value="com.lee.ssm.dao.mapper"></property> 26 </bean> 27 28 </beans>Copy the code

 

Applicationcontext-service.xml (this file can be omitted if you prefer to use annotations)

1 <? The XML version = "1.0" encoding = "utf-8"? > 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <! -- User management --> 7 <! -- <bean id="userService" class="com.lee.ssm.service.impl.UserServiceImpl" /> --> 8 </beans>Copy the code

 

applicationContext.xml

1 <? The XML version = "1.0" encoding = "utf-8"? > 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4  xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:aop="http://www.springframework.org/schema/aop" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/aop http://www.springframework.org/schema/context/spring-context-3.2.xsd 10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 11 12 http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <! Placeholder location="classpath:db.properties" /> 14 <! - use a third-party database connection pool DBCP - > 15 < bean id = "dataSource" class = "org.apache.com mons. DBCP. BasicDataSource" destroy - method = "close" >  16 <property name="driverClassName" value="${jdbc.driver}" /> 17 <property name="url" value="${jdbc.url}" /> 18 <property name="username" value="${jdbc.username}" /> 19 <property name="password" value="${jdbc.password}" /> 20 <! -- It is recommended to set the maximum number of database connections to be small enough in the development stage. <property name="maxActive" value="${jdbc.maxActive}" /> 22 <property name="maxIdle" value="${jdbc.maxIdle}" /> 23 </bean> 24 25 <! <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 29 <! DataSource ="dataSource"/> 31 </ dataSource > 32 32 <! <tx:advice ID ="txAdvice" transaction-manager="transactionManager"> 35 <! 38 REQUIRED: Support the current transaction. If there is no transaction, create a new one. This is the most common choice. 39 SUPPORTS the current transaction. If there is no transaction, it is executed in a non-transactional manner. 40 MANDATORY: The current transaction is supported. If no transaction is currently available, an exception is thrown. 41 REQUIRES_NEW: Creates a transaction and suspends the current transaction if one exists. 42 NOT_SUPPORTED: Executes an operation in a non-transactional manner and suspends the current transaction if one exists. 43 NEVER: Executes in non-transaction mode. If a transaction exists, an exception is thrown. 44 NESTED: Supports the current transaction. If the current transaction exists, a NESTED transaction is executed. If no transaction exists, a new transaction is created. 45 ** This configuration will affect the data store and must be selected based on the situation. 46 --> 47 <tx:attributes> 48 <! -- 49 name: range of target methods, for example: save* is all method names starting with save (saveUser, saveStudent...) 50 Isolation: Isolation level of the database, which is the default value and affects database performance. 51 Read -only: true Read -only transaction false Read - and - write transaction 52 Propagation: Propagation properties of transactions, <tx:method name="save*" Propagation ="REQUIRED"/> 55 <tx:method name="insert*" propagation="REQUIRED"/> 56 <tx:method name="update*" propagation="REQUIRED"/> 57 <tx:method name="delete*" propagation="REQUIRED"/> 58 <tx:method name="display*" propagation="REQUIRED"/> 59 <tx:method name="find*" propagation="SUPPORTS" read-only="true"/> 60 <tx:method name="get*" propagation="SUPPORTS" read-only="true"/> 61 <tx:method name="select*" propagation="SUPPORTS" read-only="true"/> 62 </tx:attributes> 63 </tx:advice> 64 65 <! -- AOP configuration --> 66 <aop:config> 67 <! - aop advice - > 68 < aop: advisor advice - ref = "txAdvice pointcut" = "execution (* com. Lee. SSM. Service. Impl. *. * (..) )"/> 69 </aop:config> 70 71 </beans>Copy the code

 

springmvc.xml

1 <? The XML version = "1.0" encoding = "utf-8"? > 2 <beans:beans xmlns="http://www.springframework.org/schema/mvc" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:beans="http://www.springframework.org/schema/beans" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 7  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 9 10 <! 11 <context:component-scan base-package="com.lee. SSM "/> 12 13 <annotation-driven /> 14 15 <resources mapping="/resources/**" location="/resources/" /> 16 17 <! -- 18 View parser, parse JSP, default JSTL, The lib involves 19 - > < 20 beans: bean class = "org. Springframework. Web. Servlet. The InternalResourceViewResolver" > 21 <beans:property name="prefix" value="/WEB-INF/views/" /> 22 <beans:property name="suffix" value=".jsp" /> 23 </beans:bean> 24 25 26 27 </beans:beans>Copy the code

 

db.properties

1 jdbc.driver=com.mysql.jdbc.Driver
2 jdbc.url=jdbc:mysql://localhost:3306/order
3 jdbc.username=root
4 jdbc.password=root
5 jdbc.maxActive=3
6 jdbc.maxIdle=1Copy the code

 

HelloController.java

1 package com.lee.ssm.action; 2 3 import javax.annotation.Resource; 4 5 import org.springframework.stereotype.Controller; 6 import org.springframework.ui.Model; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 9 import com.lee.ssm.bean.User; 10 import com.lee.ssm.service.IUserService; 11 12 /** 13 * 14 * @Title: HelloController.java 15 * @Package com.lee.ssm.action 16 * @Description: TODO 17 * Copyright: Copyright (c) 2016 18 * Company: Nathan. Lee. Salvatore 19 20 * * @ author leechenxiang 21 * @ date on March 25, 2016 10:34:51 22 in the afternoon * @version V1.0 23 */ 24 @controller 25 @requestMapping ("/root") 26 public class HelloController {27 28 @resource 29 private IUserService userService; 30 31 /** 32 * 33 * @Description: TODO 34 * @param Model 35 * @return 36 * @throws Exception 37 * 38 * @author Leechenxiang 39 * @date March 25, 2016 10:36:49 PM 40 */ 41 @requestMapping (value = "/hello") 42 Public String HOME (Model Model) throws Exception {43 44 User user = userService.findUserById(1); 45 model.addAttribute("username", user.getName()); 46 47 return "home"; 48} 49 50}Copy the code

 

User.java

1 package com.lee.ssm.bean; 2 3 public class User { 4 5 private int id; 6 private String username; 7 private int age; 8 private String sex; 9 10 public User() { 11 super(); 12 } 13 14 public User(String username, int age, String sex) { 15 super(); 16 this.username = username; 17 this.age = age; 18 this.sex = sex; 19 } 20 21 public int getId() { 22 return id; 23 } 24 public void setId(int id) { 25 this.id = id; 26 } 27 public String getName() { 28 return username; 29 } 30 public void setName(String username) { 31 this.username = username; 32 } 33 public int getAge() { 34 return age; 35 } 36 public void setAge(int age) { 37 this.age = age; 38 } 39 public String getSex() { 40 return sex; 41 } 42 public void setSex(String sex) { 43 this.sex = sex; 44 } 45 46 @Override 47 public String toString() { 48 return "User [id=" + id + ", name=" + username + ", age=" + age + ", sex=" 49 + sex + "]"; 50} 51 52}Copy the code

 

UserMapper.xml

1 <? The XML version = "1.0" encoding = "utf-8"? 2 > <! 3 PUBLIC DOCTYPE mapper "- / / mybatis.org//DTD mapper / 3.0 / EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 5 6 <mapper namespace="com.lee.ssm.dao.mapper.UserMapper" > 7 8 <select id="findUserById" parameterType="int" resultType="com.lee.ssm.bean.User"> 9 SELECT * FROM USER WHERE id = #{id} 10 </select> 11 12 <insert id="insertUser" parameterType="com.lee.ssm.bean.User"> 13 insert into user(username,sex) values(#{name},#{sex}) 14 </insert> 15 16 <delete id="deleteUser" parameterType="int"> 17 delete from user where id=#{id} 18 </delete> 19 20 <update id="updateUser" parameterType="com.lee.ssm.bean.User"> 21 update user set username=#{name},sex=#{sex} where id=#{id} 22 </update> 23 24 </mapper>Copy the code


UserMapper.java

1 package com.lee.ssm.dao.mapper; 2 3 import com.lee.ssm.bean.User; 4 5 public interface UserMapper { 6 7 public User findUserById(int id) throws Exception; 8 9 public Integer insertUser(User user) throws Exception; 10 11 public void deleteUser(int id) throws Exception; 12 13 public void updateUser(User user) throws Exception; 14}Copy the code

 

IUserService.java

1 package com.lee.ssm.service; 2 3 import com.lee.ssm.bean.User; 4 5 public interface IUserService { 6 7 public User findUserById(int id) throws Exception; 8 9 public void displayUser() throws Exception; 10 of 11}Copy the code

 

UserServiceImpl.java

1 package com.lee.ssm.service.impl; 2 3 import javax.annotation.Resource; 4 5 import org.springframework.stereotype.Service; 6 7 import com.lee.ssm.bean.User; 8 import com.lee.ssm.dao.mapper.UserMapper; 9 import com.lee.ssm.service.IUserService; 10 11 @Service("userService") 12 public class UserServiceImpl implements IUserService { 13 14 @Resource 15 private UserMapper userMapper; 16 17 @Override 18 public User findUserById(int id) throws Exception { 19 return userMapper.findUserById(id); 20 } 21 22 @Override 23 public void displayUser() throws Exception { 24 25 User u1 = new User("nathan.lee.salvatore", 18, "female"); 26 userMapper.insertUser(u1); 27 28 userMapper.deleteUser(1001); 29 30 // int a = 1 / 0; 31 32 User u2 = new User("lee", 22, "male "); 33 u2.setId(16); 34 userMapper.updateUser(u2); 36 36} 37 38}Copy the code

 

web.xml

1 <? The XML version = "1.0" encoding = "utf-8"? < > 2 web - app version = "2.5" XMLNS = "http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 5 6 <! Load the Spring container. Wildcard load the spring configuration file --> 7 <context-param> 8 <param-name>contextConfigLocation</param-name> 9 <param-value>classpath:spring/applicationContext.xml, classpath:spring/applicationContext-*.xml</param-value> 10 </context-param> 11 <listener> 12 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 13 </listener> 14 15 <! -- Post garble processing --> 16 <filter> 17 <filter-name>CharacterEncodingFilter</filter-name> 18 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 19 <init-param> 20 <param-name>encoding</param-name> 21 <param-value>utf-8</param-value> 22 </init-param> 23 </filter> 24 <filter-mapping> 25 <filter-name>CharacterEncodingFilter</filter-name> 26 <url-pattern>/*</url-pattern> 27 </filter-mapping> 28 29 <! -- Front-end controller --> 30 <servlet> 31 <servlet-name> SpringMVC </servlet-name> 32 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 33 <init-param> 34 <! -- contextConfigLocation specifies the spring MVC global configuration file. If contextConfigLocation is not specified, the default configuration file name is: Servlet name+"-servlet.xml" 37 --> 38 <param-name>contextConfigLocation</param-name> 39 <param-value>classpath:spring/springmvc.xml</param-value> 40 </init-param> 41 <! -- The container loads and initializes the servlet when the application starts --> 42 <load-on-startup>1</load-on-startup> 43 </servlet> 44 45 <servlet-mapping> 46 <servlet-name>springmvc</servlet-name> 47 <url-pattern>/</url-pattern> 48 </servlet-mapping> 49 50 </web-app>Copy the code

 

home.jsp

1 <? The XML version = "1.0" encoding = "utf-8"? > 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <! PUBLIC DOCTYPE HTML "- / / / / W3C DTD XHTML 1.0 Transitional / / EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > 5 <html xmlns="http://www.w3.org/1999/xhtml" 6 xmlns:f="http://java.sun.com/jsf/core" 7 xmlns:h="http://java.sun.com/jsf/html"> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 10 <title>Insert title here</title> 11 </head> 12 <body> 13 user's name is: 14 <font color="red">${username }</font> 15 </body> 16 </html>Copy the code

 

Start tomcat, test address: http://localhost:8080/ssm/root/hello

 

Github: github.com/leechenxian…