比较好的基本资料首页 新闻 论坛 问答 博客 招聘 更多 ▼
专栏 圈子 搜索
您还未登录 ! 我的应用 登录 注册
Swingchen
永久域名 http://swingchen.javaeye.com
2009-03-01
缩略显示
Tomcat5.5.12 实现Session持久化的配置
关键字: session manager配置
至于Session的基本知识这里就不仔细描述,Session在Web应用服务开发中广泛被应用,利用该内置对象可以传递(保存)用户数据(页面间的参数)等。
应用...
首页 新闻 论坛 问答 博客 招聘 更多 ▼
专栏 圈子 搜索
您还未登录 ! 我的应用 登录 注册
Swingchen
永久域名 http://swingchen.javaeye.com
2009-03-01
缩略显示
Tomcat5.5.12 实现Session持久化的配置
关键字: session manager配置
至于Session的基本知识这里就不仔细描述,Session在Web应用服务开发中广泛被应用,利用该内置对象可以传递(保存)用户数据(页面间的参数)等。
应用Session的web程序要求客户端开放cookie,在jsp技术中如果客户端浏览器为了安全关闭cookie,那么可以采用页面重发的机制来解决客户端Session ID丢失的问
,从而保证程序的正确运行。
在客户端每个用户的Session对象存在Servlet容器中,如果Tomcat服务器重起/当机的话该session就会丢失,而客户端的操作应为session的丢失而造成数据丢失,而且当前用户访问量巨大,每个用户的Session里存放大量的数据的话,那么就很占用服务器大量的内存,从而是服务器的性能受到影响。
在Tomcat里,系统提供Session的持久化策略。其中对session的存储提供两种办法,一个是本地文件存储,一个是数据库存储,本文详细介绍Tomcat5.5.12里对session的本地存储配置
。
笔者在调试时是在windowsXP sp2系统下进行,JDK1.5。
进入tomcat的配置文档目录/conf,可以看到context.xml文件,我们将在这里配置Session持久化,配置后将对所有的站点生效。
打开context.xml,在
节点下添加如下节点:
debug=0;
saveOnRestart="true"
maxActiveSession="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1"
元素是专门用来配置Session的,该元素中的每个属性如下解释:
l className:Session的管理类,tomcat将会通过定义的接口来应用该类生成的对象。
l debug:Session管理器的跟踪级别。
l saveOnRestart:(true/false)配置服务重启工程中对session的处理,若为true,则关闭前把有效的session保存,启动后重新载入。
l maxActiveSession:活动状态Session的最大数,为-1时则不限制,否则Session Manager将会把超出的Session对象转移到Session Store中。
l minIdleSwap:Session不活动的最短时间,超过该时间,Session Manager 可能会把该Session对象转移到Session Store中,单位为秒。
l maxidleSwap:Session不活动的最长时间,超过该时间,Session Manager 将会把该Session对象转移到Session Store中,该Session将不在内存中。
l maxidleBackup: Session不活动的最长时间,超过该时间,Session Manager 将会把该Session对象备份到Session Store中,但该Session对象依然存在内存中。
l 指定实现持久化的类和Session存放的文件位置,如该例子中指定的类是:org.apache.catalina.session.FileStore,而Session对象存放的目录则是tomcat根目录下的session文件夹(当然自己创建)
配置完后可以写一个简单的jsp页面,在页面上显示本次用户访问的Session ID,然后重起tomcat,再刷新该页面,可以看到该Session Id不变,而在/session目录下自动生成一个以session id为名,以“session”为扩展名的文件。该Session的持久化配置成功。
· 22:39
· 浏览 (459)
· 评论 (1)
· 分类: JAVA
2009-03-01
缩略显示
Tomcat中Context容器配置详解
关键字: tomcat
Context元素代一个web应用,运行在某个特定的虚拟主机上。如Servlet Specification 2.2或以后版本中描述的那样,每个web应用基于一个Web Application Archive(WAR)文件,或者是一个目录,包含WAR文件解压后的内容。有关Web Application Archive的更多信息,可以参考Servlet Specification和Tomcat 应用程序开发者指南。
通过将请求URI的最长可能前缀与每个Context的context路径进行匹配,Catalina选择相应的web 应用处理HTTP请求。一旦选定,根据web application deployment descriptor 文件中定义的servlet映射,Context会选择一个正确的servlet来处理进来的请求。servlet映射必须定义在该web应用目录层次结构中的/WEB-INF/web.xml中。
你可以在一个Host元素中嵌套任意多的Context元素。每个Context的路径必须是惟一的,由path属性定义。另外,你必须定义一个context路径长度为0的Context,这个Context称为该虚拟主机的缺省web应用,用来处理那些不能匹配任何Context的Context路径的请求。
除了在Host元素中嵌套Context元素以外,你也可以将它们存储在单个文件中(以.xml为后缀),放在$CATALINA_HOME/conf/[enginename]/[hostname]/目录下面。有关这方面的更多信息,参考应用的自动发布。这种方法允许动态重新配置web应用,因为如果修改了conf/server.xml,就必须重新启动Tomcat。
除了明确指定Context元素以外,还有其他几种技术可以自动生成Context元素。参考Automatic Application Deployment 和 User Web Applications
以下的描述使用变量$CATALINA_HOME来指Tomcat 5安装的目录。大多数的相对路径都是以该目录为基准。但是,通过设置CATALINA_BASE目录,可以运行多个Tomcat 5实例,这时你应该使用$CATALINA_BASE来作为目录基准,而不是使用$CATALINA_HOME。
属性
通用属性
所有Context的实现支持如下属性:
属性
描述
backgroundProcessorDelay
这个值代表在context及其子容器(包括所有的wrappers)上调用backgroundProcess方法的延时,以秒为单位。如果延时值非负,子容器不会被调用,也就是说子容器使用自己的处理线程。如果该值为正,会创建一个新的线程。在等待指定的时间以后,该线程在主机及其 子容器上调用backgroundProcess方法。context利用后台处理session过期,监测类的变化用于重新载入。如果没有指定,该属性的缺省值是-1,说明context依赖其所属的Host的后台处理。
className
实现的Java类名。该类必须实现org.apache.catalina.Context接口。如果没有指定,使用实现(在下面定义)。
cookies
如果想利用cookies来传递session identifier(需要客户端支持cookies),设为ture。否则为false,这种情况下只能依靠URL Rewriting传递session identifier。
crossContext
如果想在应用内调用ServletContext.getContext()来返回在该虚拟主机上运行的其他web application的request dispatcher,设为true。在安全性很重要的环境中,设为false,使得getContext()总是返回null。缺省值为false。
docBase
该web应用的文档基准目录(Document Base,也称为Context Root),或者是WAR文件的路径。可以使用绝对路径,也可以使用相对于context所属的Host的appBase路径。
override
如果想利用该Context元素中的设置覆盖DefaultContext中相应的设置,设为true。缺省情况下使用DefaultContext中的设置。
privileged
设为true,允许context使用container servlets,比如manager servlet。
path
web应用的context路径。catalina将每个URL的起始和context path进行比较,选择合适的web应用处理该请求。特定Host下的context path必须是惟一的。如果context path为空字符串(""),这个context是所属Host的缺省web应用,用来处理不能匹配任何context path的请求。
reloadable
如果希望Catalina监视/WEB-INF/classes/和/WEB-INF/lib下面的类是否发生变化,在发生变化的时候自动重载web application,设为true。这个特征在开发阶段很有用,但也大大增加了服务器的开销。因此,在发布以后,不推荐使用。但是,你可以使用Manager应用在必要的时候触发应用的重载。
wrapperClass
org.apache.catalina.Wrapper实现类的名称,用于该Context管理的servlets。如果没有指定,使用标准的缺省值。
标准实现
Context的标准实现是org.apache.catalina.core.StandardContext.它还支持如下的附加属性:
属性
描述
debug
与这个Engine关联的Logger的调试信息的详细程度。数字越大,输出越详细。如果没有指定,缺省为0。
swallowOutput
如果该值为true,System.out和System.err的输出被重定向到web应用的logger。如果没有指定,缺省值为false
useNaming
如果希望Catalina为该web应用使能一个JNDI InitialContext对象,设为true。该InitialialContext符合J2EE平台的约定,缺省值为true。
workDir
Context提供的临时目录的路径,用于servlet的临时读/写。利用javax.servlet.context.tempdir属性,servlet可以访问该目录。如果没有指定,使用$CATALINA_HOME/work下一个合适的目录。
嵌套组件
下列元素可以嵌套在Context元素中,但每个元素至多只能嵌套一次。
· Loader-配置该web应用用来加载servlet和javabean的类加载器。正常情况下,使用缺省的类加载器就足够了;
· Logger - 配置用来接收和处理所有日志消息的logger,包括调用ServletContext.log()函数记录的所有消息;
· Manager -配置用于创建,销毁,维持HTTP session的session manager.正常情况下,使用缺省的session manager配置就足够了;
· Realm - 配置Realm,该Realm的用户数据库以及相关的角色仅用于这个特定的web应用中。如果没有指定,该web应用使用所属的Host或Engine的Realm。
· Resources - 配置用于访问与这个web应用相关联的静态资源。正常情况下,使用缺省的resource manager就足够了。
专有特征
访问日志
正常情况下,运行web服务器会生成访问日志。访问日志以标准格式为每个请求输出一行信息。Catalina包含一个可选的Valve实现,可以用标准格式生成日志,还可以使用任意定制的格式。
通过在Engine,Host或者Context中嵌套一个Valve元素,Catalina会为该容器处理的所有请求创建访问日志,如下所示:
...
...
参考Access Log Valve,以获得更多配置属性的信息;
Context的自动配置
如果使用标准的Context实现,当Catalina启动,或者重载web应用的时候,如下的配置步骤会自动发生,不需要特殊的配置来使能这个特征。
· 如果没有定义自己的Loader元素,将会配置一个标准的web应用class loader;
· 如果没有定义自己的Manager元素,会配置一个标准的session manager;
· 如果没有定义自己的Resources元素,使用标准的resource manager。
· 在conf/web.xml中列出的web应用的属性会当做该web应用的缺省的属性。这被用于建立缺省的映射(比如将.jsp映射成对应的JSP servlet),以及其他的标准属性。
· 列举在/WEB-INF/web.xml资源中的属性被处理(如果资源存在);
· 如果web应用指定了安全限制,并且可能需要对用户进行认证,Catalina会配置选定的Authenticator,该Authenticator实现了login方法。
Context参数
可以在Context中元素中嵌套元素,配置带有名称的值,这些值作为servletcontext初始化参数,对整个web应用可见。比如,你可以像这样创建初始化参数:
...
...
这与在/WEB-INF/web.xml中包含如下元素相等:
companyName
My Company, Incorporated
区别是,前者不需要修改deployment descriptor来定制这个值。
元素的有效属性值如下:
属性
描述
description
关于该context初始化参数的文字描述(可选)
name
要创建的context初始化参数的名称
override
如果不希望/WEB-INF/web.xml中具有相同参数名称的覆盖这里指定的值,设为false。缺省值为true。
value
调用ServletContext.getInitParameter()时,返回给应用的参数值。
环境条目
可以在Context中嵌套元素,配置命名的值,这些值作为环境条目资源(Environment Entry Resource),对整个web应用可见。比如,可以按照如下方法创建一个环境条目:
...
...
这与在/WEB-INF/web.xml中包含如下元素是等价的:
maxExemptions
10
java.lang.Integer
区别是,前者不需要修改deployment descriptor来定制这个值。
元素的有效属性所如下:
属性
描述
description
环境条目的文字描述(可选)
name
环境条目的名称,相对于java:comp/env context。
override
如果不希望/WEB-INF/web.xml中具有相同名称的覆盖这里指定的值,设为false。缺省值为true。
type
环境条目的Java类名的全称.在/WEB-INF/web.xml中,必须是如下的值:java.lang.Boolean, java.lang.Byte, java.lang.Character, java.lang.Double, java.lang.Float, java.lang.Integer, java.lang.Long, java.lang.Short, or java.lang.String.
value
通过JNDI context请求时,返回给应用的参数值。这个值必须转换成type属性定义的Java类型
生命期Listeners
如果一个Java对象需要知道Context什么时候启动,什么时候停止,可以在这个对象中嵌套一个Listener元素。该Listener元素必须实现了org.apache.catalina.LifecycleListener接口,在发生对应的生命期事件的时候,通知该Listener。可以按照如下的格式配置这样的Listener:
...
...
注意,一个listener可以具有任意多的附加属性。属性名与JavaBean的属性名相对应,使用标准的属性命名方法。
请求过滤器(Request Filters)
对每个发送到Engine,Host或者Context的请求,可以要求Catalina检查IP地址或主机名称。Catalina使用一系列配置好的“接受”或者“拒绝”过滤器对客户端的地址或者主机名进行检查,过滤器是按照正则表达式语法定义的,由Jakarta Regexp正则表达式库支持。不被接受的请求会返回一个HTTP“Forbidden”错误。下面是过滤器的定义。
...
...
资源定义(Resource Definitions)
可以在/WEB-INF/web.xml中定义资源的特性。使用JNDI查找和元素时,这些特性被返回。对同一资源名称,还必须定义资源参数(见下面“资源参数”小节),这些参数用来配置对象工厂(object factory)以及对象工厂的属性。
比如,你可以按照如下方式创建资源定义:
...
...
这等价于在/WEB-INF/web.xml中包含如下元素:
Employees Database for HR Applications
jdbc/EmployeeDB
javax.sql.DataSource
Container
区别是,前者不需要修改deployment descriptor来定制这个值。
元素的有效属性如下:
属性
描述
auth
指定时web应用代码本身sign on到对应的resource mananger,还是由container代表web应用sign on到resource manager。该属性的值必须是Application或者Container。如果在web application deployment descriptor中使用,这个属性是必需的,如果使用,这个属性是可选的。
description
资源的文字描述(可选)
name
资源的名称,相对于java:comp/env context
scope
指定通过这个resource manager得到的连接是否共享。该属性的值必须是Shareable或者Unshareable。缺省情况下,假定连接是共享的。
type
当web应用查找该资源的时候,返回的Java类名的全称。
资源参数
资源参数用来配置资源管理器(resource manager,或对象工厂,object factory)。在做JNDI查找时,资源管理器返回查找的对象。在资源可以被访问之前,对或元素的每个元素,或者/WEB-INF/web.xml中定义的每个或元素,都必须定义资源参数。
资源参数是用名称定义的,使用的资源管理器(或者object factory)不同,参数名称的集合也不一样。这些参数名和工厂类的JavaBeans属性相对应。JNDI实现通过调用对应的JavaBeans属性设置函数来配置特定的工厂类,然后通过lookup()调用使得该实例可见。
一个JDBC数据源的资源参数可以按照如下方式定义:
...
driverClassName
org.hsql.jdbcDriver
url
jdbc:HypersonicSQL:database
user
dbusername
password
dbpassword
...
如果你需要为某个特定的资源类型指定工厂内的Java类名,在元素中嵌套一个叫做factory的条目。
元素的有效属性如下:
属性
描述
name
配置的资源名称,相对于java:comp/env context。这个名称必须与$CATALINA_HOME/conf/server.xml中某个元素定义的资源名称匹配,或者在/WEB-INF/web.xml中通过或者元素应用。
资源连接(Resource Links)
资源连接用于创建到全局JNDI资源的连接。在连接名称上进行JNDI查询会返回被连接的global 资源。
比如,你可以按照如下方法创建一个资源连接:
...
元素的有效属性如下:
属性
描述
global
被连接的连接全局资源的名称
name
创建的资源连接的名称,相对于java:comp/env context
type
当web应用在该资源连接上进行查找时,返回的Java类名的全称
· 22:11
· 浏览 (258)
· 评论 (0)
· 分类: JAVA
2008-07-13
缩略显示
log4j 配置详解
关键字: log4j 配置
通常,我们都提供一个名为 log4j.properties的文件,在第一次调用到Log4J时,Log4J会在类路径(../web-inf/class/当然也可以放到其它任何目录,只要该目录被包含到类路径中即可)中定位这个文件,并读入这个文件完成的配置。这个配置文件告诉Log4J以什么样的格式、把什么样的信息、输出到什么地方。
Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局),这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明:
1、 Loggers
Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发生了一个级别Q比P高,则可以启动,否则屏蔽掉。
假设你定义的级别是info,那么error和warn的日志可以显示而比他低的debug信息就不显示了。
Java程序举例来说:
//建立Logger的一个实例,命名为“com.foo”
Logger logger = Logger.getLogger("com.foo"); //"com.foo"是实例进行命名,也可以任意
//设置logger的级别。通常不在程序中设置logger的级别。一般在配置文件中设置。
logger.setLevel(Level.INFO);
Logger barlogger = Logger.getLogger("com.foo.Bar");
//下面这个请求可用,因为WARN >= INFO
logger.warn("Low fuel level.");
//下面这个请求不可用,因为DEBUG < INFO
logger.debug("Starting search for nearest gas station.");
//命名为“com.foo.bar”的实例barlogger会继承实例“com.foo”的级别。因此,下面这个请求可用,因为INFO >= INFO
barlogger.info("Located nearest gas station.");
//下面这个请求不可用,因为DEBUG < INFO
barlogger.debug("Exiting gas station search");
这里“是否可用”的意思是能否输出Logger信息。
在对Logger实例进行命名时,没有限制,可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例,这是目前来讲比较有效的Logger命名方式。这样可以使得每个类建立自己的日志信息,便于管理。比如:
static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());
2、Appenders
禁用与使用日志请求只是Log4j其中的一个小小的地方,Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。
其语法表示为:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
配置时使用方式为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
这样就为日志的输出提供了相当大的便利。
3、Layouts
有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。
其语法表示为:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
配置时使用方式为:
log4j.appender.appenderName.layout =fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
Log4j的配置
以上是从原理方面说明Log4j的使用方法,在具体Java编程使用Log4j可以参照以下示例:
1、 建立Logger实例:
语法表示:public static Logger getLogger( String name)
实际使用:static Logger logger = Logger.getLogger(ServerWithLog4j.class.getName ()) ;
2、 读取配置文件:
获得了Logger的实例之后,接下来将配置Log4j使用环境:
语法表示:
BasicConfigurator.configure():自动快速地使用缺省Log4j环境。
PropertyConfigurator.configure(String configFilename):读取使用Java的特性文件编写的配置文件。
DOMConfigurator.configure(String filename):读取XML形式的配置文件。
实际使用:
PropertyConfigurator.configure("ServerWithLog4j.properties");
3、 插入日志信息
完成了以上连个步骤以后,下面就可以按日志的不同级别插入到你要记录日志的任何地方了。
语法表示:
Logger.debug(Object message);//调试信息
Logger.info(Object message);//一般信息
Logger.warn(Object message);//警告信息
Logger.error(Object message);//错误信息
Logger.fatal(Object message);//致命错误信息
实际使用:logger.info("ServerSocket before accept: " + server);
配置过程
在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用。
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是java properties(key=value)【Java特性文件(键=值)】。下面我们介绍使用Java特性文件做为配置文件的方法
具体如下:
1、配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
level : 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
appenderName:就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
例如:log4j.rootLogger=info,A1,B2,C3
2、配置日志信息输出目的地,其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class //
"fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个:
1.org.apache.log4j.ConsoleAppender(控制台)
2.org.apache.log4j.FileAppender(文件)
3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
1.ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
2.FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
3.DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到 mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天两次
5)'.'yyyy-MM-dd-HH: 每小时
6)'.'yyyy-MM-dd-HH-mm: 每分钟
4.RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内
本文档为【比较好的基本资料】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。