目录 [隐藏]
1 历史
2 用途友猜
3 结构
4 参见
5 外部链结
[编辑]历史
XML是从1996年开始有其雏形,并向 W3C(全球信息网联盟)提案,而在1998二月发布为W3C的标准(XML1.0)。 XML的前身是SGML(The Standard Generalized Markup Language),是自IBM从60年代就开始发展的 GML(Generalized Markup Language)标准化后的名称。
GML的重要概念:
文件中能够明确的将标示与内容区隔
所有文件的标签使用方法均一致
1978年,ANSI将GML加以整理规范,发布成为SGML,1986年起为 ISO 所采用(ISO 8879),并且被广泛地运用在各种大型的文件计划中,但是SGML是一种非常严谨的文件描述法,导致过于庞大复杂(标准手册就有500多页),难以理解和学习,进而影响其推广与应用。
于是,人们对SGML进行了简化衍生出 HTML。HTML 简单,在初期没有任何定义文档外观的相关方法,仅用来在浏览器里显示网页文件。而后,随着因特网的发展,人们为了控制其文件样式,扩充了描述如何显现数据的卷标。在 Netscape 与 Microsoft 之间的浏览器大战后, HTML 标准权威性遭受重大的考验,所幸,到了HTML 4.0时,W3C 又恢复了其地位。
同时W3C意识到HTML的原罪:
不能解决所有解释数据的问题 - 像是影音文件或化学公式、音乐符号等其它型态的内容。
效能问题 - 需要下载整份文件,才能开始对文件做搜寻的动作。
扩充性、d性、易读性均不佳。
为了解决以上问题,专家们使用SGML精简制作,并依照HTML的发展经验,产生出一套使用上规则严谨,但是简单的描述数据语言:XML。 XML是在一个这样的背景下诞生的—是不是能有一个更中立的方式,让消费端自行决定要如何消化、呈现从服务端所提供的信息?
而XML目的即在于提供一个对信息能够做精准描述的机制,藉以弥补 HTML 太过于表现导向的特质。
[编辑]用途
丰富文件(Rich Documents)- 自定文件描述并使其更丰富
属于文件为主的XML技术应用
标记是用来定义一块数据应该如何呈现
解释数据(Metadata)- 描述其它文件或在线信息
属于数据为主的XML技术应用
标记是用来说明一块资料的意义
组态档案(Configuration Files)- 描述软件的组态参数
XHTML
维基百科,自由的百科全书
跳转到: 导航, 搜索
汉汉▼▲为了阅读方便,本文使用全文手工转换。转换内滚告稿容:
简体:可扩展超文本置标语言;繁体:可延伸超文件标示语言; 当前用字模式下显示为→可扩展超文本置标语言
显示↓关闭↑字词转换说明
字词转换是中文维基的一项自动转换,目的是通过计算机程序自动消除繁简、地区词等不同用字模式的差异,以达到阅读方便。字词转换包括全局转换和手动转换,本说明所使用的标题转换和全文转换技术,都属于手动转换。
如果您想对我们的字词转换系统提出一些改进建议,或者提交应用面更广的转换(中文维基百科全站乃至MediaWiki软件),或者报告转换系统的错误,请前往Wikipedia:字词转换请求或候选发表您的意见。
汉汉▼▲为了阅读方便,本文使用全文手工转换。转换内容:
简体:文件扩展名;繁体:副档名; 当前用字模式下显示为→文件扩展名
显示↓关闭↑字词转换说明
字词转换是中文维基的一项自动转换,目的是通过计算机程序自动消除繁简、地区词等不同用字模式的差异,以达到阅读方便。字词转换包括全局转换和手动转换,本说明所使用的标题转换和全文转换技术,都属于手动转换。
如果您想对我们的字词转换系统提出一些改进建议,或者提交应用面更广的转换(中文维基百科全站乃至MediaWiki软件),或者报告转换系统的错误,请前往Wikipedia:字词转换请求或候选发表您的意见。
XHTML
文件扩展名 .xhtml, .xht, .html, .htm
因特网媒介种类 application/xhtml+xml
开发者 World Wide Web Consortium
格式 置标语言
延伸自 XML, HTML
Standard(s) 1.0 (Recommendation),
1.1 (Recommendation),
1.1 SE (Working Draft),
5 (Working Draft),
2.0 (Working Draft)
可扩展超文本置标语言(eXtensible HyperText Markup Language,XHTML),是一种置标语言,表现方式与超文本置标语言(HTML)类似,不过语法上更加严格。从继承关系上讲,HTML是一种基于标准通用置标语言(SGML)的应用,是一种非常灵活的置标语言,而XHTML则基于可扩展置标语言(XML),XML是SGML的一个子集。XHTML 1.0在2000年1月26日成为W3C的推荐标准。
目录 [隐藏]
1 概述
2 版本
3 有效的XHTML文件
4 语法
5 和HTML 4的区别
5.1 文档应该是结构良好的
5.3 对于非空标签,也需要结束标签
5.4 属性值必须总是使用引号包裹
5.5 禁止属性简化
5.6 空元素
5.7 属性值中空白字符的处理
5.8 脚本和样式元素
5.8.1 SGML 排斥
5.8.2 拥有“ id”和“ name”属性的元素
5.8.3 拥有预设值的属性
5.8.4 十六进制值的实体映射
6 参看
7 参考文献
8 外部链接
[编辑] 概述
该图标由W3C提供,用于放置在通过 W3C标记验证器的XHTML文档中。XHTML是“3种HTML 4文件根据XML 1.0标准重组”而成的[1]。 而W3C亦继续维持建议使用HTML 4.01和积极地研究HTML5及XHTML的计划。 于2002年8月发表的XHTML 1.0 的建议中,W3C指出XHTML家族将会是Internet的新阶段。而转换使用XHTML可以令开发人员接触XML和其好处,并可以确保以XHTML开发的网页于未来的相容性。
HTML语法要求比较松散,这样对网页编写者来说,比较方便,但对于机器来说,语言的语法越松散,处理起来就越困难,对于传统的电脑来说,还有能力兼容松散语法,但对于许多其他设备,比如手机,难度就比较大。因此产生了由DTD定义规则,语法要求更加严格的XHTML。
大部分常见的浏览器都可以正确地解析XHTML,即使老一点的浏览器,XHTML作为HTML的一个子集,许多也可以解析。也就是说,几乎所有的网页浏览器在正确解析HTML的同时,可兼容XHTML。当然,从HTML完全转移到XHTML,还需要一些过程。
跟CSS(Cascading Style Sheets,层叠式样式表)结合后,XHTML能发挥真正的威力;这使实现样式跟内容的分离的同时,又能有机地组合网页代码,在另外的单独文件中,还可以混合各种XML应用,比如MathML、SVG。
从HTML到XHTML过渡的变化比较小,主要是为了适应XML。最大的变化在于文档必须是良构的,所有标签必须闭合,也就是说开始标签要有相应的结束标签。另外,XHTML中所有的标签必须小写。而按照HTML 2.0以来的传统,很多人都是将标签大写,这点两者的差异显著。在XHTML中,所有的参数值,包括数字,必须用双引号括起来(而在SGML和HTML中,引号不是必须的,当内容只是数字、字母及其它允许的特殊字符时,可以不用引号)。所有元素,包括空元素,比如img、br等,也都必须闭合,实现的方式是在开始标签末尾加入斜扛,比如<img … />、<br />。省略参数,比如<option selected>,也不允许,必须用<option selected="selected">。两者的详细差别,可通过W3C XHTML说明来查阅。
[编辑] 版本
至现时为止,XHTML共有以下几个版本:
XHTML 1.0 Strict(严格版) 是参照“HTML 4.01 Strict”改编,但不包括被弃用的元素。
XHTML 1.0 Transitional(过渡版) 是参照“HTML 4.01 Transitional”改编,包括已于Strict版本被弃用的呈现性元素(例如<center>, <font>等)。
XHTML 1.0 Frameset(框架版) 是参照“HTML 4.01 Frameset”改编,并允许于网页中定义框架元素。
XHTML 1.1
XHTML Basic
另外,在Microsoft Internet Explorer 5.0所新增的<ruby>小字注解标签,在XHTML 1.1得到支援(参看旁注标记)。
而第二版的XHTML 1.0于2002年八月成为W3C推荐的文件类型。[2]
[编辑] 有效的XHTML文件
一个附合XHTML标准的文件即可称为有效. 此可以确保XHTML文件代码的协调,亦能令文件的更容易被处理,而不需确保各种浏览器编译的一致性。而W3C验证服务则可以验证文件是否有效。而实际上,很多网站开发工具(例如Dreamweaver)都支援以W3C标准验证文件。
[编辑] 语法
XHTML语言必须符合XML的格式,例如,<br>要写成<br />、使用了<p>之后必须有一个</p>以结束段落。而且,XHTML标签必须使用小写字母,如<br />不能写为 <BR />;每一个属性都必须使用引号包住,如必须使用<img src="abc.jpg" alt="" />而不能使用<img src=abc.jpg alt="">。这些做法的目的,是使一个XHTML网页能够被网页浏览器正确及较快地编译。
[编辑] 和HTML 4的区别
(翻译自W3C XHTML说明)这部分涉及内容广泛。
XHTML是XML的一种应用,基于这一事实。那些在以SGML为基础的HTML 4中,完全合法的用法,应当被改变。
[编辑] 文档应该是结构良好的
良好结构(Well-formed)[1]是由XML[2] 引入的一个新概念。也就是说所有的元素都必须有结束标签或者以特殊的方式书写(如下所述),而且所有的标签必须合理地嵌套。
尽管如此,交叉使用在SGML中仍然是合法的,而且在现有的浏览器中也能够被广泛接受。
正确:元素嵌套
<p><em>这是一个要强调的段落。</em></p>
错误:元素交叉
<em><p>这是一个要强调的段落。</em></p>
[编辑] 元素名称和属性必须小写
XHTML文件要求所有的HTML元素名称和属性名称都要小写。因为XML本身大小写意义不同,因此必须区分开来。比如,<li>和<LI>是完全不同的。
[编辑] 对于非空标签,也需要结束标签
基于SGML的HTML 4里面,允许特定的标签省略结束标签;这些元素暗含有结束标记。XML不允许省略结束标记。所有元素(包括在DTD中声明为 空的标签),都必须有结束标签。在DTD中声明为空的元素可以用结束标签或者使用空元素速记法(参见空元素)。
正确的:结束的元素
<p>这是一个段落。</p><p>这是另一个段落。</p>
错误的:没有结束的元素
<p>这是一个段落。<p>这是另一个段落。
[编辑] 属性值必须总是使用引号包裹
所有的属性值都必须使用引号包含,包括那些以数值类型出现的。
正确的:属性值使用引号
<td rowspan="3">
错误的:属性值没有使用引号
<td rowspan=3>
[编辑] 禁止属性简化
XML不支持属性简化,属性值对必须书写完整。属性名,像compact和checked在没有指定具体值的情况下,不能够使用。
正确的:没有简化属性
<dl compact="compact">
错误的:简化属性
<dl compact>
[编辑] 空元素
空元素必须有一个结束标签,或者用/>来结束开始标签。例如,<br />或者<hr></hr>。
正确的:结束空标签
<br /><hr />
错误的:没有结束空标签
<br><hr>
[编辑] 属性值中空白字符的处理
当客户端在处理属性时,它们依据的是XML的章节3.3.3
祛除前缀和后缀的空白字符。
将一个或多个空白字符序列映射为单个词间空格。
[编辑] 脚本和样式元素
在XHTML里面,脚本和样式的元素被声明为具有 #PCDATA 内容。因此,<和&会被认为是标记的开始,另外<和 &会被认为 XML 解释器认为是实体映射被分别解释成为<和&。从而将脚本或者样式元素包裹在 CDATA 标记的部分以避免这些实体扩展。
<script type="text/javascript">// <![CDATA[ ... 没有转义处理的内容... // ]]></script>
在文档对象模型中,CDATA部分被XML解释器认为是节点,参见文档对象模型章节1.3的第一级别推荐DOM。
一种替代方法就是使用外部的脚本和样式文件。
[编辑] SGML 排斥
SGML赋予DTD作者将特定的元素排斥在某个元素之外的能力。此种限制(被称为排斥)在XML中是不可能的。
例如,HTML 4的严格文档类型描述禁止“a ”作为子元素嵌套在其他“a ”的内部。这在XML中是不可能检查出这种限制的。尽管这种限制无法在DTD中定义,也不要嵌套使用某些特定的元素。关于此类元素和不能嵌套使用的元素概览可以在标准的元素限制里找到。
[编辑] 拥有“ id”和“ name”属性的元素
HTML 4定义了a, applet, form, frame, iframe, img, and map元素的 name属性。HTML 4还引入了id属性。这两个属性被设计用作片段标识符。
在XML里面,片段标识符是ID类型的,而且每个元素只能拥有单一的ID类型的属性。所以,在XHTML 1.0中id属性被定义为ID类型。为了确保XHTML 1.0文档是构建优良的XML文档,XHTML 1.0文档在为以上所列元素定义片段标识符时必须使用id属性。当XHTML文档作为text/html媒体类型使用时,确保此类锚点的向后兼容性信息参见兼容性指南。
注意:在XHTML 1.0中,不赞成此类元素拥有name属性,在XHTML的后续版本中将被去掉。
[编辑] 拥有预设值的属性
有一些属性在HTML 4和XHTML中都有一套预设值(比如input元素的type属性)。在SGML和XML中,这些被称为枚举属性。在HTML 4里这些值的解释是不分大小写的,所以值TEXT等同于text。在XML里,这些值的解析是区分大小写的,在XHTML1中,所有的这些值定义为小写。
[编辑] 十六进制值的实体映射
SGML和XML都允许使用十六进制的数值来映射字符。在SGML里这些映射可以使用nn或者nn。在XML文档中,必须使用小写的方式(比如,nn)。
Ruby on Rails 正在令整个 Web 开发领域受到震憾。让我们首先了解底层的技术:Ruby 是一门免费的、简单的、直观的、可扩展的、可移植的、解释的脚本语言,用于快速而简单的面向对象编程。类似于 Perl,它支持 处理文本文件和执行系统管理任务的很多特性。
Rails 是用 Ruby 编写的一款完整的、开放源代码的 Web 框架,目的是使用更简单而且更少的代码编写实际使用的应用程序。
作为一个完整碧坦的框架,这意味着 Rails 中的所有的层都是为协同工作而构造的,所以您不必自己再重复,可以完全只使用一门单一的语言。 在 Rails 中,所有内容(从模板到控制流再到业务逻辑)都是用 Ruby 编写的。Rails 支持基于配置文件和注释的反射(reflection)和运行时扩展。
本文详细介绍了 Rails 的组成部分,并介绍了它的工作原理。
Rails 介绍
关于 Rails,首先需要理解的是它的模型/视图/控制器(model/view/controller,MVC)架构。虽然这种技术不是 Rails 所特有的 —— 甚至不是 Web 应茄岩用程序所特有的(相对于其他程序),但是 Rails 具有非常清晰而专一的 MVC 思维方式。如果您并不使用 MVC 方法,那么 Rails 的用处将大为降低(与遵循其模式的情况相比)。
模型
Rails 应用程序的模型部分主要是它所使用的底层数据库。实际上,在很多情形中 Rails 应用程序正是以一种受管理的方式对关系型数据库管理 系统(RDBMS)中的数据执行 *** 作的一个途径。
ActiveRecord 类是 Rails 的一个核心组成部分,它将关系型表映射为 Ruby 对象,使其成为控制器可以 *** 作并能在视图 中显示的数据。Rails 应用程序特别倾向于使用广为应用的 MySQL 数据库,不过也有与很多其他颤慧御 RDBMS 的绑定,比如 IBM? DB2?。
如果您愿意,您可以添加 Ruby 代码来在应用程序模型中执行额外的验证,加强数据关联,或者触发其他 *** 作。应用程序的 app/models/ 目录中的 Ruby 文件能够调用 ActiveRecord 的多种验证方法。不过,您也可以将模型代码留作一个存根,而只是依赖保存数据 的 RDBMS 的约束。例如,我在这个示例中所开发的应用程序只包含这个骨架模型代码(至少在开始时是):
清单 1. 骨架模型 app/models/contact.rb
class Contact <ActiveRecord::Base
end
控制器
控制器以其抽象形式执行应用程序的逻辑。也就是说,应用程序的 app/controllers/ 目录中的 Ruby 脚本能把模型数据导入为变量,保存回去,或对其进行修改 和处理。不过,控制器不关心用户如何适当地显示或者输入数据。在通常的 MVC 模型中,这可以让用户能够以多种方式与同一控制器进行交互:本地 GUI, Web 界面,以及视力较弱的人使用的语音界面都可以与相同的控制器进行交互。
不过,Rails 不像那样非常通用;相反,它仅局限于在 Web 页中提供和收集数据。虽然如此,但是您可以修改那些 Web 页的布局 —— 颜色、字体、表格、 样式表单,等等 —— 与控制器代码无关。
视图
Rails 视图是我们编写 Ruby 代码的地方。Rails 包含有一门用于 .rhtml 的非常好的模板语言,它将纯粹的 HTML 与嵌入的 Ruby 代码组合起来。 Rails 应用程序界面的最表层外观通常是由 CSS 样式表单控制的。.rhtml 格式是一种增强的 HTML。实际上,一个简单的 HTML 文件本身也是一个 合法的 RHTML 模板,不过,不应该忽略 RHTML 为您提供的脚本控制。
RHTML 是真正的模板格式 —— 不仅是在 HTML 中嵌入代码的方式 —— 这是一种更为有效的方法。如果您熟悉 PHP,那么可以考虑 PHP 本身与 Smarty 模板之间的对照。也就是说,嵌入的脚本只是将代码与未被解释的 HTML 混合在一起;当需要向客户机输出某些内容时,代码部分 仍要负责执行 print 语句。
与之不同的是,模板引擎向 HTML 添加了一组定制的标签,让您能够将条件、循环以及其他逻辑作为增强的 HTML 标记的一部分来表示。
回页首
生成代码
Rails 所提供的工具主要是一组代码生成器。相对于那些强迫我使用严格的工作空间和 IDE 的开发环境,我更喜欢这种方法。 Rails 不会妨碍您,但是却会为您省去大部分手工编程的工作 —— 或者,通过提供“可自由获得的”初步(first-pass)支架(scaffolding), 至少帮助您轻松将需要手工编码的工作分为多个部分。
支架 概念是 Rails 中的核心概念。非常简单的应用程序可能完全不用编码,让 Rails 在运行时动态地生成客户机 HTML 页面。 第一遍生成代码时创建的只是粗略的支架;接下来您可以生成更详细的能够定制的控制器、视图和模型。不过在开始时不需要生成太多。
Rails 对其文件的组织是固定的而且非常普通的,不过这种组织相对严格。如果您试图强行使用其他文件和代码组织方式,那么您可能得 付出努力去修改 Rails 环境。再者说,我找不到不使用 Rails 所提供的组织方式的理由;在大部分情况下,它“fits your brain”(Ruby 的 支持者喜欢这样讲)。例如,如果您从头开始设计一个框架(至少如果您以“Ruby 方式”思考),那么这些目录名称及其组织可能与您的选择非常接近。
回页首
构建一个简单的应用程序
在 Ruby on Rails Web 站点上有一些教程,可以完整地引导您创建一个简单的 Rails 应用程序(见 参考资料)。 这里的示例程序与之类似,因为正确开始构建 Rails 应用程序的方式是确定的。由于此介绍的长度相对较短,所以我 极力 推荐 那些较长的教程中的一篇,以使得您能够打好更为全面的基础。
示例应用程序是一个基本的通讯录。它演示了创建应用程序的一般步骤:
生成模型(在此步骤中创建 MySQL 数据库和表)。
生成应用程序(包括生成基本代码和目录)。
启动 Rails(并配置数据库的访问)。
创建一些内容(包括生成支架模型和控制器,并告知控制器去使用那个支架)。
我们将详细研究每一个步骤。
生成 AddressBook 模型
对于任何应用程序,您需要做的第一件事情是为它创建一个存放数据的数据库。技术上这个步骤不必最先进行,不过需要在早期完成;应该在编写任何 应用程序代码(甚至是自动生成的代码)之前创建数据库,这应该是显然的。所以,让我们在 MySQL 数据库中创建一个数据库,并在此数据库中创建第一张表。 (阅读其他文档以了解如何安装运行 MySQL 或其他 RDBMS。)
我们假定 MySQL 已经安装并且可用。
清单 2. 创建 MySQL 数据库和表
[~/Sites]$ cat AddressBook.sql
CREATE DATABASE IF NOT EXISTS AddressBook
USE AddressBook
CREATE TABLE IF NOT EXISTS contacts (
id smallint(5) unsigned NOT NULL auto_increment,
name varchar(30) NOT NULL default '',
created_on timestamp(14) NOT NULL,
updated_on timestamp(14) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY name_key (name)
) TYPE=MyISAM COMMENT='List of Contacts'
[~/Sites]$ cat AddressBook.sql | mysql
在这第一张表中有些地方需要注意。最重要的是每一张表都必须拥有一个 id 列,列名称就是 id。Rails 使用 主键列 id 来完成各种记录保持和引用任务。域 created_on 和 updated_on 是不需要的,不过,如果您使用了它们,那么 Rails 会自动地“在后台”维护它们;在大部分情况下使用这些时间戳没有什么不好。所以,您还要添加的“真正” 数据就只是通讯录内容的名称。
另一个稍微古怪的方面是,Rails 为不同的内容使用单数和复数的名称。根据上下文,各种条目会被重命名为单数或复数形式。表的名称应该使用复数格式。 我没有使用不规则复数单词的经验;datum 和 data 等单词可能会令 Rails 出现问题。
生成 AddressBook 应用程序
既然已经拥有了一个能够交互的数据库,就可以创建 AddressBook 应用程序了。第一个步骤是简单地运行 rails 来生成基本目录和支架代码:
清单 3. 生成基本代码和目录
[~/Sites]$ rails AddressBook
create
create app/apis
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create components
[...]
create public/images
create public/javascripts
create public/stylesheets
create script
[...]
create README
create script/generate
create script/server
[...]
我删减了运行 rails 的输出;所忽略了那些行只是提醒您已经创建的各种文件和目录。在您的系统上试运行它,浏览生成的所有文件。 我已经在代码中显示了一些最重要的文件和目录。
运行 Rails
创建了 AddressBook/ 目录和所需要的子目录后,您需要执行一次惟一的初始配置。首先,通过修改 YAML 配置文件来设置数据库,如下:
清单 4. 配置数据库访问
[~/Sites]$ cd AddressBook
[~/Sites/AddressBook]$ head -6 config/database.yml # after editing
development:
adapter: mysql
database: AddressBook
host: localhost
username: some_user
password: password_if_needed
最后,您需要提供数据。Rails 附带了它自己的单一功能的 Web 服务器,即 WEBrick,非常适用于我们的试验。您可能也会遵循 Ruby on Rails Web 站点上的说明来配置 Apache 或者其他服务器,以通过 FCGI(或者普通的 CGI,但是普通的 CGI 将会较慢)向 Rails 应用程序提供服务。
清单 5. 启动 WEBrick 服务器
[~/Sites/AddressBook]$ ruby script/server -d
=>Rails application started on http://0.0.0.0:3000
[2005-03-21 17:57:38] INFO WEBrick 1.3.1
[2005-03-21 17:57:38] INFO ruby 1.8.2 (2004-12-25) [powerpc-darwin7.8.0]
创建一些内容
要在 WEBrick 端口上看到一个欢迎页面,先前的步骤就足够了。例如,在我的本地系统中,现在可以访问 http://gnosis-powerbook.local:3000/。不过,为了 *** 作定制数据库,需要 生成稍微多一些代码。可以使用脚本 generate 来完成此任务, 这个脚本创建在 AddressBook/ 应用程序目录中:
清单 6. 支架模型和控制器代码的生成
[~/Sites/AddressBook]$ ruby script/generate model contact
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/contact.rb
create test/unit/contact_test.rb
create test/fixtures/contacts.yml
[~/Sites/AddressBook]$ ruby script/generate controller contact
exists app/controllers/
exists app/helpers/
create app/views/contact
exists test/functional/
create app/controllers/contact_controller.rb
create test/functional/contact_controller_test.rb
create app/helpers/contact_helper.rb
注意,在相应的表名中,这里应该使用单数的 contact,而不是复数的 contacts。
现在需要编辑一个或多个生成的文件(只需稍加编辑)来让控制器去使用支架:
清单 7. 告知控制器去使用支架
[~/Sites/AddressBook]$ cat app/controllers/contact_controller.rb
class ContactController <ApplicationController
model :contact
scaffold :contact
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)