为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

JSP2.0_7

2010-12-21 35页 pdf 921KB 10阅读

用户头像

is_807493

暂无简介

举报
JSP2.0_7 7 第七章 JSTL 1.1 JSTL全名为 JavaServer Pages Standard Tag Library,目前最新的版本为 1.1 版。JSTL是由 JCP(Java Community Process)所制定的标准规范,它主要提供给 Java Web开发人员一个标准通用的标签函数库。 Web程序员能够利用 JSTL和 EL来开发Web程序,取代传统直接在页面上 嵌入 Java程序(Scripting)的做法,以提高程序的阅读性、维护性和方便性。 本章中,笔者将详细介绍如...
JSP2.0_7
7 第七章 JSTL 1.1 JSTL全名为 JavaServer Pages Standard Tag Library,目前最新的版本为 1.1 版。JSTL是由 JCP(Java Community Process)所制定的标准规范,它主要提供给 Java Web开发人员一个标准通用的标签函数库。 Web程序员能够利用 JSTL和 EL来开发Web程序,取代传统直接在页面上 嵌入 Java程序(Scripting)的做法,以提高程序的阅读性、维护性和方便性。 本章中,笔者将详细介绍如何使用 JSTL中各种不同的标签,将依序介绍条 件、循环、URL、U18N、XML、SQL等标签的用法,让读者对 JSTL有更深层 的了解,并且能够学会如何使用 JSTL。本章将分 6节来介绍: 7-1 JSTL 1.1 简介 7-2 核心标签库 (Core tag library) 7-3 I18N 格式标签库 (I18N-capable formatting tags library) 7-4 SQL 标签库 (SQL tag library) 7-5 XML 标签库 (XML tag library) 7-6 函数标签库 (Functions tag library) JSP2.0技术手册 第七章 JSTL 1.1 126 JSP2.0技术手册 7-1 JSTL 1.1简介 JavaServer Pages Standard Tag Library (1.1 ),它的中文名称为 JSP标准标签函数库。JSTL是 一个标准的已制定好的标签库,可以应用于各种领域,如:基本输入输出、流程控制、循环、 XML文件剖析、数据库查询及国际化和文字格式标准化的应用等。从表 7-1可以知道,JSTL 所提供的标签函数库主要分为五大类: (1) 核心标签库 (Core tag library) (2) I18N格式标签库 (I18N-capable formatting tag library) (3) SQL标签库 (SQL tag library) (4) XML标签库 (XML tag library) (5) 函数标签库 (Functions tag library) 表 7-1 JSTL 前置名称 URI 范 例 核心标签库 c http://java.sun.com/jsp/jstl/core I18N格式标签库 fmt http://java.sun.com/jsp/jstl/xml SQL标签库 sql http://java.sun.com/jsp/jstl/sql XML标签库 xml http://java.sun.com/jsp/jstl/fmt 函数标签库 fn http://java.sun.com/jsp/jstl/functions 另外,JSTL也支持 EL(Expression Language)语法,例如:在一个标准的 JSP页面中可能会 使用到如下的写法: <%= userList.getUser().getPhoneNumber() %> 使用 JSTL搭配传统写法会变成这样: 使用 JSTL搭配 EL,则可以改写成如下的形式: 虽然对网页设计者来说,假如没有学过 Java Script或者是第一次看到这种写法时,可能会 搞不太懂,但是与 Java语法相比,这应该更加容易学习。 7-1-1 安装使用 JSTL 1.1 JSTL 1.1必须在支持Servlet 2.4且 JSP 2.0以上版本的Container才可使用。JSTL主要由Apache组织 的 Jakarta Project所实现,因此读者可以到 http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/ 下载实 现好的 JSTL 1.1,或者直接使用本书光盘中 JSTL 1.1,软件名称为:jakarta-taglibs-standard-current.zip。 下载完后解压缩,可以发现文件夹中所包含的内容如图 7-1所示: 7-1 JSTL 1.1简介 127 图 7-1 jakarta-taglibs-standard-1.1.0-B1的目录结构 将 lib中的 jstl.jar、standard.jar复制到 Tomcat的WEB-INF\lib中,然后就可以在 JSP网页中使 用 JSTL了。除了复制 .jar文件外,最好也把 tld文件的目录也复制到WEB-INF中,以便日后使用。 注意 lib目录下,除了 jstl.jar和 standard.jar之外,还有 old-dependencies目录,这目录里面的东西是 让之前 JSTL 1.0的程序也能够在 JSTL 1.1环境下使用。tld目录下有许多 TLD文件,其中大部 分都是 JSTL 1.0的 TLD文件,例如:c-1_0.tld和 c-1_0-rt.tld。 下面写一个测试用的范例程序HelloJSTL.jsp,程序主要是显示浏览器的版本和欢迎的字符串。 HelloJSTL.jsp „ <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 测试你的第一个使用到 JSTL的网页
你使用的浏览器是:
在 HelloJSTL.jsp的范例里,笔者用到核心标签库(Core)中的标准输出功能和 EL的 header 隐含对象。若要在 JSP网页中使用 JSTL时,一定要先做下面这行声明: < %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 这段声明表示我将使用 JSTL的核心标签库。一般而言,核心标签库的前置名称(prefix)都 JSP2.0技术手册 第七章 JSTL 1.1 128 为 c,当然你也可以自行设定。不过 uri此时就必须为 http://java.sun.com/jsp/jstl/core。 注意 JSTL 1.0中,核心标签库的 uri默认为 http://java.sun.com/jstl/core,比 JSTL 1.1少一个 jsp/ 的路径。 因为 JSTL 1.1同时支持 JSTL 1.0和 1.1,所以假若核心标签库的 uri为 http://java.sun.com/jstl/core, 则将会使用到 JSTL 1.0的核心标签库。 接下来使用核心标签库中的 out标签,显示 value的值。${header['User-Agent']}表示取 得表头里的 User-Agent的值,即有关用户浏览器的种类。 HelloJSTL.jsp的执行结果如图 7-2所示。 图 7-2 HelloJSTL.jsp的执行结果 假若读者想要自定义 taglib的 uri时,那就必须在 web.xml中加入设定值。例如:假若 uri 想要改为 http://www.javaworld.com.tw/jstl/core时,web.xml就必须加入如下设定: http://www.javaworld.com.tw/jstl/core /WEB-INF/tld/c.tld 在上面的设定中,主要是设定标签库的 URI;而则是用来设 定标签对应的 TLD文件。因此,使用<%@ taglib %>指令时,可以直接写成如下语句: <%@ taglib prefix="c" uri="http://www.javaworld.com.tw/jsp/jstl/core" %> 7-1-2 JSTL 1.1 VS. JSTL 1.0 JSTL 1.0更新至 JSTL 1.1时,有以下几点不同: JSP2.0技术手册 7-1 JSTL 1.1简介 129 JSP2.0技术手册 (1) EL原本是定义在 JSTL 1.0的,现在 EL已经正式纳入 JSP 2.0标准规范中,所以在 JSTL 1.1规范中,已经没有 EL的部分,但是 JSTL依旧能使用 EL。 (2) JSTL 1.0中,又分 EL和 RT两种函数库,到了 JSTL 1.1之后,已经不再分这两种了。 以下说明 EL和 RT的差别: EL „ 完全使用 Expression Language „ 简单 „ 建议使用 RT „ 使用 Scriptlet „ Java语法 „ 供不想转换且习惯旧表示法的开发者使用 笔者在此强烈建议大家使用 EL来做,简单又方便。 (3) JSTL 1.1新增函数(functions)标签库,主要提供一些好用的字符串处理函数,例如: fn:contains、 fn:containsIgnoreCase、 fn:endsWith、 fn:indexOf、 fn:join、 fn:length、 fn:replace、fn:split、fn:startsWith和 fn:substring 等等。 除了上述三项比较大的改变之外,还包括许多小改变,在此不多加说明,有兴趣的读者可 以去看 JSTL 1.1附录 B“Changes”部分,那里有更详尽的说明。 7-1-3 安装 standard-examples 当解压缩 jakarta-taglibs-standard-current.zip后,文件夹内(见图7-1)有一个standard-examples.war 的文件,将它移至 Tomcat的 webapps后,重新启动 Tomcat会发现,在 webapps目录下多 了一个 standard-examples 的目录。接下来我们打开 IE,在 URL 位置上输入 http://localhost:8080/ standard-examples,你将会看到图 7-3所示的画面。 这个站台有很多 JSTL的范例,它包括以下几部分: z General Purpose Tags z Conditional Tags z Iterator Tags z Import Tags z I18N & Formatting Tags z XML Tags z SQL Tags z Functions z Tag Library Validators z Miscellaneous 第七章 JSTL 1.1 130 图 7-3 standard-examples站台 这些范例程序几乎涵盖了所有的 JSTL标签函数库,假若读者对哪一个标签的使用有问题, 可以先来找一找这里的范例程序,应该或多或少会有所帮助。 7-2 核心标签库 (Core tag library) 首先介绍的核心标签库(Core)主要有:基本输入输出、流程控制、迭代操作和 URL 操作。 详细的分类如表 7-2所示,接下来笔者将为读者一一介绍每个标签的功能。 表 7-2 分 类 功能分类 标签名称 表达式操作 out set remove catch 流程控制 if choose when otherwise Core 迭代操作 forEach forTokens JSP2.0技术手册 7-2 核心标签库 (Core tag library) 131 JSP2.0技术手册 续表 分 类 功能分类 标签名称 Core URL操作 import param url param redirect param 在 JSP中要使用 JSTL中的核心标签库时,必须使用<%@ taglib %>指令,并且设定 prefix 和 uri的值,通常设定如下: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 上述的功用在于声明将使用 JSTL的核心标签库。 注意 假若没有上述声明指令,将无法使用 JSTL的核心功能,这是读者在使用 JSTL时必须要小心的地方。 7-2-1 表达式操作 表达式操作分类中包含四个标签:。接下来将 依序介绍这四个标签的用法。 ● 主要用来显示数据的内容,就像是 <%= scripting-language %> 一样,例如: Hello ! 语法 语法1:没有本体(body)内容 语法2:有本体内容 default value 属性 名 称 说 明 EL 类 型 必 须 默认值 value 需要显示出来的值 Y Object 是 无 default 如果 value的值为 null,则显示 default的值 Y Object 否 无 escapeXml 是否转换特殊字符,如:< 转换成 < Y boolean 否 true 第七章 JSTL 1.1 132 JSP2.0技术手册 注意 表格中的 EL字段,表示此属性的值是否可以为 EL表达式,例如:Y表示 attribute = "${表达 式}" 为符合语法的,N则反之。 Null 和 错误处理 · 假若 value为 null,会显示 default的值;假若没有设定 default的值,则会显示一个空的字符串。 说明 一般来说,默认会将 <、>、’、” 和 & 转换为 <、>、'、" 和 &。假若不想转换时,只需要设定的 escapeXml属性为 fasle就可以了(见表 7-3)。 表 7-3 字符 Entity < < > > ’ ' ” " & & 范例 1.在网页上显示 Hello JSP 2.0 !! ; 2.在网页上显示 8; 3.在网页上显示由窗体传送过来的 data参数之值,假若没有 data参数,或 data参数的值为 null时,则网页上会显示 No Data; 4.在网页上显示“

有特殊字符

”; 5.在网页上显示“有特殊字符”。 ● 主要用来将变量储存至 JSP范围中或是 JavaBean的属性中。 语法 语法1:将 value的值储存至范围为scope的 varName 变量之中 语法2:将本体内容的数据储存至范围为scope的 varName 变量之中 … 本体内容 7-2 核心标签库 (Core tag library) 133 JSP2.0技术手册 语法3:将 value的值储存至 target 对象的属性中 < c:set value="value" target="target" property="propertyName" /> 语法4:将本体内容的数据储存至 target 对象的属性中 … 本体内容 属性 名 称 说 明 EL 类型 必须 默认值 value 要被储存的值 Y Object 否 无 var 欲存入的变量名称 N String 否 无 scope var变量的 JSP范围 N String 否 page target 为一JavaBean或 java.util.Map对象 Y Object 否 无 property 指定 target对象的属性 Y String 否 无 Null 和 错误处理 语法・ 3和语法 4会产生异常错误,有以下两种情况: ・target为 null ・target不是 java.util.Map或 JavaBean对象 假若・ value为 null时:将由储存变量改为移除变量 语法・ 1:由 var和 scope所定义的变量,将被移除 若・ scope已指定时,则 PageContext.removeAttribute(varName, scope) 若・ scope未指定时,则 PageContext.removeAttribute(varName) 语法・ 3: 假若・ target为Map时,则Map.remove(property) 假若・ target为 JavaBean时,property指定的属性为 null 说明 使用时,var主要用来存放表达式的结果;scope则是用来设定储存的范围,例如: 假若 scope="session",则将会把数据储存在 session中。如果中没有指定 scope时,则 它会默认存在 Page范围里。 注意 var和 scope这两个属性不能使用表达式来表示,例如:我们不能写成 scope="${ourScope}"或者 是 var="${username}"。 我们考虑下列的写法: 第七章 JSTL 1.1 134 JSP2.0技术手册 把 1+1 的结果 2 储存到 number 变量中。如果没有 value 属性,此时 value 之值 在之间,本体内容看下面的范例: 上面的 部分可以改写成 2或是 <%=1+1%> ,结果都会一样, 也就是说,是把本体(body)运算后的结果来当做 value 的值。另外,会把 body 中最开头和结尾的空白部分去掉。如: 1 + 1 则 number中储存的值为 1 + 1而不是 1 + 1。 范例 ${3 + 5} 1.将 2存入 Request范围的 number变量中; 2.将 8存入 Session范围的 number变量中; 3. 假若 ${param.number}为 null时,则移除 Request范围的 number变量;若${param.number} 不为 null时,则将 ${param.number}的值存入 Request范围的 number变量中; 4.假若 ${param.Username}为 null 时,则设定 User(JavaBean)的 name 属性为 null;若不为 null时,则将 ${param.Username}的值存入 User(JavaBean)的 name属性(setter机制)。 注意 上述范例的 3.中,假若 ${param.number}为 null时,则表示移除 Request范围的 number变量。 ● 主要用来移除变量。 语法 属性 名 称 说 明 EL 类型 必须 默认值 var 欲移除的变量名称 N String 是 无 scope var变量的 JSP范围 N String 否 page 7-2 核心标签库 (Core tag library) 135 JSP2.0技术手册 说明 必须要有 var属性,即要被移除的属性名称,scope则可有可无,例如: 将 number变量从 Session范围中移除。若我们不设定 scope,则将会从 Page、 Request、Session 及 Application 中顺序寻找是否存在名称为 number 的数据,若能找到时,则 将它移除掉,反之则不会做任何的事情。 范例 笔者在这里写一个使用到的范例,能让读者可以更快地了解如何使用 它们,此范例的名称为 Core_set_remove.jsp。 „ Core_set_remove.jsp <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> CH7 - Core_set_remove.jsp

<%= 3 %> 4 初始设置 第七章 JSTL 1.1 136 JSP2.0技术手册
pageScope.number
requestScope.number
sessionScope.number

pageScope.number
requestScope.number
sessionScope.number

pageScope.number
requestScope.number
sessionScope.number
笔者一开始各在 Page、Request和 Session三个属性范围中储存名称为 number的变量。然 后先使用把 Page中的 number变量移除,最后再使 用把所有属性范围中 number的变量移除。Core_set_remove.jsp 的执行结果如图 7-4所示: 7-2 核心标签库 (Core tag library) 137 图 7-4 Core_set_remove.jsp的执行结果 ● 主要用来处理产生错误的异常状况,并且将错误信息储存起来。 语法 … 欲抓取错误的部分 属性 名 称 说 明 EL 类型 必须 默认值 var 用来储存错误信息的变量 N String 否 无 说明 主要将可能发生错误的部分放在之间。如果真的发生错 误,可以将错误信息储存至 varName变量中,例如: : //可能发生错误的部分 JSP2.0技术手册 第七章 JSTL 1.1 138 另外,当错误发生在之间时,则只有之间的 程序会被中止忽略,但整个网页不会被中止。 范例 笔者写一个简单的范例,文件名为 Core_catch.jsp,来让大家看一下的使用方式。 Core_catch.jsp „ <%@ page contentType="text/html;charset=GB2312 " %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> CH7 - Core_catch.jsp

<% String eFormat = "not number"; int i = Integer.parseInt(eFormat); %> ${error_Message} 笔者将一个字符串转成数字,如果字符串可以转为整数,则不会发生错误。但是这里笔者故 意传入一个不能转成数字的字符串,让之间产生错误。当错误发生时,它会自动将错误 存到 error_Message变量之中,最后再用把错误信息显示出来,执行结果如图 7-5所示。 图 7-5 Core_catch.jsp的执行结果 可以发现到网页确实显示格式错误的信息。如果我们不使用,而把范例中的 拿掉,结果如图 7-6所示。 JSP2.0技术手册 7-2 核心标签库 (Core tag library) 139 图 7-6 Core_catch.jsp没有的执行结果 7-2-2 流程控制 流程控制分类中包含四个标签:,笔者依 此顺序依次说明这四个标签的使用。 ● 的用途就和我们一般在程序中用的 if一样。 语法 语法1:没有本体内容(body) 语法2:有本体内容 本体内容 JSP2.0技术手册 第七章 JSTL 1.1 140 JSP2.0技术手册 属性 名 称 说 明 EL 类 型 必 须 默认值 test 如果表达式的结果为 true,则执行本体内容,false则相反 Y boolean 是 无 var 用来储存 test运算后的结果,即 true或 false N String 否 无 scope var变量的 JSP范围 N String 否 page 说明 标签必须要有 test属性,当 test中的表达式结果为 true时,则会执行本体内容;如 果为 false,则不会执行。例如:${param.username = = 'admin'},如果 param.username等 admin时,结果为 true;若它的内容不等于 admin时,则为 false。 于 接下来看下列的范例: ADMIN您好!! //body部分 如果名称等于 admin,则会显示"ADMIN您好!! "的动作,如果相反,则不会执行的 body部分,所以不会显示"ADMIN您好!! //body部分"。另外的本体内容除了能放纯文字, 还可以放任何 JSP程序代码(Scriptlet)、JSP 标签或者 HTML码。 除了 test属性之外,还有另外两个属性 var和 scope。当我们执行的时候,可 以将这次判断后的结果存放到属性 var 里;scope 则是设定 var 的属性范围。哪些情况才会用 到 var和 scope这两个属性呢?例如:当表达式过长时,我们会希望拆开处理,或是之后还须 使用此结果时,也可以用它先将结果暂时保留,以便日后使用。 范例 笔者写了一个简单的范例,名称为 Core_if.jsp。 „ Core_if.jsp <%@ page contentType="text/html;charset=GB2312 " %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> CH7 - Core_if.jsp

您好 Admin先生
7-2 核心标签库 (Core tag library) 141 JSP2.0技术手册 执行结果为: ${condition} 笔者在判断用户送来的参数时,如果 username的值等于 Admin时,则会将 condition设 为 true并存放于 pageScope中,否则存放于 condition中,最后再显示结果。因为 JSTL会自 动 找 寻 condition 所 存 在 的 属 性 范 围 , 因 此 只 须 使 用 ${condition}, 而 不 用 ${pageScope.condition}。Core_if.jsp的执行结果如图 7-7。 注意 执行本范例时,请在 Core_if.jsp后加上?username=Admin。 图 7-7 Core_if.jsp的执行结果 ● 本身只当做 的父标签。 语法 本体内容( ) 属性 无 限制 的本体内容只能有: ·空白 ·1或多个 ·0或多个 第七章 JSTL 1.1 142 JSP2.0技术手册 说明 若使用来做流程控制时,两者都必须为的子标签,即: 的用途就和我们一般在程序中用的 when一样。 语法 本体内容 属性 名 称 说 明 EL 类型 必须 默认值 test 如果表达式的结果为 true,则执行本体内容,false 则 相反 Y boolean 是 无 限制 ・ 必须在 之间 在同一个・ 中时, 必须在 之前 说明 必须有 test属性,当 test中的表达式结果为 true时,则会执行本体内容;如果 为 false时,则不会执行。 ● 在同一个 中,当所有 的条件都没有成立时,则执行 的本体内容。 7-2 核心标签库 (Core tag library) 143 JSP2.0技术手册 语法 本体内容 属性 无 限制 · 必须在 之间 ·在同一个 中时, 必须为最后一个标签 说明 在同一个 中,假若所有 的 test 属性都不为 true 时,则执行 的本体内容。 范例 笔者举一个典型的 范例: condition1为 true condition2为 true condition1和 condition2都为 false 范例说明:当condition1为true时,会显示“condition1为true”;当condition1为false且 condition2为true时,会显示“condition2为true”,如果两者都为false,则会显示“condition1 和condition2都为false”。 注意 假若 condition1和 condition2两者都为 true时,此时只会显示"condition1 为 true",这是因为在 同一个下,当有好几个都符合条件时,只能有一个成立。 第七章 JSTL 1.1 144 JSP2.0技术手册 7-2-3 迭代操作 迭代(Iterate)操作主要包含两个标签:,笔者依此顺序依次说 明这两个标签的使用。 ● 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为 当条件符合时,就会持续重复执行的本体内容。 语法 语法1:迭代一集合对象之所有成员 本体内容 < /c:forEach> 语法2:迭代指定的次数 本体内容 属性 名 称 说 明 EL 类型 必须 默认值 var 用来存放现在指到的成员 N String 否 无 items 被迭代的集合对象 Y Arrays Collection Iterator Enumeration Map String 否 无 varStatus 用来存放现在指到的相关成员信息 N String 否 无 begin 开始的位置 Y int 否 0 end 结束的位置 Y int 否 最后一个成员 step 每次迭代的间隔数 Y int 否 1 限制 ·假若有 begin属性时,begin必须大于等于 0 ·假若有 end属性时,必须大于 begin 7-2 核心标签库 (Core tag library) 145 JSP2.0技术手册 ·假若有 step属性时,step必须大于等于 0 Null 和 错误处理 ·假若 items为 null时,则表示为一空的集合对象 ·假若 begin大于或等于 items时,则迭代不运算 说明 如果要循序浏览一个集合对象,并将它的内容显示出来,就必须有 items属性。 范例 下面的范例 Core_forEach.jsp是将数组中的成员一个个显示出来的: „ Core_forEach.jsp <%@ page contentType="text/html;charset=GB2312 " %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> CH7 - Core_forEach.jsp

<% String atts[] = new String [5]; atts[0]="hello"; atts[1]="this"; atts[2]="is"; atts[3]="a"; atts[4]="pen"; request.setAttribute("atts", atts); %> ${item}
在上述范例中,笔者先产生一个字符串数组,然后将此数组 atts储存至 Request的属性 范围中,再用将它循序浏览一遍。这里 items 表示被浏览的集合对象,var 用 来存放指定的集合对象中成员,最后使用将 item 的内容显示出来,执行结果如图 -8所示。 7 第七章 JSTL 1.1 146 图 7-8 Core_forEach.jsp的执行结果 注意 varName的范围只存在的本体中,如果超出了本体,则不能再取得 varName的值。 上个例子中,若${item} 是在之后执行时,如: ${item}
${item}则不会显示 item的内容。 除了支持数组之外,还有标准 J2SE 的集合类型,例如:ArrayList、List、 LinkedList、Vector、Stack和 Set 等等;另外还包括 java.util.Map类的对象,例如:HashMap、 Hashtable、Properties、Provider和 Attributes。 还有 begin、end和 step这三种属性:begin主要用来设定在集合对象中开始 的位置(注意:第一个位置为 0);end 用来设定结束的位置;而 step 则是用
/
本文档为【JSP2.0_7】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索