文档库 最新最全的文档下载
当前位置:文档库 › Quartz2.2版本开发手册(JAVA)

Quartz2.2版本开发手册(JAVA)

Quartz2.2版本开发手册(JAVA)
Quartz2.2版本开发手册(JAVA)

Quartz2.2版本开发手册

Java版

2014年5月13日星期二

What is Quartz?

Job Scheduling Library

Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.

Quartz is freely usable, licensed under the Apache 2.0 license.

什么是Quartz?

作业调度图书馆

Quartz是一个功能丰富的,开源的作业调度库,可以在几乎任何Java应用程序集成- 从最小的独立的应用程序,以最大的电子商务系统。Quartz可以用来创建简单或复杂的调度执行几十,几百,甚至是数万名成千上万的就业机会; job被定义为标准的Java组件可以执行几乎任何你可以编程他们做。Quartz调度包括了许多企业级特性,如JTA事务和集群支持。

Quartz是可自由使用的,基于Apache2.0许可协议发布。

目录

1.1 Quartz手册java版-(一)使用Quartz (3)

1.2 Quartz手册java版-(二)Jobs And Triggers (4)

1.3 Quartz手册java版-(三)更多关于Jobs和JobDetails (6)

1.4 Quartz手册java版-(四)关于Triggers更多内容 (10)

1.5 Quartz手册java版-(五) SimpleTrigger (13)

1.6 Quartz手册java版-(六)CronTrigger (15)

1.7 Quartz手册java版-(七)TriggerListeners和JobListeners (17)

1.8 Quartz手册java版-(八)SchedulerListeners (19)

1.9 Quartz手册java版-(九)JobStores (20)

1.10 Quartz手册java版-(十)配置、资源使用以及SchedulerFactory (23)

1.11 Quartz手册java版-(十一)高级(企业级)属性 (25)

1.12 Quartz手册java版-(十二)Quartz 的其他特性 (26)

1.1 Quartz手册java版-(一)使用Quartz

使用scheduler之前应首先实例化它。使用SchedulerFactory可以完成scheduler的实例化。

用户可直接地实例化这个工厂类并且直接使用工厂的实例(例如下面的例子)。一旦一个scheduler被实例化,它就可以被启动(start),并且处于驻留模式,直到被关闭(shutdown)。

注意,一旦scheduler被关闭(shutdown),则它不能再重新启动,除非重新实例化它。

除非scheduler 被启动或者不处于暂停状态,否则触发器不会被触发(任务也不能被执行)。

下面是一个代码片断,这个代码片断实例化并且启动了一个scheduler,接着将一个要执行的任务纳入了进程。

SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); Scheduler sched = schedFact.getScheduler();

sched.start();

JobDetail jobDetail = new JobDetail("myJob",

null,

DumbJob.class);

Trigger trigger = TriggerUtils.makeHourlyTrigger(); // fire every hour trigger.setStartTime(TriggerUtils.getEvenHourDate(new Date())); // start on the next even hour

trigger.setName("myTrigger");

sched.scheduleJob(jobDetail, trigger);

如您所见,使用quartz相当简单,在第二课中,我们将给出一个Job和Trigger 的快速预览,这样就能够充分理解这个例子。

1.2 Quartz手册java版-(二)Jobs And Triggers

正如前面所提到的那样,通过实现Job接口来使你的.NET组件可以很简单地被scheduler执行。下面是Job接口:

package org.quartz;

public interface Job {

public void execute(JobExecutionContext context)

throws JobExecutionException;

}

这样,你会猜想出,当Job触发器触发时(在某个时刻),Execute (..)就被scheduler所调用。

JobExecutionContext对象被传递给这个方法,它为Job实例提供了它的“运行时”环境-一个指向执行这个IJob实例的Scheduler句柄,

一个指向触发该次执行的触发器的句柄,IJob的JobDetail对象以及一些其他的条目。

JobDetail对象由Quartz客户端在Job被加入到scheduler时创建。

它包含了Job的各种设置属性以及一个JobDataMap对象,这个对象被用来存储给定Job类实例的状态信息。

Trigger对象被用来触发jobs的执行。你希望将任务纳入到进度,要实例化一个Trigger并且“调整”它的属性以满足你想要的进度安排。

Triggers也有一个JobDataMap与之关联,这非常有利于向触发器所触发的Job 传递参数。

Quartz打包了很多不同类型的Trigger,但最常用的Trigge类是SimpleTrigger 和CronTrigger。

SimpleTrigger用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。

CronTrigger按照日历触发,例如“每个周五”,每个月10日中午或者10:15分。

为什么要分为Jobs和Triggers?很多任务日程管理器没有将Jobs和Triggers 进行区分。

一些产品中只是将“job”简单地定义为一个带有一些小任务标识的执行时间。其他产品则更像Quartz中job和trigger的联合。

而开发Quartz的时候,我们决定对日程和按照日程执行的工作进行分离。(从我们的观点来看)这有很多好处。

例如:jobs可以被创建并且存储在job scheduler中,而不依赖于trigger,而且,很多triggers可以关联一个job.

另外的好处就是这种“松耦合”能使与日程中的Job相关的trigger过期后重新配置这些Job,

这样以后就能够重新将这些Job纳入日程而不必重新定义它们。这样就可以更改或者替换trigger而不必重新定义与之相连的job标识符。

当向Quartz scheduler中注册Jobs 和Triggers时,它们要给出标识它们的名字。Jobs 和Triggers也可以被放入“组”中。

“组”对于后续维护过程中,分类管理Jobs和Triggers非常有用。Jobs和Triggers的名字在组中必须唯一,

换句话说,Jobs和Triggers真实名字是它的名字+组。如果使Job或者Trigger 的组为‘null’,

这等价于将其放入缺省的Scheduler.DEFAULT_GROUP组中。

1.3 Quartz手册java版-(三)更多关于Jobs和JobDetails

如你所见,Job相当容易实现。这里只是介绍有关Jobs本质, Job接口的Execute(..)方法以及JobDetails中需要理解的内容。

在所实现的类成为真正的“Job”时,期望任务所具有的各种属性需要通知给Quartz。

通过JobDetail类可以完成这个工作,这个类在前面的章节中曾简短提及过。现在,我们花一些时间来讨论Quartz中Jobs的本质和Job实例的生命周期。首先让我们回顾一下第一课中所看到的代码片断

JobDetail jobDetail = new JobDetail("myJob", // job name sched.DEFAULT_GROUP, // job group (you can also specify 'null' to use the default group)

DumbJob.class); // the java class to execute

Trigger trigger = TriggerUtils.makeDailyTrigger(8, 30);

trigger.setStartTime(new Date());

trigger.setName("myTrigger");

sched.scheduleJob(jobDetail, trigger);

现在定义一个DumbJob类

public class DumbJob implements Job {

public DumbJob() {

}

public void execute(JobExecutionContext context)

throws JobExecutionException

{

System.err.println("DumbJob is executing.");

}

}

注意我们传递给scheduler一个JobDetail实例,JobDetail关联一个job,提供job的class,每次scheduler执行job时,在执行execute(...)

这前会创建一个实例.job必须有一个无参构造方法.

你可能想问如何提供配置 job实例.或者保存job状态在执行过程中.答案是JobDataMap.它是JobDetail的一部分.

JobDataMap

JobDataMap被用来保存一系列的(序列化的)对象,这些对象在Job执行时可以得到。

JobDataMap是Map接口的一个实现,而且还增加了一些存储和读取主类型数据的便捷方法。

jobDetail.getJobDataMap().put("jobSays", "Hello World!");

jobDetail.getJobDataMap().put("myFloatValue", 3.141f);

jobDetail.getJobDataMap().put("myStateData", new ArrayList());

下面的代码展示了在Job执行过程中从JobDataMap 获取数据的代码

public class DumbJob implements Job {

public DumbJob() {

}

public void execute(JobExecutionContext context)

throws JobExecutionException

{

String instName = context.getJobDetail().getName();

String instGroup = context.getJobDetail().getGroup();

JobDataMap dataMap = context.getJobDetail().getJobDataMap();

String jobSays = dataMap.getString("jobSays");

float myFloatValue = dataMap.getFloat("myFloatValue");

ArrayList state = (ArrayList)dataMap.get("myStateData");

state.add(new Date());

System.err.println("Instance " + instName + " of DumbJob says: " + jobSays);

}

}

如果使用一个持久的JobStore(在本指南的JobStore章节中讨论),那么必须注意存放在JobDataMap中的内容。

因为放入JobDataMap中的内容将被序列化,而且容易出现类型转换问题。很明显,标准.NET类型将是非常安全的,

但除此之外的类型,任何时候,只要有人改变了你要序列化其实例的类的定义,就要注意是否打破了程序的兼容性。

另外,你可以对JobStore和JobDataMap采用一种使用模式:就是只把主类型和String类型存放在Map中,

这样就可以减少后面序列化的问题。

Triggers也可以有JobDataMaps与之相关联。当scheduler中的Job被多个有规律或者重复触发的Triggers所使用时非常有用。

对于每次独立的触发,你可为Job提供不同的输入数据。

从Job执行时的JobExecutionContext中取得JobDataMap是惯用手段,它融合了从JobDetail和从Trigger中获的JobDataMap,

当有相同名字的键时,它用后者的值覆盖前者值。

下面给一个例子取数据从JobExecutionContext 关联JobDatMap在job执行中public class DumbJob implements Job {

public DumbJob() {

}

public void execute(JobExecutionContext context)

throws JobExecutionException

{

String instName = context.getJobDetail().getName();

String instGroup = context.getJobDetail().getGroup();

JobDataMap dataMap = context.getMergedJobDataMap(); // Note the difference from the previous example

String jobSays = dataMap.getString("jobSays");

float myFloatValue = dataMap.getFloat("myFloatValue");

ArrayList state = (ArrayList)dataMap.get("myStateData");

state.add(new Date());

System.err.println("Instance " + instName + " of DumbJob says: " + jobSays);

}

}

StatefulJob——有状态任务

现在,一些关于Job状态数据的附加论题:一个Job实例可以被定义为“有状态的”或者“无状态的”。

“无状态的”任务只拥有它们被加入到scheduler时所存储的JobDataMap。这意味着,

在执行任务过程中任何对Job Data Map所作的更改都将丢失而且任务下次执行时也无法看到。

你可能会猜想出,有状态的任务恰好相反,它在任务的每次执行之后重新存储JobDataMap。

有状态任务的一个副作用就是它不能并发执行。换句话说,如果任务有状态,那么当触发器在这个任务已经在执行的时候试图触发它,这个触发器就会被阻塞(等待),直到前面的执行完成。

想使任务有状态,它就要实现StatefulJob 接口而不是实现Job接口.

Job 'Instances' 任务“实例”

这个课程的最终观点或许已经很明确,可以创建一个单独的Job类,

并且通过创建多个JobDetails实例来将它的多个实例存储在scheduler中,

这样每个JobDetails对象都有它自己的一套属性和JobDataMap,而且将它们都加入到scheduler中。

当触发器被触发的时候,通过Scheduler中配置的JobFactory来实例化与之关联的Job类。

缺省的JobFactory只是简单地对Job类调用newInstance()方法。

创建自己JobFactory可以利用应用中诸如Ioc或者DI容器所产生或者初始化的Job实例。

jobs的其它属性

这里简短地总结一下通过JobDetail对象可以定义Job的其它属性。

Durability(持久性)-如果一个Job是不持久的,一旦没有触发器与之关联,它就会被从scheduler 中自动删除。

Volatility(无常性)-如果一个Job是无常的,在重新启动Quartz i scheduler 时它不能被保持。

RequestsRecovery(请求恢复能力) -如果一个Job具备“请求恢复”能力,当它在执行时遇到scheduler “硬性的关闭”

(例如:执行的过程崩溃,或者计算机被关机),那么当scheduler重新启动时,这个任务会被重新执行。

这种情况下,JobExecutionContext.isRecovering() 属性将是true。JobListeners(任务监听器) -一个Job如果有0个或者多个JobListeners监听器与之相关联,当这个Job执行时,监听器被会被通知。

更多有关JobListeners的讨论见TriggerListeners & JobListeners

章节。

JobExecutionException 任务执行异常

最后,需要告诉你一些关于Job.Execute(..)方法的细节。在Execute方法被执行时,仅允许抛出一个JobExecutionException类型异常。

因此需要将整个要执行的内容包括在一个'try-catch'块中。应花费一些时间仔细阅读JobExecutionException文档,

因为Job能够使用它向scheduler提供各种指示,你也可以知道怎么处理异常。

1.4 Quartz手册java版-(四)关于Triggers更多内容

同Job一样,trigger非常容易使用,但它有一些可选项需要注意和理解,同时,trigger有不同的类型,要按照需求进行选择。

Calendars——日历

Quartz Calendar对象在trigger被存储到scheduler时与trigger相关联。Calendar对于在trigger触发日程中的采用批量世间非常有用。

例如:你想要创建一个在每个工作日上午9:30触发一个触发器,那么就添加一个排除所有节假日的日历。

Calendar可以是任何实现Calendar接口的序列化对象。看起来如下;

package org.quartz;

public interface Calendar {

public boolean isTimeIncluded(long timeStamp);

public long getNextIncludedTime(long timeStamp);

}

注意,这些方法的参数都是DateTime型,你可以猜想出,它们的时间戳是毫秒的格式。这意味日历能够排除毫秒精度的时间。

最可能的是,你可能对排除整天的时间感兴趣。为了提供方便,Quartz提供了一个Quartz.Impl.Calendar.HolidayCalendar,

这个类可以排除整天的时间。

Calendars必须被实例化,然后通过addCalendar (..)方法注册到scheduler 中。如果使用HolidayCalendar,在实例化之后,

你可以使用它的AddExcludedDate (DateTime excludedDate))方法来定义你想要从日程表中排除的时间。

同一个calendar实例可以被用于多个trigger中,如下:

HolidayCalendar cal = new HolidayCalendar();

cal.addExcludedDate( someDate );

sched.addCalendar("myHolidays", cal, false);

Trigger trigger = TriggerUtils.makeHourlyTrigger(); // fire every one hour interval

trigger.setStartTime(TriggerUtils.getEvenHourDate(new Date())); // start on the next even hour

trigger.setName("myTrigger1");

trigger.setCalendarName("myHolidays");

// .. schedule job with trigger

Trigger trigger2 = TriggerUtils.makeDailyTrigger(8, 0); // fire every day at 08:00

trigger.setStartTime(new Date()); // begin immediately

trigger2.setName("myTrigger2");

trigger2.setCalendarName("myHolidays");

// .. schedule job with trigger2

传入SimpleTrigger构造函数的参数的细节将在下章中介绍。但是,任何在日历中被排除的时间所要进行的触发都被取消。

Priority

有时,当有多个Triggers时,Quartz没有足够的资源来同时立即处理scheduled 的trigger.所以你可能要控制哪个先执行.

在这种情况下,你要设置Trigger的priority,如果N个triggers不会同时触发.但此时只有有限的几个线程可用.这时会先处

理级别高的trigger.如果你没有设置级别,默认为5,下面为一个例子: Calendar cal = Calendar.getInstance();

cal.add(Calendar.MINUTE, 5);

Trigger trig1 = new SimpleTrigger("T1", "MyGroup", cal.getTime()); Trigger trig2 = new SimpleTrigger("T2", "MyGroup", cal.getTime()); Trigger trig3 = new SimpleTrigger("T3", "MyGroup", cal.getTime());

JobDetail jobDetail = new JobDetail("MyJob", "MyGroup", NoOpJob.class);

// Trigger1 does not have its priority set, so it defaults to 5 sched.scheduleJob(jobDetail, trig1);

// Trigger2 has its priority set to 10

trig2.setJobName(jobDetail.getName());

trig2.setPriority(10);

sched.scheduleJob(trig2);

// Trigger2 has its priority set to 1

trig3.setJobName(jobDetail.getName());

trig2.setPriority(1);

sched.scheduleJob(trig3);

// Five minutes from now, when the scheduler invokes these three triggers // they will be allocated worker threads in decreasing order of their // priority: Trigger2(10), Trigger1(5), Trigger3(1)

Misfire Instructions——未触发指令

Trigger的另一个重要属性就是它的“misfire instruction(未触发指令)”。如果因为scheduler被关闭而导致持久的触发器“错过”了触发时间,这时,未触发就发生了。不同类型的触发器有不同的未触发指令。

缺省情况下,他们会使用一个“智能策略”指令——根据触发器类型和配置的不同产生不同动作。

当scheduler开始时,它查找所有未触发的持久triggers,然后按照每个触发器所配置的未触发指令来更新它们。

开始工程中使用Quartz的时,应熟悉定义在各个类型触发器上的未触发指令。关于未触发指令信息的详细说明将在每种特定的类型触发器的指南课程中给出。可以通过MisfireInstruction属性来为给定的触发器实例配置未触发指令。

TriggerUtils - Triggers Made Easy(TriggerUtils——使Triggers变得容易)TriggerUtils类包含了创建触发器以及日期的便捷方法。使用这个类可以轻松地使触发器在每分钟,小时,日,星期,月等触发。

使用这个类也可以产生距离触发最近的妙、分或者小时,这对设定触发开始时间非常有用。

TriggerListeners

最后,如同job一样,triggers可以注册监听器,实现TriggerListener接口的对象将可以收到触发器被触发的通知。

1.5 Quartz手册java版-(五) SimpleTrigger

如果需要让任务只在某个时刻执行一次,或者,在某个时刻开始,然后按照某个时间间隔重复执行,

简单地说,如果你想让触发器在2007年8月20日上午11:23:54秒执行,然后每个隔10秒钟重复执行一次,并且这样重复5次。

那么SimpleTrigger 就可以满足你的要求。

通过这样的描述,你可能很惊奇地发现SimpleTrigger包括这些属性:开始时间,结束时间,重复次数,重复间隔。

所有这属性都是你期望它所应具备的,只有end-time属性有一些条目与之关联。

重复次数可能是0,正数或者一个常量值SimpleTrigger.REPEAT_INDEFINITELY。重复间隔时间属性可能是0,

正的long型,这个数字以毫秒为单位。注意:如果指定的重复间隔时间是0,那么会导致触发器按照‘重复数量’定义的次数并发触发(或者接近并发)。org.quartz.helpers.TriggerUtils 类对处理这样的循环也提供了很多支持。

endTime(如果这个属性被设置)属性会覆盖重复次数属性,这对创建一个每隔10秒就触发一次直到某个时间结束的触发器非常有用,

这就可以不计算开始时间和结束时间之间的重复数量。也可以指定一个结束时间,然后使用REPEAT_INDEFINITELY作为重复数量。

(甚至可以指定一个大于结束时间之前实际重复次数的整数作为重复次数)。一句话,endTime属性控制权高于重复次数属性。

SimpleTrigger有几个不同的构造函数,下面我们来看看这结果构造函数: public SimpleTrigger(String name, String group,Date startTime,Date endTime,int repeatCount,long repeatInterval)

SimpleTrigger Example 1 - Create a trigger that fires exactly once, ten seconds from now

long startTime = System.currentTimeMillis() + 10000L;

SimpleTrigger trigger = new SimpleTrigger("myTrigger", null,new

Date(startTime),null,0,0L);

SimpleTrigger Example 2 - Create a trigger that fires immediately, then repeats every 60 seconds, forever

SimpleTrigger trigger = new SimpleTrigger("myTrigger", null, new

Date(),null,SimpleTrigger.REPEAT_INDEFINITELY,60L * 1000L);

SimpleTrigger Example 3 - Create a trigger that fires immediately, then repeats every 10 seconds until 40 seconds from now

long endTime = System.currentTimeMillis() + 40000L;

SimpleTrigger trigger = new SimpleTrigger("myTrigger","myGroup", new

Date(),new Date(endTime), SimpleTrigger.REPEAT_INDEFINITELY,10L * 1000L);

SimpleTrigger Example 4 - Create a trigger that fires on March 17 of the year 2002 at precisely 10:30 am, and repeats 5 times (for a total of 6 firings) - with a 30 second delay between each firing

java.util.Calendar cal = new java.util.GregorianCalendar(2002,

cal.MARCH, 17);

cal.set(cal.HOUR, 10);

cal.set(cal.MINUTE, 30);

cal.set(cal.SECOND, 0);

cal.set(https://www.wendangku.net/doc/d815923017.html,LISECOND, 0);

Data startTime = cal.getTime()

SimpleTrigger trigger = new SimpleTrigger("myTrigger", null, startTime,null,5,30L * 1000L);

SimpleTrigger Misfire Instructions——SimpleTrigger的未触发指令

“未触发”发生时,SimpleTrigger有几个指令可以用来通知Quartz进行相关处理。(“未触发”在上节课中介绍过了)。

这些指令以常量形式定义在SimpleTrigger本身,这些指令如下:

MISFIRE_INSTRUCTION_FIRE_NOW

MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT

MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT

回顾前面的课程你可以知道,每个触发器都有一个

Trigger.MISFIRE_INSTRUCTION_SMART_POLICY指令可用,

并且,这个指令对于每个类型的触发器都是缺省的。

如果使用 "smart policy" 指令,SimpleTriger会基于配置和SimpleTrigger实例的状态动态的选择上面的指令.

SimpleTrigger.updateAfterMisfire() 会获取动态行为的详细信息.

1.6 Quartz手册java版-(六)CronTrigger

如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,

CronTriggers通常比SimpleTrigger更有用。

使用CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午

9:00到上午10:00之间每隔五分钟”这样日程安排来触发。甚至,象SimpleTrigger一样,

CronTrigger也有一个StartTime以指定日程从什么时候开始,也有一个(可选的)EndTime以指定何时日程不再继续。

Cron表达式被用来配置CronTrigger实例。Cron表达式是一个由7个子表达式组成的字符串。

每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:

1. Seconds 秒

2. Minutes 分钟

3. Hours 小时

4. Day-of-Month 月中的天

5. Month 月

6. Day-of-Week 周中的天

7. Year (optional field) 年(可选的域)

一个cron表达式的例子字符串为"0 0 12 ? * WED",这表示“每周三的中午12:00”。

单个子表达式可以包含范围或者列表。例如:前面例子中的周中的天这个域(这里是"WED")可以被替换为"MON-FRI", "MON, WED, FRI"或者甚至"MON-WED,SAT"。

通配符('*')可以被用来表示域中“每个”可能的值。因此在"Month"域中的*表示每个月,而在Day-Of-Week域中的*则表示“周中的每一天”。

所有的域中的值都有特定的合法范围,这些值的合法范围相当明显,例如:秒和分域的合法值为0到59,小时的合法范围是0到23,

Day-of-Month中值得合法凡范围是0到31,但是需要注意不同的月份中的天数不同。

月份的合法值是0到11。或者用字符串JAN,FEB MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 及DEC来表示。

Days-of-Week可以用1到7来表示(1=星期日)或者用字符串SUN, MON, TUE, WED, THU, FRI 和SAT来表示.

'/'字符用来表示值的增量,例如, 如果分钟域中放入'0/15',它表示“每隔15分钟,从0开始”,

如果在份中域中使用'3/20',则表示“小时中每隔20分钟,从第3分钟开始”或者另外相同的形式就是'3,23,43'。

'?'字符可以用在day-of-month及day-of-week域中,它用来表示“没有指定值”。

这对于需要指定一个或者两个域的值而不需要对其他域进行设置来说相当有用。

'L'字符可以在day-of-month及day-of-week中使用,这个字符是"last"的简写,但是在两个域中的意义不同。

例如,在day-of-month域中的"L"表示这个月的最后一天,即,一月的31日,非闰年的二月的28日。

如果它用在day-of-week中,则表示"7"或者"SAT"。但是如果在day-of-week

域中,这个字符跟在别的值后面,则表示"当月的最后的周XXX"。

例如:"6L" 或者 "FRIL"都表示本月的最后一个周五。当使用'L'选项时,最重要的是不要指定列表或者值范围,否则会导致混乱。

'W' 字符用来指定距离给定日最接近的周几(在day-of-week域中指定)。

例如:如果你为day-of-month域指定为"15W",则表示“距离月中15号最近的周几”。

'#'表示表示月中的第几个周几。例如:day-of-week域中的"6#3" 或者 "FRI#3"表示“月中第三个周五”。

例1 –一个简单的每隔5分钟触发一次的表达式

"0 0/5 * * * ?" CronTrigger

例2 –在每分钟的10秒后每隔5分钟触发一次的表达式(例如. 10:00:10 am, 10:05:10等.)。

"10 0/5 * * * ?" CronTrigger

例3 –在每个周三和周五的10:30,11:30,12:30触发的表达式。

"0 30 10-13 ? * WED,FRI" CronTrigger

例4 –在每个月的5号,20号的8点和10点之间每隔半个小时触发一次且不包括10点,只是8:30,9:00和9:30的表达式。

"0 0/30 8-9 5,20 * ?"

注意,对于单独触发器来说,有些日程需求可能过于复杂而不能用表达式表述,

例如:9:00到10:00之间每隔5分钟触发一次,下午1:00到10点每隔20分钟触发一次。这个解决方案就是创建两个触发器,两个触发器都运行相同的任务。

1.7 Quartz手册java版-(七)TriggerListeners和JobListeners

监听器是在scheduler事件发生时能够执行动作的对象。可以看出,TriggerListeners接收与triggers相关的事件,

而JobListeners则接收与Job相关的事件。

Trigger相关的事件包括:trigger触发、trigger未触发,以及trigger完成(由trigger触发的任务被完成)。

public interface TriggerListener {

public String getName();

public void triggerFired(Trigger trigger, JobExecutionContext context);

public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);

public void triggerMisfired(Trigger trigger);

public void triggerComplete(Trigger trigger, JobExecutionContext context,

int triggerInstructionCode);

}

任务相关的事件包括:即将被执行的任务的通知和任务已经执行完毕的通知。public interface JobListener {

public String getName();

public void jobToBeExecuted(JobExecutionContext context);

public void jobExecutionVetoed(JobExecutionContext context);

public void jobWasExecuted(JobExecutionContext context,

JobExecutionException jobException);

}

使用你自定义的监听器

创建监听器很简单,创建一个实现org.quartz.TriggerListener and/or

org.quartz.JobListener 的接口。

监听器然后在执行的时候注册到scheduler中,而且必须给定一个名字(或者,它们必须通过他们的Name属性来介绍自己)。

监听器可以被注册为“全局”的或者“非全局”。“全局”监听器接收所有triggers/jobs产生的事件,

而“非全局”监听器只接受那些通过getTriggerListenerNames() 或getJobListenerNames()方法显式指定监听器名的triggers/jobs所产生的事件。

正如上面所说的那样,监听器在运行时向scheduler注册,并且不被存储在jobs 和triggers的JobStore中。

Jobs和Trigger只存储了与他们相关的监听器的名字。因此,每次应用运行的时候,都需要向scheduler重新注册监听器。

scheduler.addGlobalJobListener(myJobListener);

or

scheduler.addJobListener(myJobListener);

Quartz的大多数用户不使用监听器,但是当应用需要创建事件通知而Job本身不能显式通知应用,则使用监听器非常方便。

1.8 Quartz手册java版-(八)SchedulerListeners

SchedulerListeners同TriggerListeners及JobListeners非常相似,SchedulerListeners只接收与特定trigger 或job无关的Scheduler自身事件通知。

Scheduler相关的事件包括:增加job或者trigger,移除Job或者trigger, scheduler内部发生的错误,scheduler将被关闭的通知,以及其他。

public interface SchedulerListener {

public void jobScheduled(Trigger trigger);

public void jobUnscheduled(String triggerName, String triggerGroup);

public void triggerFinalized(Trigger trigger);

public void triggersPaused(String triggerName, String triggerGroup);

public void triggersResumed(String triggerName, String triggerGroup);

public void jobsPaused(String jobName, String jobGroup);

public void jobsResumed(String jobName, String jobGroup);

public void schedulerError(String msg, SchedulerException cause);

public void schedulerShutdown();

}

除了不分“全局”或者“非全局”监听器外,SchedulerListeners创建及注册的方法同其他监听器类型十分相同。

所有实现Quartz.ISchedulerListener接口的对象都是SchedulerListeners。

1.9 Quartz手册java版-(九)JobStores

JobStore负责保持对所有scheduler “工作数据”追踪,这些工作数据包括:job(任务),trigger(触发器),calendar(日历)等。为你的Quartz scheduler 选择合适的JobStore是非常重要的一步,幸运的是,如果你理解了不同的JobStore之间的差别,那么选择就变得非常简单。在提供产生scheduler 实例的SchedulerFactory的属性文件中声明scheduler所使用的JobStore(以及它的配置)。

注:不要在代码中直接使用JobStore实例,处于某些原因,很多人试图这么做。JobStore是由Quartz自身在幕后使用。你必须告诉(通过配置)Quartz使用哪个JobStore,而你只是在你的代码中使用Scheduler接口完成工作。

RAMJobStore

RAMJobStore是最简单的JobStore,也是性能最好的(根据CPU时间)。从名字就可以直观地看出,RAMJobStore将所有的数据都保存在RAM中。

这就是为什么它闪电般的快速和如此容易地配置。缺点就是当应用结束时所有的日程信息都会丢失,

这意味着RAMJobStore不能满足Jobs和Triggers的持久性

(“non-volatility”)。对于有些应用来说,

这是可以接受的,甚至是期望的行为。但是对于其他应用来说,这将是灾难。配置

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

https://www.wendangku.net/doc/d815923017.html,缺省使用的就是RAMJobStore

JDBCJobStore

JDBCJobStore通过jdbc保存所有数据到数据库,它的配置要比RAMJobStore稍微复杂,同时速度也没有那么快。

但是性能的缺陷不是非常差,尤其是如果你在数据库表的主键上建立索引。

JDBCJobStore几乎可以在任何数据库上工作,它广泛地使用Oracle, MySQL, MS SQLServer2000, HSQLDB, PostreSQL 以及 DB2。

要使用JDBCJobStore,首先必须创建一套Quartz使用的数据库表,可以在Quartz 的docs/dbTables找到创建库表的SQL脚本。

如果没有找到你的数据库类型的脚本,那么找到一个已有的,修改成为你数据库所需要的。

需要注意的一件事情就是所有Quartz库表名都以QRTZ_作为前缀(例如:表"QRTZ_TRIGGERS",及"QRTZ_JOB_DETAIL")。

实际上,可以你可以将前缀设置为任何你想要的前缀,只要你告诉JDBCJobStore 那个前缀是什么即可(在你的Quartz属性文件中配置)。

对于一个数据库中使用多个scheduler实例,那么配置不同的前缀可以创建多套库表,十分有用。

一旦数据库表已经创建,在配置和启动JDBCJobStore之前,就需要作出一个更加重要的决策。你要决定在你的应用中需要什么类型的事务。

A20_Android开发手册_V1[1].0

C o n f i d e n t i a l A20Android 开发手册 V 1.0 2013-02013-03 3-15

C o n f i d e n t i a l Revision History Version Date Section/Page Changes 1.0 2013-03-15 初始版本

C o n f i d e n t i a l 目录 一、A20概述 (4) 1.1A20主控介绍.....................................................................................................................51.2外围设备介绍.....................................................................................................................51.3软件资源介绍.....................................................................................................................5二、建立开发环境. (5) 2.1硬件资源............................................................................................................................62.2软件资源. (6) 2.2.1安装JDK (ubuntu12.04).....................................................................................62.2.2安装平台支持软件(ubuntu12.04).....................................................................62.2.3安装编译工具链(ubuntu12.04).........................................................................62.2.4安装phoenixSuit (windows xp )........................................................................72.2.5其他软件(windows xp ).. (7) 三、源码下载 (8) 3.1wing 源码下载....................................................................................................................83.2仓库的目录树.. (8) 3.2.1android 目录树.........................................................................................................83.2.2lichee 目录结构.. (9) 3.2.2.1buildroot 目录结构........................................................................................93.2.2.2linux-3.3目录结构......................................................................................103.2.2.3u-boot 目录结构..........................................................................................113.2.2.4tools 目录结构............................................................................................123.2.2.5boot 目录结构 (12) 四、编译和打包 (13) 4.1源码编译 (13) 4.1.1lichee 源码编译......................................................................................................134.1.2android 源码编译...................................................................................................134.2打包固件.. (13) 4.2.1完全打包...............................................................................................................134.2.2局部打包 (14) 五、固件烧写 (14) 5.1使用PhoenixSuit 烧写固件.............................................................................................145.2使用fastboot 更新系统 (14) 5.2.1进入fastboot 模式.................................................................................................145.2.2fastboot 命令使用.. (15) 六、recovery 功能使用 (15) 6.1键值的查看......................................................................................................................156.2按键选择..........................................................................................................................166.3功能使用..........................................................................................................................16七、调试 (17) 7.1调试apk...........................................................................................................................177.2调试linux 内核. (17)

Shiro-用户手册

Shiro用户手册 Shiro架构介绍 一、什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功 能: * 认证-用户身份识别,常被称为用户登录” ?授权-访问控制; * 密码加密-保护或隐藏数据防止被偷窥; * 会话管理-每用户相关的时间敏感的状态。 对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架, Shiro要简单的多。 Shiro的架构介绍 Subject :即当前操作用户”但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Accou nt )或其他类似事物。它仅仅意味着当前跟软件

交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的用户”概念。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。 SecurityManager :它是Shiro 框架的核心,典型的Facade 模式,Shiro 通过SecurityManager 来管理内部组件实例,并通过它来提供安全管理的各种服务。 Realm : Realm充当了Shiro与应用安全数据间的桥梁”或者连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。 从这个意义上讲,Realm实质上是一个安全相关的DAO :它封装了数据源的连接细节,并 在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认 证和(或)授权。配置多个Realm是可以的,但是至少需要一个。 Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库 (JDBC )、 类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插 入代表自定义数据源的自己的Realm实现。 Shiro完整架构图:

java_swing手册

PACHAGE | 内 容 -----------------|------------ ------------------- javax.swing | 最常用的pachage,包含了各种swing组件的类 javax.swing.border | 包含与swing组件 外框有关的类 javax..swing.colorchooser | 针对swing调色盘组件(JColorChooser)所设计的类 javax.swing.event | 处理由swing组件 产生的事件,有别于AWT事件 javax.swing.filechooser | 包含针对swing文件选择对话框(JFileChooser)所设计的类 ----------------------------- ----------------- javax.swing.plaf | 处理swing组件外 观的相关类 javax.swing.plaf.basic | javax.swing.plaf.metal | javax.swing.plaf.multi | ----------------------------- ----------------- javax.swing.table | 针对swing表格组 件(JTable)所设计的类 ----------------------------- ----------------- javax.swing.text | 包含与swing文字 组件相关的类 javax.swing.text.html | javax.swing.text.html.parser | javax.swing.text.rtf | ----------------------------- ----------------- javax.swing.tree | 针对swing树关元 件(JTree)所设计的类 javax.swing.undo | 提供swing文字组 件Redo或Undo的功能

JavaPrintService_Java打印API_用户手册_中文版

目录 第一章介绍 Java平台打印的历史 JDK 1.3 JDK 1.2 JDK 1.1 Java Print Service API能做什么 Java Print Service 构架 javax.print包 发现打印服务 指定打印数据格式 创建打印工作 javax.print.event包 应用程序如何使用JPS 一个基本的例子 第二章属性 属性的类别和值 属性角色 属性集 如何指定属性 标准属性 OrientationRequested Copies Media MediaSize MediaPrintableArea Destination SheetCollate Sides Fidelity 使用JPS属性 第三章指定文档类型 用户格式打印数据 预定义数据格式的MIME类型 文本数据 页面描述语言文档 图像数据 自适应打印数据 表示类 字符编码的重要性 服务格式打印数据 怎样使用DocFlavor 第四章打印及流化文档

比较StreamPrintService与PrintService 定位服务 发现打印服务 发现流打印服务 获得一个打印工作 创建DOC 注册事件 打印服务事件 打印工作事件 PrintJobAttributeListener PrintJobListener 提交打印工作 向打印机提交打印工作 向流提交打印工作 打印服务提供商 第五章打印及流化2D图像 使用打印工作打印或流化图像 打印2D图像 流化2D图像 使用服务格式数据 打印服务格式数据 流化服务格式打印数据 示例:PrintPS.java 示例:PrintGIFtoStream.java 示例:Print2DPrinterJob.java 示例:Print2DGraphics.java 示例:Print2DtoStream.java 示例:PrintGIF.java Java Print Service 词汇表

使用JAVA蓝牙无线通讯技术API

使用Java蓝牙无线通讯技术API(第一部分-API概览) 蓝牙是一种低成本、短距离的无线通信技术。对于那些希望创建个人局域网(PANs)的人们来说,蓝牙技术已经越来越流行了。每个个人局域网都在独立设备的周围被动态地创建,并且为蜂窝式电话和PDA等设备提供了自动连接和即时共享数据的能力。 为了在Java平台上开发支持蓝牙技术的软件,JCP定义了JSR82标准--Java蓝牙无线技术APIs(JABWT)。 在这篇文章中,我将介绍一些关于蓝牙技术的背景,概述一下支持蓝牙技术的MIDlet 应用程序的典型要素,然后介绍给你核心的Java蓝牙APIs。最后我们展示一些代码来演示如何使用这些APIs。 实际上JSR82定义了两个独立的可选包:核心蓝牙API和对象交换(OBEX)API。这篇文章将对这两个中更为普遍的部分--核心蓝牙包javax.bluetooth进行详细地阐述,而OBEX API(对象交换),我们留到以后去讨论。 1、背景 篮牙技术由蓝牙兴趣小组发展,其包括: .无线电技术 .协议栈 .互操作性profiles 蓝牙无线电技术基于在工业、科学以及医学(ISM)上公用的2.45GHz开放频段,这一频段无需授权并全球通用。当蓝牙设备互相连接时,他们将组成一个微微网(piconet),即以一个主设备和最大7个从设备的形式动态创建网络。蓝牙也支持piconet网之间的连接:当一个piconet中的主设备成为另一个piconet的从设备时,piconet与piconet间将形成桥接。 蓝牙协议栈提供了一组的高层协议和API以完成发现服务和模拟串行I/O,还有一个关于包分割和重组的低层协议以及多路技术协议和质量服务。蓝牙互操作性profiles--不要与J2ME profiles搞混--它是用来描述跨平台互操作性和一致性需求的。蓝牙互操作性profiles 包括三方面内容:通用访问profile(GAP)定义了设备管理功能性;服务发现应用profiles 定义了服务发现方面的内容,串口profiles定义了互操作设备和模拟串口电缆的能力。你可以通过蓝牙规范(Bluetooth specification)学习这些和其它的profiles。 蓝牙栈包含一个软件栈来映射一个固件栈(firmware),由图1所示:

JavaShop安装手册

JavaShop安装手册 Version: 2.0 Public date: 2010-09-28 All right reserved https://www.wendangku.net/doc/d815923017.html,

1安装条件 ●操作系统不限 ●JDK:1.5或更高版本 ●Tomcat5.5或更高版本 ●Mysql5.0或更高版本 2安装准备 2.1获取javashop.war 包 请到https://www.wendangku.net/doc/d815923017.html,上获取最新安装包 2.2停用tomcat的reload 在安装过程中需要动态修改数据库配置文件,所以要禁止tomcat自动reload。打开\conf\server.xml文件,找到

2.4注意事项: ●Tomcat路径不能有空格。 ●数据库编码必须为utf-8。 3安装参数配置3.1.1许可协议 点击“下一步”

3.1.2配置数据库信息 输入相应参数后点击“测试连接”,如果连接成功会提示如上图。点击“下一步”

3.1.3配置域名及管理员信息 点击“开始安装”进行安装,安装过程可能需要几分钟时间,耐心等待之后的成功安装成功界面:

Java开发规范

Java 开发规范 第1章绪论 1.1 目的 本规范的目的是使本组织能以标准的、规范的方式设计和编码。通过建立编码规范,以使每个开发人员养成良好的编码风格和习惯;并以此形成开发小组编码约定,提高程序的可靠性、可读性、可修改性、可维护性和一致性等,增进团队间的交流,并保证软件产品的质量。 1.2 范围 本规范适用于“Skyinn Group”及其下所有软件项目、产品等的设计、开发以及维护、升级等。 本规范使用于“Skyinn Group”的所有软件开发人员,在整个软件开发过程中必须遵循此规范。 1.3 版权声明 本文档为共享文档,不限转载,但请保持本文档的完整性。 您可以修改本文档以符合您或组织、公司等之实际,但请在文档中保持对本文档的引用和说明。 未经本人授权,任何个人、组织或单位不得将本文档用于书面发表、转载、摘录等,亦不得用于其他商业行为。 本人及本组织不承担任何因使用、参考本文档等而导致的任何可能责任或连带责任。 1.4 参考资料 《Java 编程指南》见RUP(Rational Unified Process)中文版。 《Java 技术手册》(Java in a Nutshell) 《Sun Java 语言编码规范》(Java Code Conventions) 《Effictive Java》 《Java Pitfalls》 《Java Rules》 1.5 概述 对于代码,首要要求是它必须正确,能够按照设计预定功能去运行;第二是要求代码必须清晰易懂,使自己和其他的程序员能够很容易地理解代码所执行的功能等。然而,在实际开发中,每个程序员所写的代码却经常自成一套,很少统一,导致理解困难,影响团队的开发效率及系统的质量等。因此,一份完整并被严格执行的开发规范是非常必须的,特别是对软件公司的开发团队而言。此规范参考自业界标准编程规范并结合本人多年编程经验、习惯等而制定,在本人工作过的公司中都曾参考本文档而形成内部开发规范并执行。现在将本文档共享之,希望能对各位有所帮助,并做引玉之砖,希望各位朋友将自己的经验等增补进去,对我们所热爱的软件业有所裨益。 最根本的原则: 代码虽然是给机器运行的,但却是给人读的! 运用常识。当找不到任何规则或指导方针,当规则明显不能适用,当所有的方法都失效的时

【Java编码规范】《阿里巴巴Java开发手册(正式版)》更新(v1.1.1版)

【Java编码规范】《阿里巴巴Java开发手册(正式版)》更新(v1.1.1版) 本文章来自于阿里云云栖社区 摘要:阿里巴巴集团推出的《阿里巴巴Java开发手册(正式版)》是阿里巴巴近万名开发同学集体智慧的结晶,以开发视角为中心,详细列举如何开发更加高效、更加容错、更加有协作性,力求知其然,更知其不然,结合正反例,让Jav a开发者能够提升协作效率、提高代码质量。 2017年开春之际,诚意献上重磅大礼:阿里巴巴Java开发手册,首次公开阿里官方Java代码规范标准。这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本。 点击下载《阿里巴巴Java开发手册》(v1.1.1版): https://https://www.wendangku.net/doc/d815923017.html,/attachment/download/?id=1492 v1.1.1版更新说明:修正页码总数和部分示例。 (版本不断更新中,请收藏本文,以免错过重要更新)

(点击参与话题讨论:Java开发者们,一起来聊聊大家的开发规约吧) (原文链接: https://https://www.wendangku.net/doc/d815923017.html,/roundtable/47961?spm=5176.100239.blogcont69327.8.f VLfld) 你是否曾因Java代码规范版本纷杂而无所适从? 你是否想过代码规范能将系统故障率降低20%? 你是否曾因团队代码风格迥异而协同困难? 你是否正在review一些原本可以避免的故障? 你是否无法确定自己的代码足够健壮? 码出高效,码出质量!

相比C++代码规范业界已经达成共识,Java代码规范业界比较混乱,我们期待这次发布的Java代码规范能够给业界带来一个标准,促使整体行业代码规范水平得到提高,最终能够帮助企业和开发者提升代码质量和降低代码故障率。 阿里出品,质量保证! 阿里Java技术团队一手打造出Dubbo、JStorm、Fastjson等诸多流行开源框架,部分已成为Apache基金会孵化项目; 阿里在Java后端领域支撑起全球访问量最大的服务器集群; Java代码构建的阿里双11业务系统订单处理能力达到17.5万笔/秒; 到目前已累计数亿行高并发、高稳定性的最佳Java代码实践; …… 此次首度公开的Java开发手册正是出自这样的团队,近万名阿里Java技术精英的经验总结,并经历了多次大规模一线实战检验及完善,铸就了这本高含金量的阿里Java开发手册。该手册以Java开发者为中心视角,划分为编程规约、异常日志规约、MYSQL规约、工程规约、安全规约五大块,再根据内容特征,细分成若干二级子目录。根据约束力强弱和故障敏感性,规约依次分为强制、推荐、参考三大类。此套规范不仅能让代码一目了然,更有助于加强团队分工与合作、真正提升效率。

JXL文档说明 JAVA EXCEL API 说明手册

Java excel API说明手册 作者:Rubber 整理:calf 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel 文件并不是一件容易的事。在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来越强烈,目前较为流行的操作是在JSP或Servlet中创建一个CSV(comma separated values)文件,并将这个文件以MIME,text/csv类型返回给浏览器,接着浏览器调用Excel并且显示CSV文件。这样只是说可以访问到Excel文件,但是还不能真正的操纵Excel文件,本文将给大家一个惊喜,向大家介绍一个开放源码项目,Java Excel API,使用它大家就可以方便地操纵Excel文件了。 JAVA EXCEL API简介 Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel 文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel 数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel 数据表的访问。 现在发布的稳定版本是V2.0,提供以下功能: ?从Excel95、97、2000等格式的文件中读取数据; ?读取Excel公式(可以读取Excel97以后的公式); ?生成Excel数据表(格式为Excel97); ?支持字体、数字、日期的格式化; ?支持单元格的阴影操作,以及颜色操作; ?修改已经存在的数据表; 现在还不支持以下功能,但不久就会提供了: 1.不能够读取图表信息; 2.可以读,但是不能生成公式,任何类型公式最后的计算值都可以读出; 应用示例 1从Excel文件读取数据表 Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术语:工作薄),下面的代码片段举例说明了应该如何操作:(完整代码见ExcelReading.java)

JAVA项目开发实例全教程

光盘内容框架 本书附带光盘内容包括本书源程序、全程视频教学程序、《编程词典》体验版,完整光盘内容框架如图1.1所示。 图1.1 光盘内容框架图 如何使用本书源程序 1、开发及运行环境 本书源程序都是在Windows Server 2003下开发的,程序测试环境为Windows Server 2003。用户只有在Windows Server 2003下正确配置程序所需的运行环境后,才可以使用本书中的源程序。软件开发平台如下: 操作系统:Windows Server 2003; 数据库:SQL Server 2000、SQL Server 2005、MySQL5.0、Oracle10g、JavaDB; 开发环境:Eclipse、MyEclipse、EclipseMe、JDK6、J2ME2.5.2、框架(Spring、Struts、Hibernate)、Tomcat5.5; 分辨率:最佳效果1024×768;

2、源程序用户名和密码 本书程序用户名和密码统一为: 用户名:tsoft 密码:111 3、源程序使用方法 (1)使用本书中源程序时,请将源程序文件夹下的所有文件拷贝到计算机硬盘上,并去掉所有文件的只读属性。 (2)安装Eclipse。 (3)安装数据库系统。其中第01章、第05章、第07章、第08章使用的是SQL Server 2000数据库,第03章使用的是Oracle数据库,第04章使用的是SQL Server 2005数据库,第09章使用的是MySQL数据库,第02章和第06章在运行程序时自动创建数据库,而第10章没有用到数据库。 (4)数据库文件存储于源程序下Database文件夹中。使用SQL Server 2000和SQL Server 2005需要附加数据库,附加方法可参见源程序所在目录下的readme.doc文档。 注意:为了方便读者学习和使用本书中的源程序,特在所有源程序路径下放置了“readme.doc”文档,该文档中提供了数据库的附加方法、配置以及程序详细使用说明。 本光盘根目录下的“源程序使用录像”,以录像的形式帮助读者安装相应的软件和配置对应的数据库。 如何使用《全程视频教学程序》 全程视频教学程序.exe 为本光盘中所有项目全程视频教学程序,通过它可以实现如下功能。 快速调用本书提供的全程视频教学录像 快速调用本书赠送的《编程词典》体验版 浏览整个光盘 查看帮助信息 下面介绍“全程视频教学程序”的使用方法。 (1)将光盘放入光驱,程序会自动运行,如果不能自动运行,请右键单击光盘图标,在弹出的菜单中选择“自动播放”。 (2)打开全程视频教学程序的主界面,如图1.2所示,单击相应按钮,即可执行相应的功能,例如单击“多媒体教学录像”,则打开各章项目录像列表,如图1.3所示。

Coremail XT V2.0 标准API使用手册(Java版)

Coremail XT V2.0 标准API(Java)使用手册 盈世信息科技(北京)有限公司 Coremail. Copyright 2000-2009 Mailtech.

盈世信息科技(北京)有限公司 版权声明 本文档版权归盈世信息科技(北京)有限公司所有,并保留一切权利。未经书面许可,任何公司和个人不得将此文档中的任何部分公开、转载或以其他方式散发给第三方。否则,必将追究其法律责任。 免责声明 本文档仅提供阶段性信息,所含内容可根据产品的实际情况随时更新,恕不另行通知。如因文档使用不当造成的直接或间接损失,本公司不承担任何责任。 文档更新 本文档由盈世信息科技(北京)有限公司于2009年9月最后修订。 公司网站 https://www.wendangku.net/doc/d815923017.html, 销售咨询热线800-830-7652 技术支持热线800-830-5422 联系方式 广州地址:广州市中山大道科韵路16号广州信息港网易大厦3楼 邮编:510665 联系电话:+86(20)85106566 传真:+86(20)85106595 北京地址:北京市西城区西外大街1号院西环广场T3座7层B7-B8 邮编:100044 联系电话:+86(10)58301930 传真:+86(10)58302888 上海地址:上海市静安区长乐路672弄33号B幢3楼 邮编:200040 联系电话:+86(21)61103951 传真:+86(21)61107756 成都地址:成都市高新区永丰路47号玉林商务港5楼518室 邮编:610041 联系电话:+86(28)66252331 传真:+86(28)66252332

WebPlus使用手册(网站管理员)

WebPlus使用手册(网站管理员) 2009年12月

目录 1 简介 (333) 1.1 什么是WebPlus (333) 1.2 WebPlus的特点 (333) 1.3 名词解释 (444) 2 网站日常管理 (444) 2.1 栏目管理 (444) 2.2 信息管理 (888) 2.3 人员管理 (888) 2.4 权限设置 (111111) 2.5 频道定义 (121212) 2.6 模板管理 (151515) 2.7 模板绑定 (181818) 3 其他管理功能 (343434) 3.1 建站管理 (343434) 3.2 日志信息浏览 (373737) 3.3 日志管理 (383838) 3.4 样式管理 (383838) 3.5 风格设定 (393939) 3.6 文章搜索 (393939) 3.7 数据统计......... 错误!未定义书签。错误!未定义书签。错误!未定义书签。 4 组件功能模块........... 错误!未定义书签。错误!未定义书签。错误!未定义书签。 4.1 调查管理......... 错误!未定义书签。错误!未定义书签。错误!未定义书签。 4.2 待办项目......... 错误!未定义书签。错误!未定义书签。错误!未定义书签。 4.3 在线问答......... 错误!未定义书签。错误!未定义书签。错误!未定义书签。 4.4 留言管理......... 错误!未定义书签。错误!未定义书签。错误!未定义书签。 4.5 信箱管理......... 错误!未定义书签。错误!未定义书签。错误!未定义书签。 5 运行环境............... 错误!未定义书签。错误!未定义书签。错误!未定义书签。 5.1 硬件环境......... 错误!未定义书签。错误!未定义书签。错误!未定义书签。 5.2 软件环境......... 错误!未定义书签。错误!未定义书签。错误!未定义书签。 5.3 其他............. 错误!未定义书签。错误!未定义书签。错误!未定义书签。 6 安装................... 错误!未定义书签。错误!未定义书签。错误!未定义书签。

dom4j入门手册

Dom4j入门手册 一.什么是dom4j? d om4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包, Hibernate用它来读写配置文件。 DOM4J是https://www.wendangku.net/doc/d815923017.html,出品的一个开源XML解析包,它的网站中这样定义:Dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java 平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。 DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。然而他自己带的指南只有短短一页(html),不过说的到挺全。国内的中文资料很少。 二.Dom4j使用介绍 1.下载与安装 dom4j是https://www.wendangku.net/doc/d815923017.html,上的一个开源项目,主要用于对XML的解析。从2001年7月发布第一版以来,已陆续推出多个版本,目前最高版本为1.5。 dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j 正迅速普及。可以到https://www.wendangku.net/doc/d815923017.html,/projects/dom4j下载其最新版。 dom4j1.5的完整版大约13M,是一个名为dom4j-1.5.zip的压缩包,解压后有一个dom4j-1.5.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-4.jar文件,一般也需要引入,否则执行时可能抛

java环境部署手册 -

Java环境安装手册 java环境安装手册 (1) 安装配置JDK (1) 安装S QL S ERVER2014 (5) 安装T OMCAT7 (14) 安装配置jdk 双击运行安装包,会让你安装两次,第一次为JDK的安装,第二次为JRE的安装,如果没有必须的安装目录要求,请不要修改目录,直接一直下一步下一步,那么对应的目录地址应该为:C:\Program Files\Java下

右键计算机-->属性-->高级系统设置-->环境变量 在系统变量中新建变量名:JAVA_HOME变量值:C:\Program Files\Java\jdk1.7.0_60 (ps:如你没有改变默认路径复制就可以,如果修改过请选择jdk的安装目录)JAVA_HOME是用来表示jdk的安装目录。配置java_home的原因是:(1)方便引用。(2)其他软件会引用约定好的JAVA_HOME变量。比如tomcat就需要引用JAVA_HOME。

在系统变量中查找Path 编辑变量名:Path变量值:C:\ProgramFiles\Java\jdk1.7.0_60\bin;C:\Program Files\Java\jre7\bin; (ps:原来Path的变量末尾如果没有;号,先输入;号再输入上面的代码) Path配置好后能够让我们在系统中的任何地方运行java应用程序。比如:javac、java命令。 在系统变量中新建变量名:CLASSPATH变量值:.;%JAVA_HOME%lib;%JAVA_HOME%lib\tools.jar; (ps:前面有个 .; 这个是告诉JDK,搜索CLASS时先查找当前目录的CLASS文件) 配置java_home的原因是:我们写java程序时需要引用已经开发好的类,所以应该让java 解释器知道引用的类的位置啊。否则会提示:所引用的类找不到的。

API(Java版)程序员手册范本

JIT应用Toolkits API(Java版)程序员手册 JIT所有(2001)

Jilin University Information Technologies Co., Ltd. 目录 1引言 (4) 1.1概述 (4) 1.2开发平台及编程语言 (4) 1.3注意事项 (4) 1.4名词解释 (4) 2系统结构 (4) 2.1接口说明 (4) 2.2配置文件说明 (4) 3数据结构 (5) 3.1基于口令产生密钥的基本信息 (5) 3.2初始化CRL参数 (5) 3.3时间基本信息 (6) 3.4证书有效期类 (7) 3.5初始化证书信息 (7) 4全局常量定义 (8) 4.1标识常量 (8) 4.1.1所用到的配置文件 (8) 4.1.2文件长度及密码长度 (8) 4.1.3数据类型定义; (8) 4.1.4信封类型定义 (9) 4.1.5证书扩展类型定义 (9) 4.1.6证书用户类型定义 (9) 4.1.7证书状态定义 (9) 4.1.8CRL验证证书方式 (10) 4.1.9证书SN类型 (10) 4.1.10证书存储方式 (10) 4.1.11加密、解密、签名等算法 (10) 4.1.12标准扩展域 (11) 4.2错误代码 (11) 5函数说明 (13) 5.1类JIT_E NGINE (13) 5.1.1构造函数 (13) 5.1.2获取错误信息 (14) 5.1.3释放引擎资源 (14) 5.2类JIT_OCSP (15) 5.2.1构造方法 (15) 5.2.2查询证书状态 (16) 5.2.3获取错误信息 (16)

5.2.4释放OCSP资源 (17) 5.3类JIT_CRL (17) 5.3.1构造方法 (17) 5.3.2获取CRL验证证书的方式getMode (18) 5.3.3CRL验证证书 (18) 5.3.4验证CRL签名 (19) 5.3.5获取错误信息 (19) 5.3.6释放CRL资源 (19) 5.4类JIT_C ERTIFICATE (20) 5.4.1构造方法 (20) 5.4.2获取证书中eMail (22) 5.4.3获取证书颁发者 (22) 5.4.4获取证书序列号 (22) 5.4.5获取证书主题 (23) 5.4.6获取证书版本号 (23) 5.4.7获取证书有效期 (23) 5.4.8获取证书的应用类型 (24) 5.4.9获取证书编码(二进制) (24) 5.4.10获取证书的个人身份标识码 (25) 5.4.11提取所需对象标识符对应的容 (25) 5.4.12验证证书的有效性 (26) 5.4.13验证证书的有效性(手工输入时间) (27) 5.4.14获取错误信息 (28) 5.4.15释放Certificate资源 (28) 5.4.16扩展接口 (28) 5.5类JIT_K EY (29) 5.5.1构造方法 (29) 5.5.2产生对称密钥 (30) 5.5.3基于口令产生对称密钥 (30) 5.5.4包装密钥 (31) 5.5.5解包装密钥 (32) 5.5.6获取错误信息 (32) 5.5.7释放Key资源 (32) 5.6类JIT_B IN (33) 5.6.1构造方法 (33) 5.6.2数据数字签名 (33) 5.6.3验证数字签名 (34) 5.6.4数据非对称加密 (35) 5.6.5数据非对称解密 (36) 5.6.6产生数据的MAC (36) 5.6.7验证数据的MAC (37) 5.6.8数据文摘 (38) 5.6.9数据对称加密 (39) 5.6.10数据对称解密 (39) 5.6.11产生PKCS7数字信封 (40)

Coremail 4.0 高级API使用手册(Java版)

Coremail 4.0 高级API(Java)使用手册

版权声明 本文档版权归盈世信息科技(北京)有限公司所有,并保留一切权利。未经书面许可,任何公司和个人不得将此文档中的任何部分公开、转载或以其他方式散发给第三方。否则,必将追究其法律责任。 免责声明 本文档仅提供阶段性信息,所含内容可根据产品的实际情况随时更新,恕不另行通知。如因文档使用不当造成的直接或间接损失,本公司不承担任何责任。 文档更新 本文档由盈世信息科技(北京)有限公司于2013年5月最后修订。 公司网站 https://www.wendangku.net/doc/d815923017.html, 销售咨询热线400-000-1631 技术支持热线400-888-5422 A、文档修改记录 B、文档审核记录

目录 1Coremail 4.0 API通用函数说明 (1) 1.1getClient(连接APIServer使用的socket) (1) 1.2getRetCode(获取操作的返回值) (2) 1.3getResult(操作的返回结果) (2) 1.4getResultEx(返回操作的返回结果) (3) 1.5getErrorInfo(描述操作失败原因) (3) 1.6toString(返回操作结果的字符串表示) (3) 2API函数的使用步骤 (3) 3Coremail 4.0 API具体功能应用 (5) 3.1登录 (5) 3.1.1用户登录 (5) 3.1.2检查用户是否存在 (7) 3.1.3验证用户密码 (8) 3.1.4检查用户的session,返回用户信息 (8) 3.1.5检查用户的session,并刷新访问时间 (9) 3.1.6获取用户session中的变量 (10) 3.1.7用户退出 (10) 3.2组织维护 (11) 3.2.1创建组织 (11) 3.2.2获取组织属性 (13)

前端开发手册文档

手机前端入门实例快速开发指南

1文档管理 1.1 文档信息 文档名称手机前端入门实例开发指南 保密级别文档版本编号 制作人制作日期 复审人复审日期 1.2 修改记录 时间版本说明修改人

2内容摘要 新手入门参考文档,辅助入门。 3目的 熟悉并掌握 ●前端的开发流程 ●前端的开发规范 ●通过做简单的示例完成页面流程的开发 4前提条件 前端开发都是基于jquery进行开发,引入js时要先引入jquery.js文件. 4.1 软件环境 1、开发环境:eclipse 5开发规范 一、目录结构 1、H5页面文件目录位于www/views目录下,针对不同功能模块,建立不同的子目录。JS文件位于www/js/controllers目录下,与页面相同,不同的模块建立不同的子目录。如以下例子: www/views/demo/demo.html www/js/controllers/demo/demo.js 二、文件名要求 文件名以小写开头,取有意义的英文名字,H5文件名与对应的JS文件名相同。 三、文件格式 UTF-8格式

四、页面中id命名要求 除入口页外,一个页面就是一个Page,每个Page有唯一ID,该ID命名以文件名开头,以View结尾,如demoView 页面中包含的链接,button,其ID以Btn结尾,如loginViewBtn 五、H5内容要求 页面类型模块功能入口页以及子页面 功能模块的入口页,需要包含基本类库,以及入口页对应的JS脚本,其他子页面只有一个Page内容 页面只有html内容,无任何Javascript脚本。 对没有任何业务逻辑控制的页面,可以href的方式直接跳转 对于有业务逻辑控制的页面,应绑定链接事件方式,在事件中需要显示loading 层,转到目标页面后,再隐藏loading层。(未实现原生loading显示) 页头页尾固定在head添加如下属性 data-position="fixed" data-tap-toggle="false" 六、JS内容要求 以匿名函数创建并执行的方式新建JS脚本 (function(){ //业务逻辑在此添加 })(); 业务逻辑需要实现以下: 在pageinit方法中初始化页面元素的绑定事件,页面数据的预加载,如:验证码,账号列表 $("#loginView").live("pageinit", function(){ $("#logonBtn").on("click", login); } ------------------------------------------------------------------- 对于动态生成的数据: select下拉框,如果需要从服务器获取数据,则通过 $.mbank.pajax("queryMyEquation.do",formData1,forBalance);方法获取,并在定义forBalance方法处理返回结果, processResponse: function(data) { var aList = data.aList; $.each(aList, function() { $('').appendTo('#aSelect');

相关文档
相关文档 最新文档