zoukankan      html  css  js  c++  java
  • 手把手教你使用SSM框架实现一个学生管理系统第二章之创建一个web工程及相关配置文件的介绍

    SSM框架的基本介绍

    文字概述:

    SSM:spring+springMVC+mybaits
    Spring:是一个容器,就是一个bean(实体对象)大集合。
    SpringMVC:控制器(业务逻辑层)(视图分发器)。
    Mybaits:jdbc的封装(数据库框架)Mapper.xml。

    三大框架各司其职:

    使用spring MVC负责请求的转发和视图管理
    spring实现业务对象管理
    mybatis作为数据对象的持久化引擎

    流程图解:

    在这里插入图片描述

    创建一个web项目

    1.在IDEA的工作目录下新建一个文件夹

    在这里插入图片描述

    2.在IDEA中打开这一文件夹

    在这里插入图片描述

    3.选中文件夹右键点击New ->Module

    在这里插入图片描述

    4.之间点击Next

    在这里插入图片描述

    5.输入对应的文件名及其路径

    在这里插入图片描述

    6.成功创建

    ![image.png](https://img-blog.csdnimg.cn/img_convert/14301e3670e12623c63ebd2cc41f0bd7.png#align=left&display=inline&height=349&margin=[object Object]&name=image.png&originHeight=697&originWidth=1011&size=98141&status=done&style=none&width=505.5)

    7.配置IDEA版本及其输出目录:File->Project Structure

    ![image.png](https://img-blog.csdnimg.cn/img_convert/e7722b9d074e52ba83b6cfbb8c3a53e7.png#align=left&display=inline&height=306&margin=[object Object]&name=image.png&originHeight=612&originWidth=1016&size=106695&status=done&style=none&width=508)

    8.添加web-app目录

    File->Project Structure->Facets
    在这里插入图片描述

    在这里插入图片描述

    9.配置webapp对应的路径

    上下两个都要配置

    在这里插入图片描述

    在这里插入图片描述

    10.成功添加webapp目录

    在这里插入图片描述

    11.项目创建完成

    相关的配置文件配置

    所需的jar包

    <dependencies>
        <!--spring相关-->
        <!--spring上下文-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <!--spring事务管理-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>Spring-tx</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--aop所需-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.13</version>
        </dependency>
        <!--jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <!--mybatis相关-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!--spring整合mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>io.github.orange1438</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>
        <!--mybatis分页助手-->
        <dependency>
            <groupId>com.github.jsqlparser</groupId>
            <artifactId>jsqlparser</artifactId>
            <version>0.9.1</version>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>3.7.5</version>
        </dependency>
        <!--数据库相关-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!--spring-mvc相关和web相关-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <!--servlet和jsp-->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>servlet-api</artifactId>
            <version>6.0.29</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
        </dependency>
        <!--测试所需-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
        <!--输入输出相关-->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>20040616</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ezmorph</groupId>
            <artifactId>ezmorph</artifactId>
            <version>1.0.6</version>
        </dependency>
        <dependency>
            <groupId>dev.galasa</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
    
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>com.github.akarazhev</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
        </dependency>
    
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    
    </dependencies>
    

    web.xml文件配置

    web.xml文件的作用

    web.xml是web项目的配置文件,一般的web工程都会用到web.xml来配置,方便大型开发。web.xml主要用来配置Filter,Listener,Servlet等。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的web工程。

    具体配置

    <!--中文乱码处理-->
        <filter>
            <filter-name>characterEncodingFilter</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>
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <!--设置路径-->
        <filter-mapping>
            <filter-name>characterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <!--方法过滤器-->
        <filter>
            <filter-name>hiddenHttpMethodFilter</filter-name>
            <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
        </filter>
        <!--设置过滤路径-->
        <filter-mapping>
            <filter-name>hiddenHttpMethodFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <!--设置spring配置文件全局参数-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:Spring/applicationContext.xml</param-value>
        </context-param>
        <!--设置监听器-->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <!--配置前端控制器-->
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:SpringMvc/springMvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <!--配置前端控制器的拦截路径-->
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        <!--配置一些页面信息-->
        <error-page>
            <error-code>404</error-code>
            <location>/WEB-INF/errors/404.jsp</location>
        </error-page>
    
        <error-page>
            <error-code>500</error-code>
            <location>/WEB-INF/errors/500.jsp</location>
        </error-page>
    
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    

    Spring 的ApplicationContext.xml文件配置

    ApplicationContext.xml文件配置什么

    配置注解扫描,配置bean对象,事务管理器等等,就是spring容器的配置文件

    具体配置

    <!--扫描注解包-->
        <!--扫描除了Controller以外的注解包,那是springmvc的任务-->
        <context:component-scan base-package="com.pjh">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <!--加载数据源配置文件-->
        <context:property-placeholder location="classpath:db.properties"/>
        <!--配置数据源对象-->
        <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="${datasource.connection.driver_class}"/>
            <property name="jdbcUrl" value="${datasource.connection.url}"/>
            <property name="user" value="${datasource.connection.username}"/>
            <property name="password" value="${datasource.connection.password}"/>
            <property name="minPoolSize" value="${datasource.connection.minPoolSize}"/>
            <!--连接池中保留的最大连接数。Default: 15 -->
            <property name="maxPoolSize" value="${datasource.connection.maxPoolSize}"/>
            <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
            <property name="maxIdleTime" value="${datasource.connection.maxIdleTime}"/>
            <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
            <property name="acquireIncrement" value="${datasource.connection.acquireIncrement}"/>
            <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
                如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 -->
            <property name="maxStatements" value="${datasource.connection.maxStatements}"/>
            <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
            <property name="maxStatementsPerConnection"
                      value="${datasource.connection.maxStatementsPerConnection}"/>
            <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
            <property name="initialPoolSize" value="${datasource.connection.initialPoolSize}"/>
            <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
            <property name="idleConnectionTestPeriod"
                      value="${datasource.connection.idleConnectionTestPeriod}"/>
            <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
            <property name="acquireRetryAttempts"
                      value="${datasource.connection.acquireRetryAttempts}"/>
            <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
                获取连接失败后该数据源将申明已断开并永久关闭。Default: false -->
            <property name="breakAfterAcquireFailure"
                      value="${datasource.connection.breakAfterAcquireFailure}"/>
            <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
                等方法来提升连接测试的性能。Default: false -->
            <property name="testConnectionOnCheckout"
                      value="${datasource.connection.testConnectionOnCheckout}"/>
            <property name="checkoutTimeout" value="${datasource.connection.checkoutTimeout}"/>
            <property name="testConnectionOnCheckin"
                      value="${datasource.connection.testConnectionOnCheckin}"/>
            <property name="automaticTestTable" value="${datasource.connection.automaticTestTable}"/>
            <property name="acquireRetryDelay" value="${datasource.connection.acquireRetryDelay}"/>
            <!--自动超时回收Connection-->
            <property name="unreturnedConnectionTimeout" value="${datasource.connection.unreturnedConnectionTimeout}"/>
            <!--超时自动断开-->
            <property name="maxIdleTimeExcessConnections" value="${datasource.connection.maxIdleTimeExcessConnections}"/>
            <property name="maxConnectionAge" value="${datasource.connection.maxConnectionAge}"/>
        </bean>
    
    
        <!--事务管理器-->
    
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="datasource"/>
        </bean>
    
         <!--启动声明式事务驱动-->
        <tx:annotation-driven transaction-manager="transactionManager"/>
    
        <!--spring-->
    </beans>
    

    SpringMvc的配置文件配置

    SpringMvc.xml配置什么

    配置拦截器,以及对Controller注解的扫描,视图解析器等等

    具体配置

      <!--扫描注解驱动-->
        <!--仅仅扫描Controller注解驱动即可-->
        <context:component-scan base-package="com.pjh">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
        <!--启动mvc注解驱动-->
        <mvc:annotation-driven/>
    
        <!--开放静态资源访问权限-->
        <mvc:default-servlet-handler/>
        <!--启动定时任务-->
        <task:annotation-driven/>
        <!--配置视图解析器-->
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--前缀-->
            <property name="suffix" value=".jsp"/>
            <!--后缀-->
            <property name="prefix" value="/WEB-INF/view/"/>
        </bean>
        <!--文件上传-->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!--上传文件大小限制-->
            <property name="maxUploadSize">
                <value>10485760</value>
            </property>
            <!--默认编码格式-->
            <property name="defaultEncoding">
                <value>UTF-8</value>
            </property>
        </bean>
    
        <!--后台访问拦截器-->
        <mvc:interceptors>
            <mvc:interceptor>
                <!--这是对说有的方法进访问拦截的操作-->
                <mvc:mapping path="/**"/>
                <!--排除一些方法的拦截操作-->
                <mvc:exclude-mapping path="/system/login"/>
                <mvc:exclude-mapping path="/system/get_cpacha"/>
                <mvc:exclude-mapping path="/h-ui/**"/>
                <mvc:exclude-mapping path="/easyui/**"/>
                <mvc:exclude-mapping path="/system/hello"/>
                <!--配置拦截器类的所在路径-->
                <bean class="com.pjh.Interceptor.LoginInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
    </beans>
    

    Mybatis的配置文件

    Mybatis配置文件配置什么

    配置的东西都可以集成到SpringApplication中,包括别名等等

    这里的都集成到springApplication中了没有配置

    数据库配置文件的具体配置

    datasource.connection.driver_class=com.mysql.jdbc.Driver
    #设置数据库的连接地址及编码方式
    datasource.connection.url=jdbc:mysql://localhost:3309/StudentInformation?useUnicode=true&characterEncoding=utf-8
    datasource.connection.username=root
    datasource.connection.password=1234
    #连接池保持的最小连接数,default : 3(建议使用)
    datasource.connection.minPoolSize=3
    #连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15(建议使用)
    datasource.connection.maxPoolSize=15
    #连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接。如果为0,则永远不会断开连接,即回收此连接。default : 0 单位 s(建议使用)
    datasource.connection.maxIdleTime=0
    #连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3(建议使用)
    datasource.connection.acquireIncrement=3
    #连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。同时maxStatementsPerConnection的配置无效。default : 0(不建议使用)
    datasource.connection.maxStatements=0
    #连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。default : 0(看情况而论)
    datasource.connection.maxStatementsPerConnection=0
    #连接池初始化时创建的连接数,default : 3(建议使用)
    datasource.connection.initialPoolSize=3
    #用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时断开连接的问题。因为它保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL8小时无会话的状态打破。为0则不测试。default : 0(建议使用)
    datasource.connection.idleConnectionTestPeriod=0
    #连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功。default : 30(建议使用)
    datasource.connection.acquireRetryAttempts=30
    #如果为true,则当连接获取失败时自动关闭数据源,除非重新启动应用程序。所以一般不用。default : false(不建议使用)
    datasource.connection.breakAfterAcquireFailure=false
    #性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能,尽量不要用。default : false(不建议使用)
    datasource.connection.testConnectionOnCheckout=false
    #配置当连接池所有连接用完时应用程序getConnection的等待时间。为0则无限等待直至有其他连接释放或者创建新的连接,不为0则当时间到的时候如果仍没有获得连接,则会抛出SQLException。其实就是acquireRetryAttempts*acquireRetryDelay。default : 0(与上面两个,有重复,选择其中两个都行)
    datasource.connection.checkoutTimeout=30000
    #如果为true,则在close的时候测试连接的有效性。default : false(不建议使用)
    datasource.connection.testConnectionOnCheckin=false
    #配置一个表名,连接池根据这个表名用自己的测试sql语句在这个空表上测试数据库连接,这个表只能由c3p0来使用,用户不能操作。default : null(不建议使用)
    datasource.connection.automaticTestTable=c3p0TestTable
    #连接池在获得新连接时的间隔时间。default : 1000 单位ms(建议使用)
    datasource.connection.acquireRetryDelay=1000
    #为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在设定的时间到达后回收Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭情况的不是很适用。建议手动关闭。default : 0 单位 s(不建议使用)
    datasource.connection.unreturnedConnectionTimeout=0
    #这个配置主要是为了快速减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接,但是后面的时间段需要的数据库连接数很少,需要快速释放,必须小于maxIdleTime。其实这个没必要配置,maxIdleTime已经配置了。default : 0 单位 s(不建议使用)
    datasource.connection.maxIdleTimeExcessConnections=0
    #配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待它close再断开。配置为0的时候则不会对连接的生存时间进行限制。default : 0 单位 s(不建议使用)
    datasource.connection.maxConnectionAge=0
    

    日志文件的配置

    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### direct messages to file mylog.log ###
    log4j.appender.file=org.apache.log4j.FileAppender
    log4j.appender.file.File=c:/mylog.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### set log levels - for more verbose logging change 'info' to 'debug' ###
    
    log4j.rootLogger=INFO, stdout
    
    

    以上就是第二讲的具体内容,就是一些配置文件的简单配置

  • 相关阅读:
    html禁止手机页面放大缩小
    <httpProtocol/>配置http协议头
    C# 并行编程 之 并发集合 (.Net Framework 4.0)(转)
    JavaScript随机排序算法1
    用户消息处理方式
    后台单用户在线,简单处理
    使用 Intel HAXM 为 Android 模拟器加速,媲美真机(转)
    解决Android SDK Manager下载太慢问题(转)
    如何正确并完全安装Visual Studio 2015企业版本?(转)
    C# XML流操作简单实例
  • 原文地址:https://www.cnblogs.com/pjhaymy/p/14375924.html
Copyright © 2011-2022 走看看