五. 使用 ServletContextListener
很值得一提的是你可以配置和集成 Quartz 到 Web 应用的另一种方式。从 2.3 版本的 Servlet API 开始,你能创建监听器,由容器在其生命周期中的某个特定时间回调。其中的一个监听器接口叫做 java.servlet.ServletContextListener,它包括有两个方法:
public void contextInitialized(ServletContextEvent sce);
public void contextDestroyed(ServeltContextEvent sce);
容器会在启动和关闭的时候相应的调用这两个方法。这就可以在 contextInitialized() 方法中初始化 Quartz Scheduler,并通过 contextDestroyed() 方法关闭它。代码 13.5 描述了这种用法: Read More
四. QuartzInitializerServlet 可谓救命草
Quartz 框架包括一个叫做 org.quartz.ee.servlet.QuartzInitializerServlet 的 Java 类,它继承自标准的 HttpServlet。你可应用这个 servlet 于你的 Web 应用中,它将会创建一个 StdSchedulerFactory 实例并在你的程序后续中一直可用。通常的,它就是做了命令行版本的 Quartz 程序的 main() 方法所做的事性。
QuartzInitializerServlet 在 Quartz 1.5 中有所改变在 Quartz 的 1.5 发布版中,QuartzInitializerServlet 被修改为会存储 StdSchedulerFactory 实例到 Web 应用的 ServletContext 中。这就允许你的程序在任何地方都能访问到 Scheduler 实例,只要获取到了 HttpServletRequest 或 HttpSession 对象,调用工厂的 getScheduler() 就访问到了 Scheduler 实例。
还新增了一个 start-scheduler-on-load 的 Servlet 初始化参数。这一参数指定 Scheduler 是否随 QuartzInitializerServlet 启动或是别处启动。假如未设置时默认为 True,Sheduler 将随 QuartzInitializerServlet 起来。否则,你的应用将不得不自己去获得 Scheduler 实例然后调用 start() 方法。
当容器加载 QuartzInitializerServlet,该 Servlet 的 init() 方法将被调用。这个 Servlet 读取几个初始化参数,创建 StdSchedulerFactory 类的实例,并使用指定(或默认) 的 Quartz 属性文件来初始化 Scheduler。 Read More
你尽可以做个良民,为群体效率而本份的遵循个人秩序,然而事与愿违,非但不能因此提升群体的效率,而你势必失去诸多的机会,不会有人褒奖你,更得不到同情,只得自觉的天真。
1. 模板目录->主题目录->主题(模板文件) 这是模板/主题的目录组织方式。以实际为例,打开 struts2-core-2.x.x.jar 可以看到里面有一个 template,在 template 下有5个目录 ajax、css_xhtml、simple、xhtml 和 archive,其中前四个分别是 ajax、css_xhtml、simple、xhtml 主题的目录,每个主题目录中有各自的模板文件,主要是 ftl 文件,还有 css 和 js 文件。最后一个 archive 是归档的主题目录,其下又有 ajax、simple、xhtml、模板文件是 .vm 文件。由此可知 Struts2 大力推荐的模板语言是 FreeMarker,而不是 Velocity,以后要好好看看 FreeMarker,只知道 FreeMarkder 更 XML 化。 Read More
三. 在 Struts 框架中使用 Quartz
第一步就是要下载 Apache Struts 并创建好你的 Web 应用的目录结构。Struts 框架可从 Apache Struts 站点 http://struts.apache.org 上找到。也很欢迎你直接抓取到源代码来编译它,尽管你能够及时下载到最新版本的二进制版。
因为 Quartz 不直接依赖于 Struts 框架,所以你也就不必为该使用哪一版本的 Struts 而忧心。只管下载到当前的最新版本就是了。不过,你应该认识到,Struts 和 Quartz 框架共同依赖了一些第三方的包。实际上,在前面列出的 Quartz 所需要的库也是 Struts 框架所必须的。就是要留心混在一起不同的版本,如在最后一节的警告所注明的。 Read More
有一日,帮外公翻腾出他箱底的照片进行数字化留存,已是耄耋之年的外公端详起那些记忆来,看到都是一同革命的热情小伙,不时感慨:唉!好多人都不在啦!
1. <s:action .../> 可以用来在 JSP 页面直接调用 Action,用 name 指定 Action,executeResult(默认为 false) 指定是否包含那个 Action 转向视图的内容;executeResult 会把视图的所有内容输出在标签位置。ignoreContextParams(默认为 false),是否将本页的请求参数传到那个 Action。
2. <s:bean .../> 用来实例化 JavaBean,标签内使用 <s:param name="" value=""/> 来指定属性。在标签内,bean 实例位于 ValueStack 顶端,标签结束则自动清除。如果指定的 id 属性,还会把该实例放到 Stack Context 中。name 属性必须,指定 Bean 类的全限名称。不知道复杂的属性该如何用 <s:param .../> 或其他方式来指定。 Read More
前面记载过一篇 Java 执行 SQL 脚本文件,这里边完全是由自己写代码来分离出脚本中的每一个 SQL 语句的,有不少缺陷。当时还不太清楚 ANT 本身提供了功能很强的执行 SQL 语句和脚本的 SQL Task 可用。以下依次简单介绍如何在 build.xml 中执行 SQL 语句或脚本;Java 代码中如何调用 ant 的 SQLExec 类执行 SQL 脚本,最后考虑 ant.jar 的个头说大也不小,1M 多,如果只用于执行 SQL 脚本,则绝大部分代码就是垃圾,所以从同抽离出需要的两个类 JDBCTask 和 SQLExec,完全去除了对 ant.jar 包的依赖。
有关 ant 的更详细的记录请参见,http://ant.apache.org/manual/CoreTasks/sql.html 。 Read More
第十三章. Quartz 和 Web 应用
到目前为止,我们与 Quartz 框架的交互主要还是通过命令行。对于有些使用者,比如我的一个大学计算机科学老教授(它曾每天都告诉我说,"GUI 是给能力差的人用的!"),使用命令行让他们很乐意接受。当应用程序被开发完成后,它们常要移交给终端用户或支持团队。在命令行应用程序上层架设一个 GUI 前端会非常有帮助也是很增值的。本章记述如何在 Web 应用中用 Quartz 来使得部署和维护 Job 更轻松。
一. 在 Web 应用中使用 Quartz
至此,你已经看到过许多在 J2SE 环境中独立运行的 Quartz 的例子。在第十章,"J2EE 中使用 Quartz",你也学到了 Quartz 良好的运作于 J2EE 环境中。但是,我们还没有向你介绍的是如何部署 Quartz 到一个 Java Web 应用(通常简写为 Web app)中。这就是本章唯一意图 Read More
中世纪的欧洲《礼仪书》中说:痰不要吐到桌子上,也不要飞过桌子。1774年,欧洲的《礼仪与基督教礼貌守则》中说:我们再也不能原谅那些把痰吐到窗户外、墙上或者家具上的人。可见,欧洲人的素质也是在他们工业化富了之后的事。至少那个时候,我们的老祖宗再不争气,也绝不会把痰吐到桌子上。
1. OGNL 中有生成 List 和 Map 的表达式,分别是:{e1,e2,e3,...} 和 #{key1:val1,key2:val2,...}。对集合 OGNL 提供了两个操作符 in 和 not in,如:
<s:if test="'foo' in {'foo','bar'}" ... </s:if> ---- not in 的用法当然是一样的了。
之外,OGNL 还允许通过某个规则取集合的子集
·? :取出所有符合条件逻辑的元素
·^:取出符合条件的第一个元素 Read More
Ubuntu 8.0.4 已在万众企盼当中,本月 4 月 24 日正式发出,代码版本已封闭。继续写一个 Ubuntu Linux 7.10(alternate) 似乎十分多余,那就留给届时还会怀念 Ubuntu 7.10 的人士,也给自己留个底吧。
当然,每写个东西,总是要负责的,非轻率地转抄,终以本人实践真实记录。前面有篇是讲 Ubuntu 7.10(Desktop) 的安装,在 Windows 平台下从硬盘安装 Ubuntu Linux 7.10(Desktop),这里记载的是 Ubuntu 7.10(alternate) 的安装,是通过 grub4dos 来加上一个 Ubuntu 启动项,从而能从更盘引导。个人也更偏爱于用 alternate 版的光盘来安装,安装其他 Linux 发行版养成的习惯。 Read More
我用 MyEclipse 建了一个 Web 项目,配置了能支持 Struts2。在验证标签应用时,把 《Struts2权威指南--基于WebWork核心的MVC开发》一书的例子 10.3 controlTag 中的 s-if.jsp 拷入当前应用。该 jsp 文件的内容是:想像一下我访问它时得到了什么样的结果?1<%@ page contentType="text/html; charset=GBK" language="java"%> 2<%@taglib prefix="s" uri="/struts-tags"%> 3<html> 4 <head> 5 <title>s:if标签测试</title> 6 </head> 7 <body> 8 <s:set name="age" value="29"/> 9 <s:if test="${age > 60}"> 10 老年人 11 </s:if> 12 <s:elseif test="${age > 35}"> 13 中年人 14 </s:elseif> 15 <s:elseif test="${age > 15}" id="wawa"> 16 青年人 17 </s:elseif> 18 <s:else> 19 少年 20 </s:else> 21 </body> 22</html>
然后把该应用 TestStruts2 部署到 Tomcat 5.0.28 下,启动 Tomcat,地址栏输入 http://localhost:8080/TestStruts2/s-if.jsp,确定,执行结果让我傻眼了,任凭我百般刷新,也都是赫然显示着:
Read More