zoukankan      html  css  js  c++  java
  • Eclipse 使用Maven整合SSM框架

    Eclipse 使用Maven整合SSM框架

    mavne整合SSM

    0x00 开发环境

    1. Windows 7
    2. Eclipse Java EE IDE for Web Developers Mars.2 Release (4.5.2)
    3. Maven 3.2.2
    4. Spring 4.0.2
    5. Mybatis 3.2.6
    6. Tomcat 7.0
    7. Log4j 1.2.7
    8. MySQL 5.7.17

    版本虽然不是太重要,建议注意一下

    0x01 简介

    本文是在整合SSM框架的时候的一些笔记。项目采用mavne构建,整合了SSM框架,集成了log4j和mysql。

    0x02 创建项目

    选择菜单:

    File -> New -> Other -> Maven -> Maven Project

    点击 Next > ,再点击 Next >

    然后 Next >

    然后点击 Finish ,就生成项目了。如下图一样。

    是不是发现没有 src/main/java 目录,没关系,创建一个。

    选中项目 ,然后选择 New -> Folder

    注意选择 main 目录

    小提示:如果你不小心又把 java 目录给删除了,那么上面这个方法就不行了。

    创建方法: 选中项目 ,然后选择 New -> Source Folder

    建议你删除项目重新创建,因为我没有试过这种方法。

    0x03 添加pom依赖

    直接上代码:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>cn.com.zdr</groupId>
        <artifactId>ssmR</artifactId>
        <packaging>war</packaging>
        <version>0.0.1-SNAPSHOT</version>
        <name>ssmR Maven Webapp</name>
        <url>http://maven.apache.org</url>
        <properties>
            <!-- spring版本号 -->
            <spring.version>4.0.2.RELEASE</spring.version>
            <!-- mybatis版本号 -->
            <mybatis.version>3.2.6</mybatis.version>
            <!-- log4j日志文件管理包版本 -->
            <slf4j.version>1.7.7</slf4j.version>
            <log4j.version>1.2.17</log4j.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.1</version>
                <scope>test</scope>
            </dependency>
            <!-- spring核心包 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-oxm</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!-- mybatis核心包 -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <!-- mybatis/spring包 -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>1.2.2</version>
            </dependency>
            <!-- 导入java ee jar 包 -->
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-api</artifactId>
                <version>7.0</version>
            </dependency>
    
            <!-- 导入Mysql数据库链接jar包 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.36</version>
            </dependency>
            <!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
            <dependency>
                <groupId>commons-dbcp</groupId>
                <artifactId>commons-dbcp</artifactId>
                <version>1.2.2</version>
            </dependency>
    
            <!-- JSTL标签类 -->
            <dependency>
                <groupId>jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <!-- 日志文件管理包 -->
            <!-- log start -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
    
    
            <!-- 格式化对象,方便输出日志 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.1.41</version>
            </dependency>
    
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>${slf4j.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>${slf4j.version}</version>
            </dependency>
            <!-- log end -->
            <!-- JSON -->
            <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-mapper-asl</artifactId>
                <version>1.9.13</version>
            </dependency>
    
        </dependencies>
        <build>
            <finalName>ssmR</finalName>
        </build>
    </project>

    0x04 配置 springMVC

    在 resources 创建 spring-mvc.xml ,内容如下:

    <?xml version="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/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-3.1.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    
        <!-- 解决中文乱码,必须放在<mvc:annotation-driven>之前 -->    
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">    
            <property name="messageConverters">    
                <list>    
                    <bean class="org.springframework.http.converter.StringHttpMessageConverter">    
                        <property name="supportedMediaTypes">    
                            <list>    
                                <value>text/plain;charset=UTF-8</value>  
                                <value>text/html;charset=UTF-8</value>  
                                <value>applicaiton/javascript;charset=UTF-8</value>    
                            </list>    
                        </property>    
                    </bean>    
                </list>    
            </property>    
        </bean> 
        <!-- 使用注解式注入 -->    
        <context:annotation-config />                      
        <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
        <context:component-scan base-package="com.zdr.ssmR" />
        <!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 -->
        <mvc:annotation-driven/>  
    
        <!--避免IE执行AJAX时,返回JSON出现下载文件 -->
        <bean id="mappingJacksonHttpMessageConverter"
              class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                    <value>application/json; charset=UTF-8</value>    
                    <value>application/x-www-form-urlencoded; charset=UTF-8</value> 
                </list>
            </property>
        </bean>
    
        <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 -->
                </list>
            </property>
        </bean>
    
        <!-- 配置ViewResolver 。使用order属性排序。   InternalResourceViewResolver 放在最后-->
        <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
            <property name="order" value="1"></property>
            <property name="mediaTypes">
                <map>
                    <!-- 告诉视图解析器,返回的类型为json格式 -->
                    <entry key="json" value="application/json" />
                    <entry key="xml" value="application/xml" />
                    <entry key="htm" value="text/htm" />
                </map>
            </property>
            <property name="defaultViews">
                <list>
                    <!-- ModelAndView里的数据变成JSON -->
                    <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
                </list>
            </property>
            <property name="ignoreAcceptHeader" value="true"></property>
        </bean>
    
        <!-- 定义跳转的文件的前后缀 ,视图模式配置-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        </bean>
    </beans>

    需要注意 <context:component-scan base-package="com.zdr.ssmR" /> 你创建的所有包的前缀要跟这个一致(当然,也可以不一致,但是要配置多个),所以可能跟我的不一样。

    我们现在创建一个包, com.zdr.ssmR.controller ,创建一个Controller。

    代码如下:

    package com.zdr.ssmR.controller;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class HelloController {
    
        @RequestMapping(value = "/hello")
        @ResponseBody
        public String hello(){
            return "hello world";
        }
    
    }

    修改 src/main/webapp/WEB-INF/web.xml 文件,内容如下:

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
    
        <!-- Spring MVC servlet -->
        <servlet>
            <servlet-name>mvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>mvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>

    注意:classpath:spring-mvc.xml 中的classpath是刚刚创建的xml文件,文件名是你自己创建的。

    启动一下,然后访问 http://localhost:8080/ssmR/hello ,不出错的话会出现下面的结果:

    OK!继续下一步。

    0x05 添加log4j

    在 src/main/resources 下创建 log4j.properties ,内容如下,中文在eclipse下可能会显示不出来,不用担心,不影响项目。

    log4j.rootLogger=INFO,Console,File  
    #定义日志输出目的地为控制台  
    log4j.appender.Console=org.apache.log4j.ConsoleAppender  
    log4j.appender.Console.Target=System.out  
    #可以灵活地指定日志输出格式,下面一行是指定具体的格式  
    log4j.appender.Console.layout = org.apache.log4j.PatternLayout  
    log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n  
    
    #文件大小到达指定尺寸的时候产生一个新的文件  
    log4j.appender.File = org.apache.log4j.RollingFileAppender  
    #指定输出目录  
    log4j.appender.File.File = logs/ssmR.log  
    #定义文件最大大小  
    log4j.appender.File.MaxFileSize = 10MB  
    # 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志  
    log4j.appender.File.Threshold = ALL  
    log4j.appender.File.layout = org.apache.log4j.PatternLayout  
    log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c]%m%n

    修改 HelloController.java ,内容如下:

    package com.zdr.ssmR.controller;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class HelloController {
        private static Logger log=LoggerFactory.getLogger(HelloController.class);
    
        @RequestMapping(value = "/hello")
        @ResponseBody
        public String hello(){
            log.info("测试 log配置");
            return "hello world";
        }
    
    }

    再运行一下,访问 http://localhost:8080/ssmR/hello ,看看控制台有没有输出,配置的路径下有没有产生log文件。

    0x06 配置JDBC

    创建数据库:

    CREATE DATABASE ssmR CHARACTER SET utf8;

    创建表:

    CREATE TABLE user(
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    money INTEGER,
    );

    别忘了插入几条数据。

    在 src/main/resources 下创建 jdbc.properties ,内容如下,同样中文也是显示不出来,不影响项目。

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/ssmR
    username=root
    password=root
    #定义初始连接数  
    initialSize=0  
    #定义最大连接数  
    maxActive=20  
    #定义最大空闲  
    maxIdle=20  
    #定义最小空闲  
    minIdle=1  
    #定义最长等待时间  
    maxWait=60000

    username、password字段就不要用我的了

    0x07 构建 MVC项目框架

    我们开发一个通过名字查找信息的接口,入参是一个名字,出参是名字和对应的金额。

    创建 com.zdr.ssmR.domain 包,在该包下创建 User.java ,内容如下:

    package com.zdr.ssmR.domain;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
        /***/
        private Integer id;
    
        /***/
        private String name;
    
        /***/
        private Integer money;
    
        private static final long serialVersionUID = 1L;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getMoney() {
            return money;
        }
    
        public void setMoney(Integer money) {
            this.money = money;
        }
    }

    创建 com.zdr.ssmR.dao 包,在该包下创建 IUserDao.java ,内容如下:

    package com.zdr.ssmR.dao;
    
    import com.zdr.ssmR.domain.User;
    
    public interface IUserDao {
    
        User selectByName(String name);
    }

    创建 com.zdr.ssmR.mapping 包,在该包下创建 UserMapper.xml ,内容如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.zdr.ssmR.dao.IUserDao">
        <resultMap id="BaseResultMap" type="com.zdr.ssmR.domain.User">
            <id column="id" property="id" jdbcType="INTEGER" />
            <result column="name" property="name" jdbcType="VARCHAR" />
            <result column="money" property="money" jdbcType="INTEGER" />
        </resultMap>
    
        <sql id="Base_Column_List">
            id, name, money
        </sql>
        <select id="selectByName" resultMap="BaseResultMap"
            parameterType="java.lang.String">
            select
            <include refid="Base_Column_List" />
            from user
            where name = #{name,jdbcType=VARCHAR}
        </select>
    
    </mapper>

    select id 的值要跟接口的方法一致

    创建 com.zdr.ssmR.service 包,在该包下创建 UserService.java ,内容如下:

    package com.zdr.ssmR.service;
    
    import com.zdr.ssmR.domain.User;
    
    public interface UserService {
        User getUserByName(String name);
    }

    创建 com.zdr.ssmR.service.impl 包,在该包下创建 UserServiceImpl.java ,内容如下:

    package com.zdr.ssmR.service.impl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.zdr.ssmR.dao.IUserDao;
    import com.zdr.ssmR.domain.User;
    import com.zdr.ssmR.service.UserService;
    @Service
    public class UserServiceImpl implements UserService{
    
        @Autowired
        IUserDao userDao;
    
        public User getUserByName(String name) {
            return userDao.selectByName(name);
        }
    
    }

    修改 HelloController.java ,内容如下:

    package com.zdr.ssmR.controller;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.zdr.ssmR.domain.User;
    import com.zdr.ssmR.service.UserService;
    
    
    @Controller
    public class HelloController {
        private static Logger log=LoggerFactory.getLogger(HelloController.class);
    
        @Autowired
        UserService userService;
    
        @RequestMapping(value = "/hello")
        @ResponseBody
        public String hello(){
            log.info("测试 log配置");
            return "hello world";
        }
        @RequestMapping(value = "/user/{name}")
        @ResponseBody
        public String helloUser(@PathVariable("name")String name){
            User user = userService.getUserByName(name);
            return "hello "+user.getName()+",金额:"+user.getMoney();
        }
    }

    我是不会告诉你 mybaits 有一个逆向生成工具叫 mybatis-generator-core-1.3.2.jar 的

    0x08 创建 spring-mybaits.xml文件

    在 src/main/resources 下创建 spring-mybaits.xml ,内容如下:

    <?xml version="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/mvc"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans    
                            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    
                            http://www.springframework.org/schema/context    
                            http://www.springframework.org/schema/context/spring-context-3.1.xsd    
                            http://www.springframework.org/schema/mvc    
                            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">  
        <!-- 自动扫描 -->  
        <context:component-scan base-package="com.zdr.ssmR" />  
    
        <!-- 引入配置文件 -->  
        <bean id="propertyConfigurer"  
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
            <property name="location" value="classpath:jdbc.properties" />  
        </bean>  
    
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
            destroy-method="close">  
            <property name="driverClassName" value="${driver}" />  
            <property name="url" value="${url}" />  
            <property name="username" value="${username}" />  
            <property name="password" value="${password}" />  
            <!-- 初始化连接大小 -->  
            <property name="initialSize" value="${initialSize}"></property>  
            <!-- 连接池最大数量 -->  
            <property name="maxActive" value="${maxActive}"></property>  
            <!-- 连接池最大空闲 -->  
            <property name="maxIdle" value="${maxIdle}"></property>  
            <!-- 连接池最小空闲 -->  
            <property name="minIdle" value="${minIdle}"></property>  
            <!-- 获取连接最大等待时间 -->  
            <property name="maxWait" value="${maxWait}"></property>  
        </bean>  
    
        <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->  
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
            <property name="dataSource" ref="dataSource" />  
            <!-- 自动扫描mapping.xml文件 -->  
            <property name="mapperLocations" value="classpath:com/zdr/ssmR/mapping/*.xml"></property>  
        </bean>  
    
        <!-- DAO接口所在包名,Spring会自动查找其下的类 -->  
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
            <property name="basePackage" value="com.zdr.ssmR.dao" />  
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>  
        </bean>  
    
        <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->  
        <bean id="transactionManager"  
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
            <property name="dataSource" ref="dataSource" />  
        </bean>  
    
    </beans>

    修改 src/main/webapp/WEB-INF/web.xml 文件,内容如下:

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
        <!-- Spring和mybatis的配置文件 -->
        <context-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>classpath:spring-mybatis.xml</param-value>  
        </context-param>
        <!-- 编码过滤器 -->
        <filter>
            <filter-name>encodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <!-- Spring监听器 --> 
        <listener>  
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
        </listener>
        <listener>  
            <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>  
        </listener>
        <!-- Spring MVC servlet -->
        <servlet>
            <servlet-name>mvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>mvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>

    访问 http://localhost:8080/ssmR/user/zdr

    试试吧。

    结果如下:

    0x09 Other

    完整项目在这里

    不采用maven构建的ssm例子在这里

  • 相关阅读:
    【博弈】UVA10561 Treblecross
    2021牛客暑期多校训练营2 部分题解
    2021牛客暑期多校训练营1 部分题解
    变量
    第六次作业
    第五次作业
    第四次作业
    第三次作业
    第二次作业
    c#下载网页源码的两种方法
  • 原文地址:https://www.cnblogs.com/jdbn/p/9879858.html
Copyright © 2011-2022 走看看