﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-理想蜗牛@*</title><link>http://www.blogjava.net/ravollen/</link><description>***用心生活***</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 05:59:50 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 05:59:50 GMT</pubDate><ttl>60</ttl><item><title>struts2+spring+hibernate整合</title><link>http://www.blogjava.net/ravollen/archive/2008/10/29/237354.html</link><dc:creator>理想蜗牛</dc:creator><author>理想蜗牛</author><pubDate>Wed, 29 Oct 2008 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/ravollen/archive/2008/10/29/237354.html</guid><wfw:comment>http://www.blogjava.net/ravollen/comments/237354.html</wfw:comment><comments>http://www.blogjava.net/ravollen/archive/2008/10/29/237354.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ravollen/comments/commentRss/237354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ravollen/services/trackbacks/237354.html</trackback:ping><description><![CDATA[<p align="center"><strong><span style="font-family: 微软雅黑"><strong style="font-size: 14pt; font-family: ">Struts2+Spring+Hibernate整合</strong></span><br />
<span style="font-size: 18pt">&nbsp;&nbsp;&nbsp; </p>
<hr align="center" width="80%" color="#c0c0c0" noShade size="1" />
<p align="center">
<table style="font-size: 12px; vertical-align: super; color: #000000; border-collapse: collapse; text-align: center" cellspacing="0" cellpadding="3" width="750" align="center" border="0">
    <tbody>
        <tr>
            <td style="width: 740px" width="750">
            <p align="left">&nbsp;&nbsp;<span style="color: #008000; font-family: 微软雅黑"><span style="color: #008000; font-family: 微软雅黑">本文主要目的是通过整合Struts2，Spring，Hibernate，开发出一个简易的图书管理系统，该系统具有增删改查的基本功能。</span></span><span style="color: #008000; font-family: 微软雅黑; background-color: yellow"><span style="color: #008000; font-family: 微软雅黑"><br />
            <br />
            <br />
            首先准备所需的JAR包，如下：</span></span></p>
            <div style="border-right: medium none; border-top: medium none; font-size: 12pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none" align="left"><img height="324" alt="" src="http://www.blogjava.net/images/blogjava_net/ravollen/jar_bao.jpg" width="481" border="0" /></div>
            <p align="left"><span style="font-family: 微软雅黑">把jar包拷贝到WEB-INF/lib下，然后在工程中引用这些包。<br style="font-family: " />
            <span style="color: red">注意该处使用的Struts版本为2.0.11.2，Spring版本为2.5.5，Hibernate版本为3.3.1</span></span><br />
            <br />
            <span style="font-size: 10pt; color: #333333; font-family: 微软雅黑; background-color: #ffff99"><span style="color: #008080"><span style="font-size: 10pt; font-family: 微软雅黑; background-color: #ffff99">修改web.xml：<br />
            </span></span></p>
            <div style="border-right: medium none; border-top: medium none; font-size: 12pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left"><span style="color: #333333; font-family: 微软雅黑"><font style="font-size: 10pt; background-color: #c0c0c0" face="微软雅黑" color="#333333">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
            &lt;web-app version="2.5" <br />
            &nbsp;xmlns="http://java.sun.com/xml/ns/javaee" <br />
            &nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <br />
            &nbsp;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee <br />
            &nbsp;http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;<br />
            &nbsp;<br />
            &nbsp;&lt;!-- spring的applicationContext载入 --&gt;<br />
            &nbsp;&lt;context-param&gt;<br />
            &nbsp;&nbsp;&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
            &nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/spring/*.xml&lt;/param-value&gt;<br />
            &nbsp;&lt;/context-param&gt;<br />
            &nbsp;&lt;!-- 定义log4j配置文件所在位置 --&gt;<br />
            &nbsp;&lt;context-param&gt;<br />
            &nbsp;&nbsp;&lt;param-name&gt;log4jConfigLocation&lt;/param-name&gt;<br />
            &nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/classes/log4j.properties&lt;/param-value&gt;<br />
            &nbsp;&lt;/context-param&gt;<br />
            &nbsp;<br />
            &nbsp;&lt;filter&gt;<br />
            &nbsp;&nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
            &nbsp;&nbsp;&lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class&gt;<br />
            &nbsp;&lt;/filter&gt;<br />
            &nbsp;&lt;!-- 这里用的是spring自带的编码过滤器，不用自己写了,其中主要代码<br />
            &nbsp;&nbsp; 是request.setCharacterEncoding(encoding)和<br />
            &nbsp;&nbsp; response.setCharacterEncoding(encoding)，对请求和响应设置编码。<br />
            &nbsp;&nbsp; 有两个参数：encoding和forceEncoding,其中forceEncoding默认是false，<br />
            &nbsp;&nbsp; (此种情况不能改变response的编码方式)如果设置成true则不管请求是否已有编码<br />
            &nbsp;&nbsp; 都强制转换成encoding指定的编码，同时在响应可设置编码的前提下设置响应编码。 --&gt;<br />
            &nbsp;&lt;filter&gt;<br />
            &nbsp;&nbsp;&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
            &nbsp;&nbsp;&lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;<br />
            &nbsp;&nbsp;&lt;init-param&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;param-name&gt;encoding&lt;/param-name&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;param-value&gt;utf-8&lt;/param-value&gt;<br />
            &nbsp;&nbsp;&lt;/init-param&gt;<br />
            &nbsp;&nbsp;&lt;init-param&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;param-name&gt;forceEncoding&lt;/param-name&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;param-value&gt;true&lt;/param-value&gt;<br />
            &nbsp;&nbsp;&lt;/init-param&gt;<br />
            &nbsp;&lt;/filter&gt;<br />
            &nbsp;<br />
            &nbsp;&lt;filter-mapping&gt;<br />
            &nbsp;&nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
            &nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
            &nbsp;&lt;/filter-mapping&gt;<br />
            &nbsp;&lt;filter-mapping&gt;<br />
            &nbsp;&nbsp;&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
            &nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
            &nbsp;&lt;/filter-mapping&gt;&nbsp;<br />
            &nbsp;&nbsp;<br />
            &nbsp;&lt;listener&gt;<br />
            &nbsp;&nbsp;&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
            &nbsp;&lt;/listener&gt;&nbsp;<br />
            &nbsp;&lt;!--&nbsp; <br />
            &nbsp;&nbsp;web应用关闭时IntrospectorCleanupListener类负责对javabean<br />
            &nbsp;&nbsp;内省缓存进行清除；该类实现接口ServletContextListener，<br />
            &nbsp;&nbsp;对缓存在context中的javabean类进行清除操作的。<br />
            &nbsp; --&gt;<br />
            &nbsp;&lt;listener&gt;<br />
            &nbsp;&nbsp;&lt;listener-class&gt;org.springframework.web.util.IntrospectorCleanupListener&lt;/listener-class&gt;<br />
            &nbsp;&lt;/listener&gt;<br />
            &nbsp;&lt;!-- Listener log4jConfigLocation --&gt;<br />
            &nbsp; &nbsp;&lt;listener&gt;<br />
            &nbsp;&nbsp;&nbsp; &nbsp;&lt;listener-class&gt;org.springframework.web.util.Log4jConfigListener&lt;/listener-class&gt;<br />
            &nbsp; &nbsp;&lt;/listener&gt;<br />
            &nbsp; &nbsp;&nbsp;<br />
            &nbsp; &nbsp;&lt;!-- 定义session的超时时间，单位为分钟 --&gt;<br />
            &nbsp;&lt;session-config&gt;<br />
            &nbsp;&nbsp;&lt;session-timeout&gt;10&lt;/session-timeout&gt;<br />
            &nbsp;&lt;/session-config&gt;<br />
            &nbsp;<br />
            &nbsp; &lt;welcome-file-list&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
            &nbsp; &lt;/welcome-file-list&gt;<br />
            &lt;/web-app&gt;<br />
            </font></span></div>
            </span><span style="font-size: 10pt; color: #333333; font-family: 微软雅黑; background-color: #ccffcc">
            <p align="left">几点需要注意的地方：1）对于spring的配置文件和log4j日志配置文件的读取我们用的是spring的ContextLoaderListener和Log4jConfigListener这两个个监听器。2）对浏览器发送的请求，通过配置的Struts2的过滤器（FilterDispatcher)可以对不同的url进行过滤，此处我们配置处理该web应用的所有请求。3）配置了一个spring自带的编码过滤器，用来处理请求和响应的编码，本应用配置对所有请求和响应都采用该编码过滤器，这里我们采用的utf-8。<br />
            <br />
            <span style="background-color: #ffff00"><span style="background-color: #ffff99">在WEB-INF/spring/目录下新建applicationContext.xml，内容如下： </span></span></p>
            <div style="border-right: medium none; border-top: medium none; font-size: 12pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left"><span style="font-size: 10pt; color: #333333; font-family: 微软雅黑">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
            &lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />
            &lt;!-- 该处的default-autowire对所有bean提供一种默认的自动装配方式，如果bean需要不同的方式，<br />
            可以在bean中配置配置autowire属性。自动装配方式有以下几种：<br />
            1) no 不使用自动装配。必须通过ref元素指定依赖，这是默认设置。<br />
            2) byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean，并将其与属性自动装配。<br />
            3) byType 如果容器中存在一个与指定属性类型相同的bean，那么将与该属性自动装配。<br />
            4) constructor 与byType的方式类似，不同之处在于它应用于构造器参数。<br />
            5) autodetect 通过bean类的自省机制（introspection）来决定是使用constructor还是byType方式进行自动装配。 --&gt;<br />
            &lt;beans&gt;<br />
            &nbsp;&lt;!-- 如果实体定义用的是xml配置文件，则sessionFactory的class<br />
            &nbsp;&nbsp;应为"org.springframework.orm.hibernate3.LocalSessionFactoryBean" --&gt;<br />
            &nbsp;&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&gt;<br />
            &nbsp;&nbsp;&lt;property name="configLocation"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;value&gt;classpath:hibernate.cfg.xml&lt;/value&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&nbsp; &lt;!--&nbsp;&nbsp; 配置多个hibernate.cfg.xml<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="configLocations"&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;list&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;value&gt;classpath:hibernate_admin1.cfg.xml&lt;/value&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;value&gt;classpath:hibernate_admin2.cfg.xml&lt;/value&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &nbsp;<br />
            &nbsp;&lt;!-- 配置事务管理 --&gt;<br />
            &nbsp;&lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />
            &nbsp;&nbsp;&lt;property name="sessionFactory" ref="sessionFactory"&gt;&lt;/property&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &nbsp;<br />
            &nbsp;&lt;!-- 这里的abstract属性说明该bean是抽象的，不能实例化，只能用来被继承，在这里他被BookService继承 --&gt;<br />
            &nbsp;&lt;bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"&gt;<br />
            &nbsp;&nbsp;&lt;property name="transactionManager" ref="transactionManager"&gt;&lt;/property&gt;<br />
            &nbsp;&nbsp;&lt;property name="transactionAttributes"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;props&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- PROPAGATION_REQUIRED代表必须在事务中执行，-Exception表示<br />
            &nbsp;&nbsp;&nbsp;&nbsp;当有Exception抛出时事务回滚 --&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="find*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="persist*"&gt;PROPAGATION_REQUIRED,-Exception&lt;/prop&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="remove*"&gt;PROPAGATION_REQUIRED,-Exception&lt;/prop&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;/props&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &nbsp;&lt;bean id="BookService" parent="baseTransactionProxy"&gt;<br />
            &nbsp;&nbsp;&lt;property name="target"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;bean class="com.css.ravollen.sshtest.service.impl.BookServiceImpl"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="dao"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean class="com.css.ravollen.sshtest.dao.impl.BookDAOImpl"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="sessionFactory" ref="sessionFactory"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &nbsp;&lt;bean id="BookAction" class="com.css.ravollen.sshtest.action.BookAction"&gt;<br />
            &nbsp;&nbsp;&lt;property name="bookService" ref="BookService"&gt;&lt;/property&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &lt;/beans&gt;</span></div>
            <p align="left">这里几点要注意的地方：1）sessionFactory的真正定义是在hibernate.cfg.xml里面，sessionFactory Bean通过configLocation属性提供的路径去找，因为hibernate.cfg.xml是在/WEB-INF/classes/下，所以可以通过classpath:hibernate.cfg.xml定位。2）该处配置的sessionFactory是基于Annotation对实体进行管理的。3）对于持久化操作可以配置事务管理机制保证数据的安全和合法，本实例对于目标类（BookServiceImpl）中的以find，persist，remove开头的方法都采用事务机制。<br />
            <br />
            <span style="background-color: #ffff99">接下来看WEB-INF/classes/下的hibernate.cfg.xml</span><br />
            </p>
            <div style="border-right: medium none; border-top: medium none; font-size: 10pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
            &lt;!DOCTYPE hibernate-configuration PUBLIC<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Hibernate/Hibernate Configuration DTD 3.0//EN"<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;<br />
            &lt;hibernate-configuration&gt;<br />
            &nbsp;&lt;session-factory&gt;<br />
            &nbsp;&nbsp;&lt;property name="hibernate.connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt;<br />
            &nbsp;&nbsp;&lt;property name="hibernate.connection.username"&gt;ravollen&lt;/property&gt;<br />
            &nbsp;&nbsp;&lt;property name="hibernate.connection.password"&gt;726321&lt;/property&gt;<br />
            &nbsp;&nbsp;&lt;property name="hibernate.connection.url"&gt;jdbc:mysql://localhost:3306/book?useUnicode=true&amp;amp;characterEncoding=UTF-8&lt;/property&gt;<br />
            &nbsp;&nbsp;&lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQL5Dialect&lt;/property&gt;<br />
            &nbsp;&nbsp;&lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该属性默认为none，有以下几种：<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）validate&nbsp;加载hibernate时，验证创建数据库表结构<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2) create 每次加载hibernate，重新创建数据库表结构，这就是导致数据库表数据丢失的原因。<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3） create-drop&nbsp;加载hibernate时创建，退出是删除表结构<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4） update 加载hibernate自动更新数据库结构<br />
            &nbsp;&nbsp; --&gt;<br />
            &nbsp;&nbsp;&lt;!-- <br />
            &nbsp;&nbsp;&lt;property name="hibernate.hbm2ddl.auto"&gt;create&lt;/property&gt;<br />
            &nbsp;&nbsp;&nbsp; --&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- <br />
            &nbsp;&nbsp;&nbsp; 这里由于我们采用的是annotation方式，所以直接指向实体对应的类即可，如果是采用实体配置文件则写成<br />
            &nbsp;&nbsp;&nbsp; &lt;mapping resource="com/css/ravollen/sshtest/entity/Book.hbm.xml"&gt;&lt;/mapping&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
            &nbsp;&nbsp;&lt;mapping class="com.css.ravollen.sshtest.entity.Book"&gt;&lt;/mapping&gt;<br />
            &nbsp;&lt;/session-factory&gt;<br />
            &lt;/hibernate-configuration&gt;</div>
            <p align="left">该文件主要配置了数据库底层连接的一些信息。需要注意的地方有：1）数据库url需加上useUnicode=true&amp;amp;characterEncoding=UTF-8，可以解决中文乱码问题。（其中&amp;amp;是&amp;的转义符）<br />
            2）属性"hibernate.hbm2ddl.auto"可以用来建数据库，省事不少，但一定要在第一次运行后注销掉该属性否则每次启动该应用都会把建好的数据库删掉造成数据丢失。3）由于我们采用的annotation方式（从jdk5开始）配置实体，所以mapping属性通过class子属性找到对应的实体类。<br />
            <br />
            <span style="background-color: #ffff99">下面是WEB-INF/classes/下的struts.xml配置文件：</span><br />
            </p>
            <div style="border-right: medium none; border-top: medium none; font-size: 10pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
            &lt;!DOCTYPE struts PUBLIC<br />
            &nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
            &nbsp;&nbsp;&nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;<br />
            &lt;struts&gt;<br />
            &nbsp;&lt;!-- extends说明该配置文件继承自struts-default.xml --&gt;<br />
            &nbsp;&lt;package name="test" extends="struts-default"&gt;<br />
            &nbsp;&nbsp;&lt;global-results&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;result name="listAllBooks"&gt;/WEB-INF/ui/booklist.jsp&lt;/result&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;result name="bookInfo"&gt;/WEB-INF/ui/editBook.jsp&lt;/result&gt;<br />
            &nbsp;&nbsp;&lt;/global-results&gt;<br />
            &nbsp;&nbsp;&lt;action name="LoadBookById" class="BookAction" method="findBookById"&gt;&lt;/action&gt;<br />
            &nbsp;&nbsp;&lt;action name="LoadBookByParam" class="BookAction" method="findBookByParam"&gt;&lt;/action&gt;<br />
            &nbsp;&nbsp;&lt;action name="LoadAllBooks" class="BookAction" method="findAllBooks"&gt;&lt;/action&gt;<br />
            &nbsp;&nbsp;&lt;action name="editBook" class="BookAction" method="loadBook"&gt;&lt;/action&gt;<br />
            &nbsp;&nbsp;&lt;action name="saveBook" class="BookAction" method="saveBook"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- <br />
            &nbsp;&nbsp;都是struts2的默认拦截器<br />
            &nbsp;&nbsp;param拦截器 将Request请求的参数设置到相应Action对象的属性中<br />
            &nbsp;&nbsp;validation拦截器&nbsp; 实现使用xml配置文件（{Action}-validation.xml）对Action属性值进行验证<br />
            &nbsp;&nbsp; --&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;interceptor-ref name="params" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;interceptor-ref name="validation" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;result name="input"&gt;/editBook.jsp&lt;/result&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;result name="success" type="redirect"&gt;LoadAllBooks.action&lt;/result&gt;<br />
            &nbsp;&nbsp;&lt;/action&gt;<br />
            &nbsp;&nbsp;&lt;action name="removeBook" class="BookAction" method="removeBook"&gt;<br />
            &nbsp;&nbsp;&lt;/action&gt;<br />
            &nbsp;&lt;/package&gt;<br />
            &lt;/struts&gt;</div>
            <p align="left">注意这几项：1）package的extends属性说明该配置文件是继承自strut-default.xml，该配置文件在struts2-core-2.0.11.2.jar包内。2）对于大量重复的result，我们可以配置成全局的result，可以减少文件冗余。3）在"保存书"这个活动中，加入了struts2的校验框架，在该action中加入两个拦截器"params"和&#8220;validation"就可以，此外在该Action的同一级目录下新建一个校验配置文件即可，命名规则：活动名+"-"+方法名+"-"+"validation.xml，如果该校验文件引用了消息文件，则还要在同一级目录下建一个.properties的消息文件文件，前缀与活动名一样。（需要对消息文件进行ascii码转换，命令为 native2ascii "源文件" "新文件")<br />
            <br />
            <br />
            <span style="background-color: #ffff99">在src目录的dao包（可自定义，只要与配置文件的路径相同就行）下定义BookDAO接口和实现该接口的BookDAOImpl类，dao数据访问层主要通过Hibernate进行数据的增删改查的操作。如下：<br />
            </span></p>
            <div style="border-right: medium none; border-top: medium none; font-size: 10pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left">
            <p>接口：<font style="background-color: #c0c0c0" face="微软雅黑" color="#333333"><br />
            package com.css.ravollen.sshtest.dao;<br />
            import java.util.List;<br />
            import com.css.ravollen.sshtest.entity.Book;</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333">public interface BookDAO {<br />
            &nbsp;public Book findBookById(Long id);<br />
            &nbsp;public List&lt;Book&gt; findBookByParam(String type,String value);<br />
            &nbsp;public List&lt;Book&gt; findAllBooks();<br />
            &nbsp;public void persistBook(Book book);<br />
            &nbsp;public void removeBook(Book book);<br />
            &nbsp;public void removeById(Long id);<br />
            }</font></p>
            实现类：<br />
            <p>package com.css.ravollen.sshtest.dao.impl;</p>
            <p>import java.util.List;<br />
            import org.hibernate.Session;<br />
            import org.springframework.orm.hibernate3.HibernateCallback;<br />
            import org.springframework.orm.hibernate3.support.HibernateDaoSupport;<br />
            import com.css.ravollen.sshtest.dao.BookDAO;<br />
            import com.css.ravollen.sshtest.entity.Book;</p>
            <p>public class BookDAOImpl extends HibernateDaoSupport implements BookDAO {<br />
            &nbsp;public BookDAOImpl() {<br />
            &nbsp;&nbsp;super();<br />
            &nbsp;}<br />
            &nbsp;<br />
            <font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">/**<br />
            &nbsp; * 通过自定义类型查找，比如可通过书名，作者查找<br />
            &nbsp; */</font><br />
            &nbsp;public List&lt;Book&gt; findBookByParam(final String type,final String value) {<br />
            &nbsp;&nbsp;// TODO Auto-generated method stub<br />
            &nbsp;&nbsp;String sql="";<br />
            &nbsp;&nbsp;sql="FROM Book where "+type+" like '%"+value+"%'"+"ORDER BY bookName";<br />
            &nbsp;&nbsp;return getHibernateTemplate().find(sql);<br />
            &nbsp;}</p>
            <p>&nbsp;public List&lt;Book&gt; findAllBooks() {<br />
            &nbsp;&nbsp;// TODO Auto-generated method stub<br />
            &nbsp;&nbsp;return getHibernateTemplate().loadAll(Book.class);<br />
            &nbsp;}</p>
            <p>&nbsp;public Book findBookById(Long id) {<br />
            &nbsp;&nbsp;// TODO Auto-generated method stub<br />
            &nbsp;&nbsp;return (Book)getHibernateTemplate().get(Book.class, id);<br />
            &nbsp;}</p>
            <p>&nbsp;public void persistBook(Book book) {<br />
            &nbsp;&nbsp;// TODO Auto-generated method stub<br />
            &nbsp;&nbsp;getHibernateTemplate().saveOrUpdate(book);<br />
            &nbsp;}</p>
            <p>&nbsp;public void removeBook(Book book) {<br />
            &nbsp;&nbsp;// TODO Auto-generated method stub<br />
            &nbsp;&nbsp;getHibernateTemplate().delete(book);<br />
            &nbsp;}</p>
            <p>&nbsp;public void removeById(final Long id) {<br />
            &nbsp;&nbsp;// TODO Auto-generated method stub<br />
            &nbsp;&nbsp;getHibernateTemplate().execute(new HibernateCallback() {<br />
            &nbsp;&nbsp;&nbsp;public Object doInHibernate(Session session) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;session.createQuery("delete from Book o where o.bookId="+id+"").executeUpdate();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;return 1;<br />
            &nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;});<br />
            &nbsp;}<br />
            }</p>
            </div>
            <p align="left"><br />
            <br />
            再看看业务层的services包，该包有BookService接口和实现该接口的BookServiceImpl类，这个包用来衔接数据访问层和表现层，一定程度上起到解耦作用。代码如下：<br />
            </p>
            <div style="border-right: medium none; border-top: medium none; font-size: 10pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left">
            <p>接口：<font style="background-color: #c0c0c0" face="微软雅黑" color="#333333"><br />
            </p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">package com.css.ravollen.sshtest.service;<br />
            </font><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">import java.util.List;<br />
            import com.css.ravollen.sshtest.entity.Book;</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">public interface BookService {<br />
            &nbsp;public Book findBookById(Long id) throws Exception;<br />
            &nbsp;<br />
            &nbsp;public List&lt;Book&gt; findBookByParam(String type,String value) throws Exception;</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public List&lt;Book&gt; findAllBooks() throws Exception;</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public void persistBook(Book book) throws Exception;</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public void removeBook(Book book) throws Exception;</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public void removeBookById(Long id) throws Exception;<br />
            }</font></p>
            <p></font>实现类：<br />
            </p>
            <p>package com.css.ravollen.sshtest.service.impl;<br />
            import java.util.List;<br />
            import org.springframework.context.ApplicationContext;<br />
            import com.css.ravollen.sshtest.dao.BookDAO;<br />
            import com.css.ravollen.sshtest.entity.Book;<br />
            import com.css.ravollen.sshtest.service.BookService;</p>
            <p>public class BookServiceImpl implements BookService {<br />
            &nbsp;private&nbsp; BookDAO dao;<br />
            &nbsp;private static final String SERVICE_BEAN_ID = "BookService";<br />
            &nbsp;public BookServiceImpl() {<br />
            &nbsp;&nbsp;super();<br />
            &nbsp;}<br />
            &nbsp;public static BookService getInstance(ApplicationContext context) {<br />
            &nbsp;&nbsp;return (BookService)context.getBean(SERVICE_BEAN_ID);<br />
            &nbsp;}<br />
            &nbsp;public List&lt;Book&gt; findAllBooks() throws Exception {<br />
            &nbsp;&nbsp;try {<br />
            &nbsp;&nbsp;&nbsp;return getDao().findAllBooks();<br />
            &nbsp;&nbsp;}catch(RuntimeException e) {<br />
            &nbsp;&nbsp;&nbsp;throw new Exception("findAllBooks failed ："+e.getMessage());<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}</p>
            <p>&nbsp;public Book findBookById(Long id) throws Exception {<br />
            &nbsp;&nbsp;try {<br />
            &nbsp;&nbsp;&nbsp;return getDao().findBookById(id);<br />
            &nbsp;&nbsp;}catch(RuntimeException e) {<br />
            &nbsp;&nbsp;&nbsp;throw new Exception("findBookById failed with the id " + id + ": " + e.getMessage()); <br />
            &nbsp;&nbsp;}<br />
            &nbsp;}<br />
            &nbsp;public List&lt;Book&gt; findBookByParam(String type,String value) throws Exception {<br />
            &nbsp;&nbsp;try {<br />
            &nbsp;&nbsp;&nbsp;return getDao().findBookByParam(type,value);<br />
            &nbsp;&nbsp;}catch(RuntimeException e) {<br />
            &nbsp;&nbsp;&nbsp;throw new Exception("findBookByParam failed with type is :"+type+" and queryContent is:"+value+" :"+e.getMessage());<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}</p>
            <p>&nbsp;public void persistBook(Book book) throws Exception {<br />
            &nbsp;&nbsp;try {<br />
            &nbsp;&nbsp;&nbsp;getDao().persistBook(book);<br />
            &nbsp;&nbsp;}catch(RuntimeException e) {<br />
            &nbsp;&nbsp;&nbsp;throw new Exception("persistBook failed: " + e.getMessage()); <br />
            &nbsp;&nbsp;}<br />
            &nbsp;}</p>
            <p>&nbsp;public void removeBook(Book book) throws Exception {<br />
            &nbsp;&nbsp;try {<br />
            &nbsp;&nbsp;&nbsp;getDao().removeBook(book);<br />
            &nbsp;&nbsp;}catch(RuntimeException e) {<br />
            &nbsp;&nbsp;&nbsp;throw new Exception("removeBook failed: " + e.getMessage());<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}</p>
            <p>&nbsp;public void removeBookById(Long id) throws Exception {<br />
            &nbsp;&nbsp;try {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getDao().removeById(id);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(RuntimeException e) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new Exception("removeBookById failed: " + e.getMessage());<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;}</p>
            <p>&nbsp;public BookDAO getDao() {<br />
            &nbsp;&nbsp;return dao;<br />
            &nbsp;}</p>
            <p>&nbsp;public void setDao(BookDAO dao) {<br />
            &nbsp;&nbsp;this.dao = dao;<br />
            &nbsp;}<br />
            }</p>
            </div>
            <p align="left">注意：1）BookServiceImpl实例通过ApplicationContext从Spring的上下文中得到。2)BookDAO通过Spring的IOC注入到里面。<br />
            <br />
            <span style="background-color: #ffff99">接下来写BookAction，主要负责处理前台传来的请求，继承自ActionSupport工具类，因而能提供数据校验功能。</span><br />
            </p>
            <div style="border-right: medium none; border-top: medium none; font-size: 10pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left">
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">package com.css.ravollen.sshtest.action;<br />
            import java.util.List;<br />
            import org.apache.log4j.Logger;<br />
            import com.css.ravollen.sshtest.entity.Book;<br />
            import com.css.ravollen.sshtest.service.BookService;<br />
            import com.opensymphony.xwork2.ActionSupport;</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2"><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">/**<br />
            &nbsp;* ActionSupport工具类比Action接口多了一个validate()方法，可提供数据校验，<br />
            &nbsp;* 实际上在本例中我们校验采用的是Struts的校验框架，而不是通过改写ActionSupport<br />
            &nbsp;* 的validate()方法去校验数据<br />
            &nbsp;* @author Administrator<br />
            &nbsp;*/<br />
            </font>public class BookAction extends ActionSupport {</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;private static Logger logger = Logger.getLogger(BookAction.class);<br />
            &nbsp;private BookService bookService;<br />
            &nbsp;private Book book;<br />
            &nbsp;private List books;<br />
            &nbsp;private String searchType,searchContent;<br />
            &nbsp;private Long bookId;<br />
            &nbsp;private int addBookFlag;</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public Long getBookId() {<br />
            &nbsp;&nbsp;return bookId;<br />
            &nbsp;}</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public void setBookId(Long bookId) {<br />
            &nbsp;&nbsp;this.bookId = bookId;<br />
            &nbsp;}</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public String getSearchType() {<br />
            &nbsp;&nbsp;return searchType;<br />
            &nbsp;}</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public void setSearchType(String searchType) {<br />
            &nbsp;&nbsp;this.searchType = searchType;<br />
            &nbsp;}</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public String getSearchContent() {<br />
            &nbsp;&nbsp;return searchContent;<br />
            &nbsp;}</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public void setSearchContent(String searchContent) {<br />
            &nbsp;&nbsp;this.searchContent = searchContent;<br />
            &nbsp;}</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public String findBookById(Long id) {<br />
            &nbsp;&nbsp;try {<br />
            &nbsp;&nbsp;&nbsp;this.book = getBookService().findBookById(id);<br />
            &nbsp;&nbsp;&nbsp;return "bookInfo";<br />
            &nbsp;&nbsp;}catch(Exception e) {<br />
            &nbsp;&nbsp;&nbsp;logger.error("BookAction中findBookById()出错!");<br />
            &nbsp;&nbsp;&nbsp;return ERROR;<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}<br />
            &nbsp;<br />
            &nbsp;public String findBookByParam() {<br />
            &nbsp;&nbsp;try {<br />
            &nbsp;&nbsp;&nbsp;this.books = getBookService().findBookByParam(getSearchType(),getSearchContent());<br />
            &nbsp;&nbsp;&nbsp;return "listAllBooks";<br />
            &nbsp;&nbsp;}catch(Exception e) {<br />
            &nbsp;&nbsp;&nbsp;logger.error("BookAction中findBookByParam()出错!");<br />
            &nbsp;&nbsp;&nbsp;return ERROR;<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}<br />
            &nbsp;<br />
            &nbsp;public String findAllBooks() {<br />
            &nbsp;&nbsp;try {<br />
            &nbsp;&nbsp;&nbsp;this.books = getBookService().findAllBooks();<br />
            &nbsp;&nbsp;&nbsp;return "listAllBooks";<br />
            &nbsp;&nbsp;}catch(Exception e) {<br />
            &nbsp;&nbsp;&nbsp;logger.error("BookAction中findAllBooks()出错!");<br />
            &nbsp;&nbsp;&nbsp;return ERROR;<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}<br />
            &nbsp;<br />
            &nbsp;/**<br />
            &nbsp; * <br />
            &nbsp; * @return result对应的名字<br />
            &nbsp; * @throws Exception<br />
            &nbsp; */<br />
            &nbsp;public String loadBook() throws Exception {<br />
            &nbsp;&nbsp;if(getAddBookFlag()==1) {<br />
            &nbsp;&nbsp;&nbsp;addBookFlag = 0;<br />
            &nbsp;&nbsp;&nbsp;book = null;<br />
            &nbsp;&nbsp;}<br />
            &nbsp;&nbsp;else if(bookId!=null) {<br />
            &nbsp;&nbsp;&nbsp;book = getBookService().findBookById(bookId);<br />
            &nbsp;&nbsp;}&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; return "bookInfo";<br />
            &nbsp;}<br />
            &nbsp;public String saveBook() throws Exception {<br />
            &nbsp;&nbsp;&nbsp;getBookService().persistBook(getBook());<br />
            &nbsp;&nbsp;return SUCCESS;<br />
            &nbsp;}<br />
            &nbsp;public String removeBook() throws Exception {<br />
            &nbsp;&nbsp;if(null!=bookId) {<br />
            &nbsp;&nbsp;&nbsp;getBookService().removeBookById(bookId);<br />
            &nbsp;&nbsp;}<br />
            &nbsp;&nbsp;return "listAllBooks";<br />
            &nbsp;}<br />
            &nbsp;<br />
            &nbsp;public Book getBook() {<br />
            &nbsp;&nbsp;return book;<br />
            &nbsp;}<br />
            &nbsp;public void setBook(Book book) {<br />
            &nbsp;&nbsp;this.book = book;<br />
            &nbsp;}<br />
            &nbsp;public List getBooks() {<br />
            &nbsp;&nbsp;return books;<br />
            &nbsp;}<br />
            &nbsp;public void setBooks(List books) {<br />
            &nbsp;&nbsp;this.books = books;<br />
            &nbsp;}<br />
            &nbsp;public BookService getBookService() {<br />
            &nbsp;&nbsp;return bookService;<br />
            &nbsp;}<br />
            &nbsp;public void setBookService(BookService bookService) {<br />
            &nbsp;&nbsp;this.bookService = bookService;<br />
            &nbsp;}</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public int getAddBookFlag() {<br />
            &nbsp;&nbsp;return addBookFlag;<br />
            &nbsp;}</font></p>
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;public void setAddBookFlag(int addBookFlag) {<br />
            &nbsp;&nbsp;this.addBookFlag = addBookFlag;<br />
            &nbsp;}<br />
            }<br />
            </font></p>
            </div>
            <p align="left">说明一下：1）Struts的拦截器解析前台参数然后将值赋给Action里的对应属性，使得我们不用跟请求和响应直接打交道。2）对于增加书和编辑书我们用同一个方法处理，通过isAddBook来标识，&nbsp;addBookFlag==1是增加，==0是编辑。（<span style="color: red">不知为何用布尔型来标识前台无法返回正确的布尔值，所以在这里用的是整形</span>）<br />
            <br />
            <span style="color: #000000; background-color: yellow">校验框架使用的配置文件命名为BookAction-saveBook-validation.xml，内容如下：<br />
            </span></p>
            <div style="border-right: medium none; border-top: medium none; font-size: 10pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left">
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
            &lt;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd"&gt;<br />
            &lt;validators&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;!-- Field-Validator Syntax --&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;field name="book.bookName"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field-validator type="requiredstring"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message key="book.bookName.required"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field-validator&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/field&gt;<br />
            &lt;/validators&gt;</font><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2"><br />
            </font></p>
            </div>
            <p align="left">这里用到了消息资源，因此在同级目录下还要有一个名为BookAction.properties的资源文件。<br />
            <br />
            下面贴出booklist.jsp，基于Struts2强大的标签：<br />
            </p>
            <div style="border-right: medium none; border-top: medium none; font-size: 10pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left">
            <p><font style="background-color: #c0c0c0" face="微软雅黑" color="#333333" size="2">&lt;%@page pageEncoding="gb2312" contentType="text/html; charset=UTF-8" %&gt;<br />
            &lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;</p>
            <p>&lt;html&gt;<br />
            &lt;head&gt;&lt;title&gt;图书管理系统&lt;/title&gt;&lt;/head&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;style type="text/css"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; border: 1px solid black;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; border-collapse: collapse;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table thead tr th {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; border: 1px solid black;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; padding: 3px;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; background-color: #cccccc;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table tbody tr td {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; border: 1px solid black;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; padding: 3px;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; &lt;/style&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;script language="JavaScript"&gt;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; function doSearch(){<br />
            &nbsp;&nbsp;&nbsp;if(document.all.queryContent.value=="")<br />
            &nbsp;&nbsp;&nbsp;{&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;alert("请输入查询关键字!");<br />
            &nbsp;&nbsp;&nbsp;}else{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;window.location.href="LoadBookByParam.action?searchType="+document.all.queryType.value+"&amp;&amp;searchContent="+document.all.queryContent.value;<br />
            &nbsp;&nbsp; &nbsp;}<br />
            &nbsp;&nbsp;}<br />
            &nbsp;&lt;/script&gt;<br />
            &lt;body&gt;<br />
            &lt;table cellspacing="0" align="center"&gt;<br />
            &nbsp;&lt;thead&gt;<br />
            &nbsp;&lt;tr&gt;<br />
            &nbsp;&nbsp;&lt;th&gt;&lt;a href='&lt;s:url action="editBook"&gt;&lt;s:param name="addBookFlag" value="1" /&gt;&lt;/s:url&gt;'&gt;增加&lt;/a&gt;&lt;/th&gt;<br />
            &nbsp;&nbsp;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;<br />
            &nbsp;&lt;/tr&gt;<br />
            &nbsp;&lt;tr align="center"&gt;<br />
            &nbsp;&nbsp;&lt;th&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;select name="queryType"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;option value="bookId"&gt;Id&lt;/option&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;option value="bookName"&gt;书名&lt;/option&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;/select&gt;<br />
            &nbsp;&nbsp;&lt;/th&gt;<br />
            &nbsp;&nbsp;&lt;th&gt;&lt;input type="text" name="queryContent" value="" size="10"/&gt;&lt;/th&gt;<br />
            &nbsp;&nbsp;&lt;th&gt;&lt;input type="button" value="查询" onClick="doSearch();"&gt;&lt;/th&gt;<br />
            &nbsp;&lt;/tr&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;th&gt;书名&lt;/th&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;th&gt;描述&lt;/th&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;th&gt;删除&lt;/th&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/thead&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;tbody&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;s:iterator value="books"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr class="trs"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href='&lt;s:url action="editBook" &gt;&lt;s:param name="bookId" value="bookId" /&gt;&lt;/s:url&gt;'&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:property value="bookName"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/a&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;s:property value="description" /&gt;&lt;/td&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;a href='&lt;s:url action="removeBook"&gt;&lt;s:param name="bookId" value="bookId" /&gt;&lt;/s:url&gt;'&gt;删除&lt;/a&gt;&lt;/td&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/s:iterator&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; &lt;/tbody&gt;<br />
            &lt;/table&gt;<br />
            &lt;/body&gt;<br />
            &lt;/html&gt;</font></p>
            </div>
            <p align="left"><br />
            editBook.jsp如下:<br />
            </p>
            <div style="border-right: medium none; border-top: medium none; font-size: 10pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left">
            <p>&lt;%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %&gt;<br />
            &lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;</p>
            <p>&lt;html&gt;<br />
            &lt;head&gt;<br />
            &nbsp;&lt;title&gt;编辑图书&lt;/title&gt;<br />
            &nbsp;&lt;s:head/&gt;<br />
            &lt;/head&gt;<br />
            &lt;body&gt;<br />
            &nbsp;&lt;h2&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:if test="null == book"&gt;增加图书&lt;/s:if&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:else&gt;编辑图书&lt;/s:else&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/h2&gt;<br />
            &nbsp;&lt;s:form name="editForm" action="saveBook" validate="true"&gt;&nbsp;<br />
            &nbsp;&nbsp; &lt;s:textfield label="书名" name="book.bookName"/&gt;<br />
            &nbsp;&nbsp; &lt;s:textfield label="作者" name="book.author"/&gt;<br />
            &nbsp;&nbsp; &lt;s:textfield label="出版社" name="book.publisher"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:datetimepicker label="出版日期" name="book.pubDate"&gt;&lt;/s:datetimepicker&gt;<br />
            &nbsp;&nbsp; &lt;s:textfield label="内容摘要" name="book.description"/&gt;<br />
            &nbsp;&nbsp; &lt;s:if test="null == book"&gt;<br />
            &nbsp;&nbsp; &nbsp;&lt;s:hidden name="book.bookId" value="%{bookId}"/&gt;<br />
            &nbsp;&nbsp; &lt;/s:if&gt;&nbsp; &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:else&gt;<br />
            &nbsp;&nbsp; &nbsp;&lt;s:hidden name="book.bookId" /&gt;<br />
            &nbsp;&nbsp; &lt;/s:else&gt;<br />
            &nbsp;&nbsp; &lt;s:submit value="%{getText('保存')}" /&gt;<br />
            &nbsp;&lt;/s:form&gt;<br />
            &lt;p&gt;&lt;a href="&lt;s:url action="LoadAllBooks"/&gt;"&gt;返回&lt;/a&gt;&lt;/p&gt;<br />
            &lt;/body&gt;<br />
            &lt;/html&gt;</p>
            </div>
            <p align="left"><br />
            <br />
            至此我们完成了一个完整的Web Project，把它发布到tomcat下看看吧！（祝你成功）<img height="20" src="http://www.blogjava.net/Emoticons/QQ/14.gif" width="20" border="0"  alt="" /><br />
            </span></p>
            </td>
        </tr>
        <tr>
            <td>2008年10月29日17:45:21</td>
        </tr>
    </tbody>
</table>
</span></strong></p>
<img src ="http://www.blogjava.net/ravollen/aggbug/237354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ravollen/" target="_blank">理想蜗牛</a> 2008-10-29 17:44 <a href="http://www.blogjava.net/ravollen/archive/2008/10/29/237354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring中如何使用quartz实现定时作业</title><link>http://www.blogjava.net/ravollen/archive/2007/06/08/122831.html</link><dc:creator>理想蜗牛</dc:creator><author>理想蜗牛</author><pubDate>Fri, 08 Jun 2007 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/ravollen/archive/2007/06/08/122831.html</guid><wfw:comment>http://www.blogjava.net/ravollen/comments/122831.html</wfw:comment><comments>http://www.blogjava.net/ravollen/archive/2007/06/08/122831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ravollen/comments/commentRss/122831.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ravollen/services/trackbacks/122831.html</trackback:ping><description><![CDATA[<p align="center"><strong><span style="font-family: 微软雅黑"><strong style="font-size: 14pt; font-family: ">spring中如何使用quartz实现定时作业</strong></span><br />
<span style="font-size: 18pt">&nbsp;&nbsp;&nbsp; </p>
<hr align="center" width="80%" color="#c0c0c0" noShade size="1" />
<p align="center">
<table style="font-size: 12px; vertical-align: super; color: #000000; border-collapse: collapse; text-align: center" cellspacing="0" cellpadding="3" width="750" align="center" border="0">
    <tbody>
        <tr>
            <td style="width: 740px" width="750">
            <p align="left">&nbsp; <span style="color: #008000; font-family: 微软雅黑; background-color: yellow"><span style="color: #008000; font-family: 微软雅黑">TimerConfig.xml代码如下：</span></span></p>
            <div style="border-right: medium none; border-top: medium none; font-size: 12pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left"><span style="color: #333333; font-family: 微软雅黑"><span style="font-size: 10pt">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
            &lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"<br />
            "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />
            &lt;beans&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;bean id="mainTask" class="net.timed.MainTask"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;bean id="mainJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="targetObject"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="mainTask"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="targetMethod"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;execute&lt;/value&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            &lt;!--&nbsp; <br />
            &lt;bean id="timeTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"&gt;<br />
            --&gt;<br />
            &lt;bean id="timeTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="jobDetail"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="mainJob"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &lt;!--<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="startDelay"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;0&lt;/value&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="repeatInterval"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;2000&lt;/value&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            --&gt;<br />
            &lt;!-- <br />
            0 0 10,14,16 * * ? 每天上午10点，下午2点，4点<br />
            0 0/30 9-17 * * ?&nbsp;&nbsp; 朝九晚五工作时间内每半小时<br />
            0 0 12 ? * WED 表示每个星期三中午12点 <br />
            "0 0 12 * * ?" 每天中午12点触发 <br />
            "0 15 10 ? * *" 每天上午10:15触发 <br />
            "0 15 10 * * ?" 每天上午10:15触发 <br />
            "0 15 10 * * ? *" 每天上午10:15触发 <br />
            "0 15 10 * * ? 2005" 2005年的每天上午10:15触发 <br />
            "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 <br />
            "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 <br />
            "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 <br />
            "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 <br />
            "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 <br />
            "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 <br />
            "0 15 10 15 * ?" 每月15日上午10:15触发 <br />
            "0 15 10 L * ?" 每月最后一日的上午10:15触发 <br />
            "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 <br />
            "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 <br />
            "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 <br />
            &nbsp;--&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="cronExpression"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;0 48 14 * * ?&lt;/value&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            &lt;bean id="sfb" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="triggers"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="timeTrigger"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            &lt;/beans&gt; </span></span></div>
            <p align="left"><br />
            <span style="font-size: 10pt; color: #333333; font-family: 微软雅黑; background-color: #ffff99">在web.xml中配置监听器：<br />
            </p>
            <div style="border-right: medium none; border-top: medium none; font-size: 12pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left"><span style="color: #333333; font-family: 微软雅黑"><img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="font-size: 10pt">&lt;context-param&gt;<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contextConfigLocation<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/param-name&gt;<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/WEB-INF/TimerConfig.xml<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/param-value&gt;<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&lt;/context-param&gt;<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&lt;listener&gt;<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&lt;listener-class&gt;<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.web.context.ContextLoaderListener<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/listener-class&gt;<br style="font-family: " />
            <img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&lt;/listener&gt;</span></span></div>
            </span><span style="font-size: 10pt; color: #333333; font-family: 微软雅黑; background-color: #ffff99">
            <p align="left"><br />
            需调度的任务： </p>
            <div style="border-right: medium none; border-top: medium none; font-size: 12pt; float: left; border-left: medium none; width: 750px; border-bottom: medium none; background-color: #c0c0c0" align="left"><span style="color: #333333; font-family: 微软雅黑"><img style="font-family: " alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />
            <p style="font-size: 10pt"><span style="font-family: 微软雅黑">package net.timed;<br />
            import org.apache.log4j.Level;<br />
            import org.apache.log4j.Logger;<br />
            </span><span style="font-family: 微软雅黑"><span style="font-size: 10pt">public class MainTask {<br />
            &nbsp;&nbsp;&nbsp; public void execute()throws Throwable<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("do my job");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Logger.getLogger(this.getClass().getName()).log(Level.INFO,"doing scheduling!!!!");<br />
            &nbsp;&nbsp;&nbsp; }<br />
            }</span></span></p>
            </span></div>
            <span style="font-size: 10pt; color: #333333; font-family: 微软雅黑; background-color: #ffffff">
            <p align="left">基本上就搞定了，不过别忘了把所需的jar文件放在lib路径下：<br style="font-family: " />
            commons-collections.jar<br style="font-family: " />
            jta.jar<br />
            standard.jar<br style="font-family: " />
            quartz-all-1.6.0.jar<br style="font-family: " />
            spring-beans.jar<br style="font-family: " />
            spring-aop.jar<br style="font-family: " />
            spring-context.jar<br style="font-family: " />
            spring-core.jar<br style="font-family: " />
            spring-support.jar<br style="font-family: " />
            spring-web.jar<br style="font-family: " />
            spring-webmvc.jar<br style="font-family: " />
            祝你成功！呵呵<img style="font-family: " alt="" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/images/emteeth.gif" align="absMiddle" border="0" /></span></p>
            </span></td>
        </tr>
        <tr>
            <td>2008年10月29日10:43:51</td>
        </tr>
    </tbody>
</table>
</span></strong></p>
  <img src ="http://www.blogjava.net/ravollen/aggbug/122831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ravollen/" target="_blank">理想蜗牛</a> 2007-06-08 14:02 <a href="http://www.blogjava.net/ravollen/archive/2007/06/08/122831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>