Struts2教學
Struts2快速入門
Struts2 MVC架構
Struts2 是什麼?
Struts2 環境配置
Struts2 體系結構
Struts2 Hello World 實例
Struts2 配置文件
Struts2 Action/動作
Struts2 攔截器
Struts2 結果和結果類型
Struts2 值棧/OGNL
Struts2 文件上傳
Struts2 MySQL數據庫訪問
Struts2 發送郵件Email
Struts2 驗證框架
Struts2 基於XML校驗
Struts2 本地化/國際化(i18n)
Struts2 類型轉換
Struts2 主題和模板
Struts2 異常處理
Struts2 註釋
Struts2 註釋類型
Struts2 控件標籤
Struts2 iterator標籤
Struts2 if/else標籤
Struts2 merge標籤
Struts2 append標籤
Struts2 generator標籤
Struts2 數據標籤
Struts2 action標籤
Struts2 include標籤
Struts2 bean 標籤
Struts2 date 標籤
Struts2 param 標籤
Struts2 property 標籤
Struts2 set 標籤
Struts2 text 標籤
Struts2 url標籤
Struts2 表單標籤
Struts2 Ajax 標籤
Struts2和Spring集成
Struts2和Tiles集成
Struts2和Hibernate集成
Struts 2 hello world (XML版本)
Struts2註解示例
Struts2 @ResultPath註釋示例
Struts2 include(包含)多個配置文件
Struts2命名空間配置和解釋
Struts2開發者模式
如何刪除Struts2動作的後綴擴展名
使用Struts2動作
Struts2的ActionError&ActionMessage示例
Struts2模型驅動實例
Struts2映射攔截動作
Struts2重寫攔截器參數
Struts2攔截器棧的例子
Struts2 execAndWait攔截器例子
Struts2 <s:textfield>文本示例
Struts2 <s:password>密碼示例
Struts2 <s:hidden>隱藏值例子
Struts2 <s:textarea>文本域實例
Struts2 <s:radio>單選按鈕例子
Struts2單選預選按鈕值
Struts2 <s:checkbox>複選框例子
Struts2設置多個複選框缺省值
Struts2 <s:checkboxlist>多個複選框例子
Struts2 <s:select>下拉框例子
Struts2自動選擇下拉框的值
Struts2 <s:combobox>組合框的例子
Struts2 <s:head>示例
Struts2文件上傳例子
Struts2上傳多個文件例子
Struts2 <s:doubleselect>示例
Struts2 <s:updownselect>示例
Struts2 <s:optiontransferselect>示例
Struts2 <sx:datetimepicker>示例
Struts2 <sx:autocompleter>自動提示例子
Struts2 autocompleter+JSON例子
Struts2 <s:iterator>迭代器標籤示例
Struts2 if,elseif,else標籤示例
struts2 <s:append>標籤示例
Struts2 <s:generator>標籤示例
Struts2 <s:merge>標籤示例
Struts2 <s:sort>標籤示例
Struts2 <s:subset>標籤示例
Struts2 <s:a>標籤示例
Struts2 <s:action>標籤示例
Struts2 <s:bean>標籤示例
Struts2 <s:date>標籤示例
Struts2 <s:debug>標籤示例
Struts2 <s:include>標籤示例
Struts2 <s:i18n>標籤示例
Struts2 <s:param>標籤示例
Struts2 <s:property>標籤實例
Struts2 <s:push>標籤示例
Struts2 <s:set>標籤示例
Struts2 <s:texttag>標籤示例
Struts2 <s:url>標籤示例
Struts2資源包使用示例
Struts2本地化和國際化
Struts2 key鍵屬性示例
Struts2中文本地化問題
如何配置Struts2全局資源包
Struts2+Spring集成實例
Struts2+Quartz2調度集成實例
Struts2+Hibernate使用Full Hibernate Plugin集成
Struts2+Hibernate集成實例
Struts2+Spring+Hibernate集成實例
Struts2+Log4j集成
Struts2的FilterDispatcher和StrutsPrepareAndExecuteFilter有什麼不同?
Struts2獲取HttpServletRequest實例
Struts2獲取HttpServletResponse實例
如何獲取ServletContext對象
Struts2配置Action類的靜態參數
Struts2下載文件實例
Struts2和JSON實例

Struts2+Quartz2調度集成實例

Struts2並沒有附帶任何現成「Struts2-Quartz.jar」之類的插件,黑客可能會使用標準的 Servlet 監聽將兩個框架鏈接在一起。請參閱它們的關係

Struts 2 <-- (Listener)--> Quartz <---> Scheduler task

在本教程中,我們將學習如何將Struts2和Quartz調度框架集成在一起。

使用的工具:

  1. Struts 2.1.4
  2. Quartz 2.1.5
  3. Tomcat 6/7
  4. MyEclipse 10

1. 調度作業

創建Quartz調度作業任務,並打印出一行。

File : SchedulerJob.java

package com.yiibai.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SchedulerJob implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException { System.out.println("Struts 2.1.4 + Quartz 2.2.2 - by www.yiibai.com");

             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");













             System.out.println( " 已被安排執行於: " + sdf.format(new Date()));

}
}

3. Servlet 監聽器

創建標準的servlet監聽器類用來做整合工作。它調用Quartz調度框架中的contextInitialized()方法。在Servlet容器初始化,contextInitialized()方法將自動執行。

File : QuartzSchedulerListener.java

package com.yiibai.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import com.yiibai.quartz.SchedulerJob;

public class QuartzSchedulerListener implements ServletContextListener {

public void contextDestroyed(ServletContextEvent arg0) {
    //
}

public void contextInitialized(ServletContextEvent arg0) {

    JobDetail job = JobBuilder.newJob(SchedulerJob.class)
        .withIdentity("anyJobName", "group1").build();

    try {

        Trigger trigger = TriggerBuilder
          .newTrigger()
          .withIdentity("anyTriggerName", "group1")
          .withSchedule(
             CronScheduleBuilder.cronSchedule("0/10 \* \* \* \* ?"))
          .build();

        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);

    } catch (SchedulerException e) {
        e.printStackTrace();
    }

}

}

4. web.xml

把監聽器類 QuartzSchedulerListener.java 添加到 web.xml 文件。

File : web.xml

Struts 2 Web Application
<filter>
  <filter-name>struts2</filter-name>
  <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
      </filter-class>
</filter>

<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/\*</url-pattern>
</filter-mapping>

<listener>
  <listener-class>
        com.yiibai.listener.QuartzSchedulerListener
      </listener-class>
</listener>

CronTrigger配置格式:
格式: [秒] [分] [小時] [日] [月] [周] [年]

序號

說明

是否必填

允許填寫的值

允許的通配符

1

0-59

, - * /

2

0-59

, - * /

3

小時

0-23

, - * /

4

1-31

, - * ? / L W

5

1-12 or JAN-DEC

, - * /

6

1-7 or SUN-SAT

, - * ? / L #

7

empty 或 1970-2099

, - * /

通配符說明: ***** 表示所有值. 例如:在分的字段上設置 "*",表示每一分鐘都會觸發。 ? 表示不指定值。使用的場景爲不需要關心當前設置這個字段的值。例如:要在每月的10號觸發一個操作,但不關心是周幾,所以需要周位置的那個字段設置爲"?" 具體設置爲 0 0 0 10 * ? - 表示區間。例如 在小時上設置 "10-12",表示 10,11,12點都會觸發。 , 表示指定多個值,例如在周字段上設置 "MON,WED,FRI" 表示週一,週三和週五觸發 **/** 用於遞增觸發。如在秒上面設置"5/15" 表示從5秒開始,每增15秒觸發(5,20,35,50)。 在月字段上設置'1/3'所示每月1號開始,每隔三天觸發一次。 L 表示最後的意思。在日字段設置上,表示當月的最後一天(依據當前月份,如果是二月還會依據是否是潤年[leap]), 在周字段上表示星期六,相當於"7"或"SAT"。如果在"L"前加上數字,則表示該數據的最後一個。例如在周字段上設置"6L"這樣的格式,則表示「本月最後一個星期五" W 表示離指定日期的最近那個工作日(週一至週五). 例如在日字段上設置"15W",表示離每月15號最近的那個工作日觸發。如果15號正好是週六,則找最近的週五(14號)觸發, 如果15號是周未,則找最近的下週一(16號)觸發.如果15號正好在工作日(週一至週五),則就在該天觸發。如果指定格式爲 "1W",它則表示每月1號往後最近的工作日觸發。如果1號正是週六,則將在3號下週一觸發。(注,"W"前只能設置具體的數字,不允許區間"-").

小提示

'L'和 'W'可以一組合使用。如果在日字段上設置"LW",則表示在本月的最後一個工作日觸發(一般指發工資 )

# 序號(表示每月的第幾個周幾),例如在周字段上設置"6#3"表示在每月的第三個週六.注意如果指定"#5",正好第五週沒有周六,則不會觸發該配置(用在母親節和父親節再合適不過了)

小提示

周字段的設置,若使用英文字母是不區分大小寫的 MON 與mon相同.

常用示例:

0 0 12 * * ?

每天12點觸發

0 15 10 ? * *

每天10點15分觸發

0 15 10 * * ?

每天10點15分觸發

0 15 10 * * ? *

每天10點15分觸發

0 15 10 * * ? 2005

2005年每天10點15分觸發

0 * 14 * * ?

每天下午的 2點到2點59分每分觸發

0 0/5 14 * * ?

每天下午的 2點到2點59分(整點開始,每隔5分觸發)

0 0/5 14,18 * * ?

每天下午的 2點到2點59分(整點開始,每隔5分觸發) 每天下午的 18點到18點59分(整點開始,每隔5分觸發)

0 0-5 14 * * ?

每天下午的 2點到2點05分每分觸發

0 10,44 14 ? 3 WED

3月分每週三下午的 2點10分和2點44分觸發

0 15 10 ? * MON-FRI

從週一到週五每天上午的10點15分觸發

0 15 10 15 * ?

每月15號上午10點15分觸發

0 15 10 L * ?

每月最後一天的10點15分觸發

0 15 10 ? * 6L

每月最後一週的星期五的10點15分觸發

0 15 10 ? * 6L 2002-2005

從2002年到2005年每月最後一週的星期五的10點15分觸發

0 15 10 ? * 6#3

每月的第三週的星期五開始觸發

0 0 12 1/5 * ?

每月的第一個中午開始每隔5天觸發一次

0 11 11 11 11 ?

每年的11月11號 11點11分觸發(光棍節)


5. 示例

在Struts2項目啓動之後,已註冊的偵聽器類QuartzSchedulerListener.java 將被激發, 並調用 Quartz 作業,每10秒執行SchedulerTask.printSchedulerMessage()方法。

下載源代碼

下載網址 –  http://pan.baidu.com/s/1c0E2QM8