一句话来讲理解汤姆cat与OSGi的类加载器架构,加载架构

汤姆cat-正统的类加载器架构,tomcat-加载架构

主流的Java
Web服务器主要有tomcat,Jetty,WebLogic,WebSphere等,那么些服务器都落到实处了温馨定义的加载器(一般都有一个要么多少个),因为贰个功效齐全的服务器,都亟待缓和如下难点:

  • 布置在同三个服务器上的四个Web应用程序使用的Java
    类库能够达成互动隔开分离,这是最核心的渴求.八个例外应用程序恐怕会依靠同四个第三方类库的不等版本的,不可能要求三个类库在三个服务器中唯有一份,服务器应当确定保障七个应用程序的类库可以相互独立行使
  • 配置在同贰个服务器上的四个Web应用程序所采纳的Java类库能够并行分享,那些需求也很普遍,假设Java类库不能够共享应用,虚构机的方法区很轻巧并发过度膨胀的风险
  • 服务器需求尽大概确认保障自己安全不受安排的Web应用程序影响.近年来有繁多主流的Java
    Web服务器都选取Java语言开荒,由此服务器本身也是有类库信赖的标题,一般的话,基于安全的考虑,服务器所接纳的类库应该与应用程序使用的类库相互独立
  • 支持JSP的服务器,当先五圣路易斯亟需辅助HotSwap成效(热调换成效)

出于上述的各类难题,在布置Web应用的时候如若只使用贰个独门的ClassPath是无力回天满意必要的,所以各个Web服务器都大同小异的提供了七个ClassPath路线供用户存在第三方类库,这么些渠道一般都是lib,classes命名,被放置到分歧路子的类库,具备区别的拜访范围

和劳务对象.tomcat服务器划分用户类库结议和类加载描述如下:

在tomcat目录结构中,有三组目录/common/*,/server/*,/shared/*能够用来贮存在类库,其它还恐怕有Web应用程序本身的目录/WEB-INF/*一共四组,把Java类库放在那个目录的意思和差异如下:

  • 放置在/common/*一句话来讲理解汤姆cat与OSGi的类加载器架构,加载架构。目录:那几个类库能够被tomcat和有着的web应用程序共同选择
  • 放置在/server/*目录:这么些类库能够被tomcat使用,全数的web应用程序都不可知
  • 放置在/shared/*目录:那个类库能够被抱有的web应用程序共同使用,不过对tomcat自个儿不可见
  • 放置在/WEB-INF/*目录:这几个类库仅仅对当下的web应用程序使用,对tomcat和别的的web应用程序都以不可知的

为了帮助上述如此的目录结构,并对目录里面包车型地铁类库举行加载和隔开,Tomcat定义了七个类加载器来促成,这么些类加载器都以安分守己杰出的爹娘委派模型来兑现的,其关系如图所示:

澳门葡京备用网址 1

驷不比舌的类加载器有CommonClassLoader,CatalinaClassLoader,SharedClassLoader和WebappClassLoader,它们分别加载/common/*,/server/*,/shared/*和/WEB-INF/*目录下的类库,在那之中WebApp加载器和JSP类加载器实例平日会设有多少个

每三个web应用程序对应贰个webapp类加载器,每三个JSP文件对应贰个JSP类加载器.

透过上述的关系图可以看出CommonClassLoader能加载的类都足以被CatalinaClassLoader和SharedClassLoader使用,而CatalinaClassLoader和SharedClassLoader本身能加载的类则与对方互相隔开.WebAppClassLoader能够行使SharedClassLoader

能加载到的类,不过各类WebAppClassLoader实例之间互相隔开,而JasperLoader的加载范围仅仅是以此JSP编写翻译出的那三个Class,它出现的指标正是为了被屏弃:当服务器检查实验到JSP文件被改造时,会交替掉近些日子的JasperClassLoader实例,并由此再建三个

新的JSP类加载器来促成JSP文件的HotSwap功用

 

参谋资料:深刻领悟Java设想机

 

主流的Java
Web服务器主要有tomcat,Jetty,WebLogic,WebSphere等,这个服务器都完毕了自个儿定义的加载器(一…

主流的Java
Web服务器主要有tomcat,Jetty,WebLogic,WebSphere等,这么些服务器都完毕了和睦定义的加载器(一般都有三个要么五个),因为贰个功效齐全的服务器,都急需消除如下难题:

  前言:

  本次博客主假诺对Tomcat与OSGi的类加载器架构,所以就必要对tomcat、OSGi以及类加运载飞机制有所掌握

  类加载能够在

回顾通晓汤姆cat与OSGi的类加载器架构,tomcatosgi

  • 配置在同一个服务器上的四个Web应用程序使用的Java
    类库能够完毕互动隔开分离,那是最基本的渴求.七个例外应用程序或许会借助同叁个第三方类库的不如版本的,不可能供给叁个类库在二个服务器中只有一份,服务器应当确认保证多少个应用程序的类库能够并行独立使用
  • 安排在同二个服务器上的三个Web应用程序所利用的Java类库能够互相分享,那些供给也很宽泛,假若Java类库不能够分享应用,设想机的方法区很轻易并发过度膨胀的高危害
  • 服务器需求尽恐怕确认保障我安全不受陈设的Web应用程序影响.前段时间有很多主流的Java
    Web服务器都使用Java语言开荒,由此服务器自己也是有类库依赖的难点,一般的话,基于安全的思量,服务器所运用的类库应该与应用程序使用的类库相互独立
  • 帮衬JSP的服务器,超越53%都急需协助HotSwap功用(热交流效能)

 一、Tomcat:正统的类加载架构

  1.主流的Java
Web服务器,如汤姆cat、Jetty、WebLogic、WebSphere等都完结了温馨定义的类加载器(一般都持续贰个)。因为三个作用全面的web服务器要消除一下多少个难点:

    1)计划在二个服务器上的八个web应用程序所使用的Java类库能够完结互动隔断。这是最基本的供给,三个分歧的应用程序可能会依靠同四个第三方类库的不等版本,无法供给三个类库在八个服务器中独有一份,服务器应当保管七个应用程序的类库可以互相独立运用

    2)陈设在同一个服务器上的多少个Web应用程序所采用的Java类库能够互相共享。这些供给也要命很广阔,如,用户可能有10各使用Spring组织的应用程序计划在同样台服务器上,假若把10份Spring分别寄存在依次应用程序的隔开目录中,将会是一点都不小的财富浪费-那主要不是疏弃磁盘空间的主题材料,而是指类库在选择时都要被加载到服务器内部存款和储蓄器,假使类库不能分享,设想机的方法区就能很轻巧并发过度膨胀的风险

    3)服务器要求尽恐怕地保险自个儿的梧州不受铺排的Web应用程序影响。方今,有成百上千主流的Java
Web服务器自身也是使用Java语言来落实的。由此,服务器本人也会有类库正视的难点,一般的话,基于安全着想,服务器所使用的类库应该与应用程序的类库相互独立

    4)匡助jsp应用的Web服务器,大多数都供给支持HotSwap功能。大家领略,jsp文件最后要编写翻译成Java
Class才干由虚构机试行,但jsp文件由于其纯文本存储的特性,运营时修改的概率远远出乎第三方类库或程序自个儿的Class文件。而且ASP、PHP和JSP这个网页应用也把修改后不要求重启作为二个非常大的“优势”来对待,因而,“主流”的Web服务器都会支撑JSP的热替换,当然也许有“社会的遗弃者”的,如运营在生育情势下的WebLogic服务器默许就不会管理JSP文件的转移

  由于存在上述难点,在安顿Web应用时,单独的贰个ClassPath就不能满意必要了,所以种种Web服务器都“不期而遇”地提供了一点个ClassPath路线供用户存放第三方类库,这几个路子一般都是lib或classes命名,被放置到不一致路子中的类库,具有差别的拜谒范围和服务对象,日常,每贰个索引都会有贰个应和的自定义类加载器去加载放置在里边的Java类库。

  2.Tomcat对用户类库与类加载器的规划

    在其目录结构下有三组目录(“/common/*”、“/server/*”、“/shared/*”)能够寄存Java类库,别的还足以增加Web应用程序本身的目录“/WEB-INF/*”,一共4组,把Java类库放置在这个目录中的含义分别如下:

    1)放置在/commom目录中:类库可被汤姆cat和持有的Web应用程序共同采用

    2)放置在/server目录中:类库可被汤姆cat使用,对具有的Web应用程序都不可知

    3)放置在/shared目录中:类库可被全数的Web应用程序所共同利用,但对汤姆cat自个儿不可知

    4)放置在/WebApp/WEB-INF目录中:类库仅仅可以被此Web应用程序使用,对汤姆cat和任何Web应用程序都不可见

    为了协助那套目录结构,并对目录里面包车型大巴类库实行加载和隔开分离,汤姆cat自定义了四个类加载器,那个类加载器依照卓绝的爹娘委派模型来兑现,所下图:

    澳门葡京备用网址 2

    最上面包车型大巴两个类加载器是JDK暗中认可提供的类加载器,那三个加载器的的效应在此以前也说过,这里不再赘言了,能够在

    从上海教室的委派关系能够看出,CommonClassLoader能加载的类都得以被CatalinaClassLoader和SharedClassLoader使用,而CatalinaClassLoader和SharedClassLoader本身能加载的类则与对方相互隔开分离。WebAppClassLoader能够动用SharedClassLoader加载到的类,但顺序WebAppClassLoader实例之间互相隔开分离。而JasperLoader的加载范围仅仅是其一JSP文件所编写翻译出来的哪贰个Class,它出现的目标正是为着被扬弃:当服务器检查实验到JSP文件被改造时,会交替掉如今的贾斯帕Loader的实例,并通过在确立三个新的Jsp类加载器来促成JSP文件的HotSwap功效

  前言:

  此番博客首如果对汤姆cat与OSGi的类加载器架构,所以就必要对tomcat、OSGi以及类加运载飞机制有所领会

  类加载能够在

由于上述的各样难题,在计划Web应用的时候假使只利用三个独自的ClassPath是爱莫能助满意急需的,所以各类Web服务器都大同小异的提供了七个ClassPath路线供用户存在第三方类库,这几个渠道一般都是lib,classes命名,被放置到分歧渠道的类库,具有不一样的访问范围

 二、OSGi:灵活的类加载器架构

  既然谈到OSGI,即未来解释一下OSGi是何许,以及它的效果

  OSGi(Open Service Gateway
Initiative):是OSGi缔盟钦赐的二个基于Java语言的动态模块化标准,那几个正式最初是由Sun、IBM、爱立信等集团协办倡议,指标是使服务提供商通过住宅网管为各样日用智能道具提供各样劳动,后来这么些正式在Java的别的技艺世界也许有不易的上扬,今后一度变为Java世界中的“事实上”的模块化标准,并且一度有了CIMA、Felix等成熟的落实。OSGi在Java程序猿中最资深的使用案例正是Eclipse
IDE

  OSGi中的每几个模块(称为Bundle)与普通的Java类库分裂并十分的小,两个一般都以JALAND格式举办李包裹装,何况个中存款和储蓄的都是Java
Package和Class。可是三个Bundle能够注脚它所依靠的Java
Package(通过Import-Package描述),也能够注明他同意导出公布的Java
Package(通过Export-Package描述)。在OSGi里面,Bundle之间的依据关系从古板的上层模块依赖底层模块转变为同级模块之间的信赖(至少外观上那样),并且类库的可知品质获得确切的操纵,叁个模块里唯有被Export过的Package才只怕由外界访谈,别的的Package和Class将会暗藏起来。除了更加准确的模块划分和可见性调节外,引进OSGi的另外一个非同儿戏理由是,基于OSGi的次序一点都不小概能够兑现模块级的热插拔功效,当程序晋级翻新或调节和测量试验除错开上下班时间,能够只停用、重新安装然后运维程序的中间有个别,这对公司级程序开垦以来是三个不胜有诱惑性的特征

  OSGi之所以能有上述“迷人”的表征,要归功于它灵活的类加载器架构。OSGi的Bundle类加载器之间只有法则,没有固定的委任关系。比如,有些Bundle注明了三个它借助的Package,假如有别的的Bundle证明公布了那些Package,那么富有对这一个Package的类加载动作都会为派给宣布他的Bundle类加载器去完成。不涉及有些具体的Package时,各类Bundle加载器是同级关系,独有切实选拔某些Package和Class的时候,才会依赖Package导入导出概念来布局Bundle间的委派和正视性

  别的,三个Bundle类加载器为其余Bundle提供服务时,会依靠Export-Package列表严格调控访谈范围。要是三个类存在于Bundle的类库中可是尚未被Export,那么那个Bundle的类加载器能找到那些类,但不会提供给任何Bundle使用,而且OSGi平台也不会把别的Bundle的类加载诉求分配给这几个Bundle来管理

  二个例证:就算存在BundleA、BundleB、BundleC八个模块,何况那八个Bundle定义的借助关系如下:

  BundleA:注明公布了packageA,依赖了java.*的包

  BundleB:申明信赖了packageA和packageC,同期也借助了Java.*的包

  BundleC:证明发表了packageC,依赖了packageA

  那么,那五个Bundle之间的类加载器及父类加载器之间的涉及如下图:

  澳门葡京备用网址 3

  由于尚未关系到现实的OSGi达成,所以上海体育场合中的类加载器未有指明具体的加载器达成,只是三个显示了加载器之间涉及的概念模型,并且只是反映了OSGi中最简便的加载器委派关系。一般的话,在OSGi中,加载贰个类大概发生的查找行为和委派关系会比上海体育场合中显得的目眩神摇,类加载时的索求准绳如下:

    1)以java.*开端的类,委派给父类加载器加载

    2)否则,委派列表名单内的类,委派给父类加载器加载

    3)不然,Import列表中的类,委派给Export这么些类的Bundle的类加载器加载

    4)不然,查找当前Bundle的ClassPath,使用自个儿的类加载器加载

    5)否则,查找是不是在自个儿的Fragment
Bundle中,假如是,则委任给Fragment bundle的类加载器加载

    6)不然,查找Dynamic
Import列表的Bundle,委派给对应Bundle的类加载器加载

    7)不然,查找未果

  从在此以前的图能够看看,在OSGi里面,加载器的涉嫌不再是父老妈委派模型的树形架构,而是已经特别发展成了一种更目不暇接的、运营时技术明显的网状结构。

 

 一、汤姆cat:正统的类加载架构

  1.主流的Java
Web服务器,如汤姆cat、Jetty、WebLogic、WebSphere等都达成了和煦定义的类加载器(一般都持续二个)。因为贰个作用周详的web服务器要化解一下多少个难点:

    1)安顿在二个服务器上的多个web应用程序所选取的Java类库能够实现互动隔离。那是最基本的供给,八个分歧的应用程序可能会依靠同三个第三方类库的不如版本,不能够要求贰个类库在贰个服务器中独有一份,服务器应当保管四个应用程序的类库可以相互独立运用

    2)计划在同四个服务器上的七个Web应用程序所运用的Java类库能够互相分享。这几个需要也非常很普及,如,用户也可以有10各使用Spring协会的应用程序铺排在同样台服务器上,如果把10份Spring分别存放在逐条应用程序的隔离目录中,将会是相当的大的资源浪费-那重大不是荒凉磁盘空间的主题材料,而是指类库在选拔时都要被加载到服务器内部存款和储蓄器,如若类库不可能分享,虚构机的方法区就能够很轻巧并发过度膨胀的危机

    3)服务器供给尽也许地保险本身的平安不受安排的Web应用程序影响。近些日子,有十分的多主流的Java
Web服务器本人也是利用Java语言来兑现的。因而,服务器本人也许有类库重视的难点,一般的话,基于安全考虑,服务器所采纳的类库应该与应用程序的类库互相独立

    4)帮忙jsp应用的Web服务器,大非常多都必要扶助HotSwap成效。咱们明白,jsp文件最后要编写翻译成Java
Class技艺由虚构机施行,但jsp文件由于其纯文本存款和储蓄的特色,运行时修改的可能率远远出乎第三方类库或程序本身的Class文件。并且ASP、PHP和JSP那些网页应用也把修改后没有要求重启作为三个非常的大的“优势”来对待,由此,“主流”的Web服务器都会支撑JSP的热替换,当然也许有“肥猪瘤”的,如运营在生育形式下的WebLogic服务器暗中认可就不会管理JSP文件的变迁

  由于存在上述难题,在配备Web应用时,单独的三个ClassPath就不可能满意急需了,所以种种Web服务器都“不约而合”地提供了少数个ClassPath路线供用户寄放第三方类库,那么些路子一般都是lib或classes命名,被停放到差异路子中的类库,具备分化的拜谒范围和劳动指标,平日,每二个目录都会有八个相应的自定义类加载器去加载放置在里面包车型地铁Java类库。

  2.汤姆cat对用户类库与类加载器的统一妄图

    在其目录结构下有三组目录(“/common/*”、“/server/*”、“/shared/*”)能够存放Java类库,别的还是能够加上Web应用程序本人的目录“/WEB-INF/*”,一共4组,把Java类库放置在这几个目录中的含义分别如下:

    1)放置在/commom目录中:类库可被Tomcat和兼具的Web应用程序共同利用

    2)放置在/server目录中:类库可被汤姆cat使用,对全数的Web应用程序都不可知

    3)放置在/shared目录中:类库可被全体的Web应用程序所共同利用,但对汤姆cat自身不可知

    4)放置在/WebApp/WEB-INF目录中:类库仅仅可以被此Web应用程序使用,对Tomcat和别的Web应用程序都不可知

    为了协助那套目录结构,并对目录里面包车型客车类库举办加载和隔开,汤姆cat自定义了七个类加载器,那么些类加载器遵照精华的家长江水利委员会派模型来促成,所下图:

    澳门葡京备用网址 4

    最上面包车型客车四个类加载器是JDK暗中认可提供的类加载器,那四个加载器的的机能此前也说过,这里不再赘言了,能够在

    从上海体育场合的委派关系足以看来,CommonClassLoader能加载的类都能够被CatalinaClassLoader和SharedClassLoader使用,而CatalinaClassLoader和SharedClassLoader自身能加载的类则与对方相互隔开。WebAppClassLoader能够利用SharedClassLoader加载到的类,但顺序WebAppClassLoader实例之间互相隔断。而JasperLoader的加载范围仅仅是其一JSP文件所编写翻译出来的哪一个Class,它出现的目标正是为着被放弃:当服务器检验到JSP文件被改换时,会交替掉近日的JasperLoader的实例,并通过在创立贰个新的Jsp类加载器来落到实处JSP文件的HotSwap作用

澳门葡京备用网址 ,和劳动对象.tomcat服务器划分用户类库结构和类加载描述如下:

 二、OSGi:灵活的类加载器架构

  既然提起OSGI,即未来解释一下OSGi是哪些,以及它的法力

  OSGi(Open Service Gateway
Initiative):是OSGi结盟钦命的二个基于Java语言的动态模块化标准,这一个正式最初是由Sun、IBM、爱立信等市肆共同发起,指标是使服务提供商通过住宅网管为种种日用智能设备提供各类劳动,后来以此正式在Java的别样才具世界也可以有不利的升华,今后早已改成Java世界中的“事实上”的模块化标准,况且一度有了桑塔纳、Felix等成熟的完毕。OSGi在Java程序猿中最显赫的运用案例正是Eclipse
IDE

  OSGi中的每五个模块(称为Bundle)与常见的Java类库差异并非常小,两个一般都是JA奥迪Q5格式进行打包,况兼当中存款和储蓄的都以Java
Package和Class。可是一个Bundle能够证明它所依附的Java
Package(通过Import-Package描述),也足以申明他允许导出公布的Java
Package(通过Export-Package描述)。在OSGi里面,Bundle之间的重视性关系从守旧的上层模块重视底层模块转换为同级模块之间的看重(至少外观上那样),並且类库的可知质量获得标准的主宰,八个模块里只有被Export过的Package才只怕由外面访谈,别的的Package和Class将会掩饰起来。除了更确切的模块划分和可知性调控外,引进OSGi的别的一个珍视理由是,基于OSGi的顺序很也许能够兑现模块级的热插拔功能,当程序晋级翻新或调节和测验除错开上下班时间,能够只停用、重新安装然后运转程序的中间部分,那对公司级程序支付来讲是贰个非凡有诱惑性的特点

  OSGi之所以能有上述“摄人心魄”的性状,要归功于它灵活的类加载器架构。OSGi的Bundle类加载器之间唯有准绳,未有稳定的委派关系。比如,有个别Bundle注解了贰个它借助的Package,即使有其它的Bundle注脚揭橥了那个Package,那么富有对这几个Package的类加载动作都会为派给公布他的Bundle类加载器去做到。不关乎某些具体的Package时,各种Bundle加载器是同级关系,独有切实使用有个别Package和Class的时候,才会依照Package导入导出概念来组织Bundle间的委任和信赖

  其余,八个Bundle类加载器为其余Bundle提供劳动时,会根据Export-Package列表严控访问范围。假诺三个类存在于Bundle的类库中但是尚未被Export,那么这几个Bundle的类加载器能找到那个类,但不会提需要任何Bundle使用,何况OSGi平台也不会把其余Bundle的类加载须求分配给这么些Bundle来管理

  三个例子:假使存在BundleA、BundleB、BundleC八个模块,并且那四个Bundle定义的正视关系如下:

  BundleA:申明公布了packageA,注重了java.*的包

  BundleB:评释重视了packageA和packageC,同期也依据了Java.*的包

  BundleC:表明公布了packageC,重视了packageA

  那么,那多个Bundle之间的类加载器及父类加载器之间的涉及如下图:

  澳门葡京备用网址 5

  由于未有涉及到实际的OSGi实现,所以上海教室中的类加载器没有指明具体的加载器实现,只是二个显示了加载器之间涉及的概念模型,并且只是反映了OSGi中最简便的加载器委派关系。一般的话,在OSGi中,加载多少个类恐怕发生的检索行为和委派关系会比上海教室中彰显的复杂,类加载时的寻找准绳如下:

    1)以java.*起首的类,委派给父类加载器加载

    2)不然,委派列表名单内的类,委派给父类加载器加载

    3)不然,Import列表中的类,委派给Export那些类的Bundle的类加载器加载

    4)不然,查找当前Bundle的ClassPath,使用本身的类加载器加载

    5)不然,查找是不是在投机的Fragment
Bundle中,假诺是,则委任给Fragment bundle的类加载器加载

    6)否则,查找Dynamic
Import列表的Bundle,委派给对应Bundle的类加载器加载

    7)不然,查找未果

  从从前的图能够看到,在OSGi里面,加载器的关联不再是父阿妈委派模型的树形架构,而是已经尤其升华成了一种更眼花缭乱的、运转时才具鲜明的网状结构。

 

前言:
此番博客主即使对Tomcat与OSGi的类加载器架构,所以就要求对tomcat、OSGi以及类加运载飞机制…

在tomcat目录结构中,有三组目录/common/*,/server/*,/shared/*能够用来存放在类库,其它还会有Web应用程序自个儿的目录/WEB-INF/*一共四组,把Java类库放在这个目录的意义和差异如下:

  • 放置在/common/*目录:那么些类库能够被tomcat和具备的web应用程序共同使用
  • 放置在/server/*目录:那么些类库能够被tomcat使用,全部的web应用程序都不可知
  • 放置在/shared/*目录:这个类库能够被全部的web应用程序共同使用,不过对tomcat本人不可知
  • 放置在/WEB-INF/*目录:那些类库仅仅对日前的web应用程序使用,对tomcat和另外的web应用程序都以不可知的

为了协助上述如此的目录结构,并对目录里面包车型地铁类库进行加载和隔开,汤姆cat定义了七个类加载器来落成,那么些类加载器都是比照杰出的养父母委派模型来兑现的,其涉嫌如图所示:

澳门葡京备用网址 6

重大的类加载器有CommonClassLoader,CatalinaClassLoader,SharedClassLoader和WebappClassLoader,它们各自加载/common/*,/server/*,/shared/*和/WEB-INF/*目录下的类库,当中WebApp加载器和JSP类加载器实例日常会设有四个

每贰个web应用程序对应多少个webapp类加载器,每贰个JSP文件对应八个JSP类加载器.

透过上述的涉嫌图能够看到CommonClassLoader能加载的类都足以被CatalinaClassLoader和SharedClassLoader使用,而CatalinaClassLoader和SharedClassLoader自身能加载的类则与对方相互隔开.WebAppClassLoader可以应用SharedClassLoader

能加载到的类,但是各类WebAppClassLoader实例之间相互隔开分离,而JasperLoader的加载范围仅仅是其一JSP编写翻译出的这一个Class,它出现的目标就是为了被撇下:当服务器检查测量检验到JSP文件被修改时,会交替掉这两天的JasperClassLoader实例,并由此再建一个

新的JSP类加载器来落到实处JSP文件的HotSwap功效

 

参照他事他说加以考察资料:深切理解Java设想机

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website