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)的做法,以提高程序的阅读性、维护性和方便性。
本章中,笔者将详细介绍如...
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
初始设置
pageScope.number |
|
requestScope.number |
|
第七章 JSTL 1.1 136
JSP2.0技术手册
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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。