ant building 报找不到com.sun.tools.javac.Main

今天,在eclipse2.1中用run ant运行ppig写的ant脚本编译学习日记文档时,发现通不过,报找不到com.sun.tools.javac.main;但不在eclipse2.1环境中在dos命令行窗口中执行能通过。最后,在windows->preferences->ant->Runtime->Classpath->Add Jars中,添加了jdk下面的\lib\tools.jar后,编译通过。原来com.sun.tools.javac.Main在这个tools.jar中。

(转帖)如何在Web工程中实现任务计划调度

转自:http://www.javaresearch.org/article/showarticle.jsp?column=2&thread=12337

 首页 » 研究文集 » J2EE综合   搜索标题相关文章      发表评论     开始监控     加入收藏夹 

如何在Web工程中实现任务计划调度

nbDeveloper 原创  (参与分:4690,专家分:120)   发表:2004-02-23 22:53   更新:2004-02-26 08:19   版本:1.0   阅读:4263次 

 

    好多朋友用过Windows的任务计划,也有不少程序迷自己曾写过时钟报警、系统自动关机等趣味程序,可却很少有朋友在Web工程中实现过类似功能。今天有空把笔者先前曾在Tomcat上实现的类似功能,搬出来与大家共享。

    早在几年前,我公司跟某市财政局合作项目开发,为加强财政局对所属单位财务状况的有效监管,开发、实施了财政局数据中心项目。此项目采用B/S加C/S混合结构模式。财政局Web服务器上架设数据同步接收装置,由市属单位每天下班前把财务信息通过HTTP协议上传至财政局中心服务器,与Web服务器上的接收装置对接。财政局内部各部门需要查阅大量财务信息,获取完备的市属单位当前财务状况信息,各部门按职能划分,需要准确的获取各部门各自所关注的汇总信息,以财政报表的形式提供。

    因财政数据量大,实时计算财政报表速度较慢,当初就考虑用报表缓存来减轻服务器的负担,但用缓存需要一个合理的缓存更新机制。考虑到各市属单位每天下班前才把财务数据上传,财政局每天所查看到的财务信息其实并不包括当天(除非有某位领导等到所属单位全部上传完之后才来查看信息,应该已经下班了),所以要是能实现任务计划调度,在每晚深夜把当天及历史财务信息汇总,更新缓存,速度瓶颈不就解决了吗。

    当时由于系统核心是基于Web部署的,报表计算引擎也相应的部署在Tomcat容器上,因此如果想要借用Windows的任务计划来实现定时计算,就需要额外编写普通桌面应用程序接口,稍显复杂。于是就琢磨着想在Web上实现,经过查阅较多相关资料,发现Java定时器(java.util.Timer)有定时触发计划任务的功能,通过配置定时器的间隔时间,在某一间隔时间段之后会自动有规律的调用预先所安排的计划任务(java.util.TimerTask)。另外,由于我们希望当Web工程启动时,定时器能自动开始计时,在整个Web工程的生命期里,定时器能在每晚深夜触发一次报表计算引擎。因此定时器的存放位置也值得考查,不能简单的存在于单个Servlet或JavaBean中,必须能让定时器宿主的存活期为整个Web工程生命期,在工程启动时能自动加载运行。结合这两点,跟Servlet上下文有关的侦听器就最合适不过了,通过在工程的配置文件中加以合理配置,会在工程启动时自动运行,并在整个工程生命期中处于监听状态。

    下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个接口函数,就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。

    我把ServletContextListener的实现类取名为ContextListener,在其内添加一个定时器,示例代码如下所示(为考虑篇幅,仅提供部分代码供读者参考):

    private java.util.Timer timer = null;

    public void contextInitialized(ServletContextEvent event) {

        timer = new java.util.Timer(true);

        event.getServletContext().log("定时器已启动");        

         timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000);

        event.getServletContext().log("已经添加任务调度表");

    }

    public void contextDestroyed(ServletContextEvent event) {

        timer.cancel();

        event.getServletContext().log("定时器销毁");

    }

    以上代码中, timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000)这一行为定时器调度语句,其中MyTask是自定义需要被调度的执行任务(在我的财政数据中心项目中就是报表计算引擎入口),从java.util.TimerTask继承,下面会重点讲述,第三个参数表示每小时(即60*60*1000毫秒)被触发一次,中间参数0表示无延迟。其它代码相当简单,不再详细说明。

   下面介绍MyTask的实现,上面的代码中看到了在构造MyTask时,传入了javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入,因此需要重载MyTask的构造函数(其父类java.util.TimerTask原构造函数是没有参数的)。在timer.schedule()的调度中,设置了每小时调度一次,因此如果想实现调度任务每24小时被执行一次,还需要判断一下时钟点,以常量C_SCHEDULE_HOUR表示(晚上12点,也即0点)。同时为防止24小时执行下来,任务还未执行完(当然,一般任务是没有这么长的),避免第二次又被调度以引起执行冲突,设置了当前是否正在执行的状态标志isRunning。示例代码如下所示:

    private static final int C_SCHEDULE_HOUR   = 0;

    private static boolean isRunning = false;

         private ServletContext context = null;

    public MyTask(ServletContext context) {

        this.context = context;

    }

    public void run() {

        Calendar cal = Calendar.getInstance();        

        if (!isRunning)  {           

            if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {            

                    isRunning = true;                

                context.log("开始执行指定任务");

                

                //TODO 添加自定义的详细任务,以下只是示例

                int i = 0;

                while (i++ < 10) {

                    context.log("已完成任务的" + i + "/" + 10);

                }

                isRunning = false;

                context.log("指定任务执行结束");               

            }            

        } else {

            context.log("上一次任务执行还未结束");

        }

    }

    上面代码中“//TODO……”之下四行是真正被调度执行的演示代码(在我的财政数据中心项目中就是报表计算过程),您可以换成自己希望执行的语句。

到这儿,ServletContextListener和MyTask的代码都已完整了。最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中加入如下三行:

    <listener>

        <listener-class>com.test.ContextListener</listener-class>

    </listener>

    当然,上面的com.test得换成您自己的包名了。保存web.xml文件后,把工程打包部署到Tomcat中即可。任务会在每晚12点至凌晨1点之间被执行,上面的代码会在Tomcat的日志文件中记录如下:

2003-12-05 0:21:39 开始执行指定任务

2003-12-05 0:21:39 已完成任务的1/10

    ……

2003-12-05 0:21:39 已完成任务的10/10

2003-12-05 0:21:39 指定任务执行结束

    以上代码在Tomcat 4.1.29以及Tomcat 5.0.16上调试通过。如果您需要完整代码,请通过nbDeveloper@hotmail.com与我联系。

 

 

 

(转帖)servlet 相关的Listener应用(内含web程序的定时器)

转自:http://www.mscenter.edu.cn/blog/wangpeng/archive/2005/05/07/2268.aspx

servlet 相关的Listener应用

ZhangLiHai.Com Blog

servlet 相关的Listener应用

 

张利海 于 2004年11月22日 23:27 发表 

关键词 : servlet listener timer 定时器

从作用域范围来说,Servlet的作用域有ServletContext,HttpSession,ServletRequest.

Context范围:

   

ServletContextListener:

对一个应用进行全局监听.随应用启动而启动,随应用消失而消失主要有两个方法:

contextDestroyed(ServletContextEvent event)

 在应用关闭的时候调用

contextInitialized(ServletContextEvent event)

在应用启动的时候调用

这个监听器主要用于一些随着应用启动而要完成的工作,也就是很多人说的我想在容器

启动的时候干..........

一般来说对"全局变量"初始化,如

public void contextInitialized(ServletContextEvent event){

    ServletContex sc = event.getServletContext();

    sc.setAttribute(name,value);

}

以后你就可以在任何servlet中getServletContext().getAttribute(name);

我最喜欢用它来做守护性工作,就是在contextInitialized(ServletContextEvent event)

方法中实现一个Timer,然后就让应用在每次启动的时候让这个Timer工作:

public void contextInitialized(ServletContextEvent event){

    timer = new Timer();

    timer.schedule(new TimerTask(){

        public void run(){

            //do any things

        }

    },0,时间间隔);

}

    有人说Timer只能规定从现在开始的多长时间后,每隔多久做一次事或在什么时间做

一次事,那我想在每月1号或每天12点做一项工作如何做呢?

你只要设一个间隔,然后每次判断一下当时是不是那个时间段就行了啊,比如每月一号做,那你

时间间隔设为天,即24小时一个循环,然后在run方法中判断当时日期new Date().getDate()==1

就行了啊.如果是每天的12点,那你时间间隔设为小时,然后在run中判断new Date().getHour()

==12,再做某事就行了.

ServletContextAttributeListener:

这个监听器主要监听ServletContex对象在setAttribute()和removeAttribute()的事件,注意

也就是一个"全局变量"在被Add(第一次set),replace(对已有的变量重新赋值)和remove的时候.

分别调用下面三个方法:

public void attributeAdded(ServletContextAttributeEvent scab)这个方法不仅可以知道

哪些全局变量被加进来,而且可获取容器在启动时自动设置了哪些context变量:

public void attributeAdded(ServletContextAttributeEvent scab){

    System.out.println(scab.getName());

}

  public void attributeRemoved(ServletContextAttributeEvent scab)

  public void attributeReplaced(ServletContextAttributeEvent scab)

 

 

Session范围:

HttpSessionListener:

这个监听器主要监听一个Session对象被生成和销毁时发生的事件.对应有两个方法:

  public void sessionCreated(HttpSessionEvent se)

  public void sessionDestroyed(HttpSessionEvent se)

  一般来说,一个session对象被create时,可以说明有一个新客端进入.可以用来粗略统计在线人

数,注意这不是精确的,因为这个客户端可能立即就关闭了,但sessionDestroyed方法却会按一定

的策略很久以后才会发生.

HttpSessionAttributeListener:

和ServletContextAttributeListener一样,它监听一个session对象的Attribut被Add(一个特定

名称的Attribute每一次被设置),replace(已有名称的Attribute的值被重设)和remove时的事件.

对就的有三个方法.

  public void attributeAdded(HttpSessionBindingEvent se)

  public void attributeRemoved(HttpSessionBindingEvent se)

  public void attributeReplaced(HttpSessionBindingEvent se)

  上面的几个监听器的方法,都是在监听应用逻辑中servlet逻辑中发生了什么事,一般的来说.

我们只要完成逻辑功能,比如session.setAttribute("aaa","111");我只要把一个名为aaa的变量

放在session中以便以后我能获取它,我并不关心当session.setAttribute("aaa","111");发生时

我还要干什么.(当然有些时候要利用的),但对于下面这个监听器,你应该好好发解一下:

HttpSessionBindingListener:

上面的监听器都是作为一个独立的Listener在容器中控制事件的.而HttpSessionBindingListener

对在一对象中监听该对象的状态,实现了该接口的对象如果被作为value被add到一个session中或从

session中remove,它就会知道自己已经作为一个session对象或已经从session删除,这对于一些非

纯JAVA对象,生命周期长于session的对象,以及其它需要释放资源或改变状态的对象非常重要.

比如:

session.setAttribute("abcd","1111");

以后session.removeAttribute("abcd");因为abcd是一个字符中,你从session中remove后,它就会

自动被垃圾回收器回收,而如果是一个connection:(只是举例,你千万不要加connection往session

中加入)

session.setAttribute("abcd",conn);

以后session.removeAttribute("abcd");这时这个conn被从session中remove了,你已经无法获取它

的句柄,所以你根本没法关闭它.而在没有remove之前你根本不知道什么时候要被remove,你又无法

close(),那么这个connection对象就死了.另外还有一些对象可以在被加入一个session时要锁定

还要被remove时要解锁,应因你在程序中无法判断什么时候被remove(),add还好操作,我可以先加锁

再add,但remove就后你就找不到它的句柄了,根本没法解锁,所以这些操作只能在对象自身中实现.

也就是在对象被add时或remove时通知对象自己回调相应的方法:

MyConn extends Connection implements HttpSessionBindingListener{

  public void valueBound(HttpSessionBindingEvent se){

    this.initXXX();

  }

  public void valueUnbound(HttpSessionBindingEvent se){

    this.close();

  }

}

session.setAttribute("aaa",new MyConn());

这时如果调用session.removeAttribute("aaa"),则触发valueUnbound方法,就会自动关闭自己.

而其它的需要改变状态的对象了是一样.

另外还有一个HttpSessionActivationListener监听器是实现分布式应用中session同步的.不作

多介绍,如果有要实现该功能的朋友可以和我联系.

在servlet2.4中,对于request范围已经实现对应的监听器:

ServletRequestListener,ServletRequestAttributeListener

但没有找到好的容器的支持所以没有做过多的测试.虽然从API可以掌握99%,但没有经过真正的

测试我是不会仅把API抄出来的.以后我会补齐这方面的内容

原作者:Axman

 

 

(转帖)一个实现MD5的简洁的java类

来自:http://www.javaresearch.org/article/showarticle.jsp?column=33&thread=10461

×××××××××××××××××××××××××××××××××××××××××××××××××××××

                         正文

一个实现MD5的简洁的java类

Jagie 原创  (参与分:100322,专家分:3090)   发表:2003-11-18 17:14   更新:2003-11-19 08:34   版本:1.0   阅读:6307次 

 

关键词:md5

由于消息摘要唯一性和不可逆性的特点,所以不失为一种简单的常用的加密手段,比如你可以用md5来加密你的应用中的用户口令。

package test;

import java.security.MessageDigest;

/**

 * <p>Title: </p>

 * <p>Description: </p>

 * <p>Copyright: Copyright (c) 2003</p>

 * <p>Company: </p>

 * @author unascribed

 * @version 1.0

 */

public class StringUtil {

  private final static String[] hexDigits = {

      "0", "1", "2", "3", "4", "5", "6", "7",

      "8", "9", "a", "b", "c", "d", "e", "f"};

  /**

   * 转换字节数组为16进制字串

   * @param b 字节数组

   * @return 16进制字串

   */

  public static String byteArrayToHexString(byte[] b) {

    StringBuffer resultSb = new StringBuffer();

    for (int i = 0; i < b.length; i++) {

      resultSb.append(byteToHexString(b[i]));

    }

    return resultSb.toString();

  }

  private static String byteToHexString(byte b) {

    int n = b;

    if (n < 0)

      n = 256 + n;

    int d1 = n / 16;

    int d2 = n % 16;

    return hexDigits[d1] + hexDigits[d2];

  }

  public static String MD5Encode(String origin) {

    String resultString = null;

    try {

      resultString=new String(origin);

      MessageDigest md = MessageDigest.getInstance("MD5");

      resultString=byteArrayToHexString(md.digest(resultString.getBytes()));

    }

    catch (Exception ex) {

    }

    return resultString;

  }

  public static void main(String[] args){

    System.err.println(MD5Encode("a"));

  }

}

在RFC 1321中,给出了Test suite用来检验你的实现是否正确:

MD5 ("") = d41d8cd98f00b204e9800998ecf8427e

MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661

MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72

MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0

MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b

参考资料:《java security handbook》 jamie jaworski

版权声明   给作者写信  本篇文章对您是否有帮助?  投票: 是    否     投票结果:     24       1

 

 

 

作者其它文章:

在MIDP2.0中操作图片像素

用MMAPI拍照

如何在Swing中实现文件路径选择的TableCellEditor

MIDP中一个简单的折行文本绘制办法

在MIDP1.0下实现图片翻转

作者全部文章 

 

 

  评论人:yipsilon    参与分: 15609    专家分: 290    来自: Dalian

 发表时间: 2003-11-20 19:29 

使用这种方式的前提是必需有JCE支持。如果在J2SDK 1.3中,则必需下载额外的jce包。 

 

  评论人:Jagie    参与分: 100322    专家分: 3090    来自: 北京

 发表时间: 2003-11-21 11:11 

java.security.MessageDigest是jdk自带的,无需使用javax.crypto包,所以无需下载jce.

至少我在运行这个例子的时候就没有下载jce

 

 

  评论人:rower    参与分: 167    专家分: 0  发表时间: 2004-04-10 17:10 

实际测试,在J2SDK 1.3中无需下载额外的jce包,运行良好。 

 

  评论人:huangyafei    参与分: 80    专家分: 0  发表时间: 2005-03-06 13:41 

怎么我在运行上面的程序的时候出错了:出错信息为:

D:\works\java\MD5Encode.java:12: class StringUtil is public, should be declared in a file named StringUtil.java

public class StringUtil {

       ^

1 error

 

 

  评论人:yifenggege    参与分: 259    专家分: 70  发表时间: 2005-07-13 14:12 

好! 

 

  评论人:keli    参与分: 34262    专家分: 1320  发表时间: 2005-11-16 17:24 

加密是可以的,但是解密就难了。呵呵。

我看第5个答复想笑,哈哈哈哈。 

 

  评论人:gui_jq    参与分: 73813    专家分: 1070    来自: 广州天河

 发表时间: 2005-12-01 18:28 

写得不错,我最近要写个radius协议分析的工具想用java来编写,所以第一得弄java下面的MD5实现,没有想到如此简单,jdk原来就带有了,最坏的打算我还想用c的代码改一个呢。呵呵。在这里我补充一下:

1,MD5本来就是不可逆的,加密只是保证在网络传输中内容不被修改,可以通过md5来检查,防止有人修改包内容进行模仿发包,所以服务端在受到包写更加对方的算法来md5一次然后在处理包内容,如果不通过则直接丢弃包。另外就是用来验证下载的重要文件是否正确和完整。

2,程序中的打印16进制方法有点欠妥,在c里面可以通过printf("%02x",buf[])就可以,但是java对byte的处理没有这个。所以我推荐下面的方法:

private static String dumpBytes(byte[] bytes) {

    int i;

    StringBuffer sb = new StringBuffer();

    for (i = 0; i < bytes.length; i++) {

      if (i % 32 == 0 && i != 0) {

        sb.append("\n");

      }

      String s = Integer.toHexString(bytes[i]);

      if (s.length() < 2) {

        s = "0" + s;

      }

      if (s.length() > 2) {

        s = s.substring(s.length() - 2);

      }

      sb.append(s);

    }

    return sb.toString();

  }

这个更加灵活高效。

补充结束。谢谢大家。呵呵。 

 

 

always confused with double-writting the end char of a verb

  I always forget the usage of double-writting the end char of verb in several situations.Like below:

  1.ResetPsdDater:Check If The Resetting Password Record Existed

  2.System:Check  The Validity Of New Inputed Password

  3.User Had Reseted Password Or Date Expired

  4. [Canceled]

  5.EmailSender:Sending Email

  inputed(inputted?),resetting(reseting?),reseted(resetted?),canceled(cancelled?),sending(sendding?)

  1.input:(past participle:)see:http://www.usingenglish.com/glossary/past-participle.html

(NOTE:The Past Participle may also be used as an adjective)['input],so it is like this:

  The Validity Of New Inputed Password

  2.reset:[re'set]resetting

  3.reset:resetted

  4.send:end with double consonant,so it is:sending

  5.cancel?This is a question be left.see:http://www.yuloo.com/wyks/wy-cet/cet-ksch/2005-02/1107584703.html

 51.All flights_____because of the snowstorm,many passengers could do nothing but take the train。 A)had been canceled B)have been canceled C)were canceled D)having been canceled 该题考查独立主格结构。“撤销航班”的英文为cancel flights,故分句中应采用被动式,同时cancel这一动作发生在主句谓语动词could do...的动作之前,由此判定空格中应填入分词的完成被动式,即选项D。

cancelled:adj.[法律]废除的

 

 I can learn some things from below content:

  1.动词的现在分词:以重读闭音节结尾的多音节词,而末尾只有一辅音字母时,这个辅音字母须双写,然后再加 ing。

arrive- arriving  get- getting

闭音节的单音节词,或以重读闭音节结尾的多音节词,这些词的末尾只有一个辅音字母时,双写这个辅音字母,再加 -ing.

                     

  sitting running getting cutting stopping beginning planning permitting

  2.一般过去式构成:以一个辅音字母结尾的重读闭音节动词,双写词尾辅音字母,再加 -ed。

                     

  stopped begged fretted dragged dropped planned dotted dripped

  3.过去分词的构成方法如下 :

闭音节的单音节词,或以重读闭音节结尾的多音节词,这些词的末尾只有一个辅音字母时,双写这个辅音字母,再加 -ed。

                     

  stopped regretted dropped

Here is an article come from:(http://www.cnread.net/cnread1/yyxx/yyyf/002.htm)

动  词

--------------------------------------------------------------------------------

                     

  动 词 的 定 义:

                     

  动词是表示动作或状态的词。 例如: work,工作 , study,学习,eat 吃。

                     

  动词的分类:动词有两种分类方法。

                     

  1) 限定动词和非限定动词。

                     

  限定动词在句中作谓语,有人称和数的变化。非限定动词有动词不定式,动名词和分词三种。在句中不能单独作谓语,没有人称和数的变化。

                     

  2)实义动词,连系动词,情态动词和助动词。

                     

  实义动词有完整的词义,并能单独作谓语,实义动词又可分为及物动词和不及物动词。例如:

                     

  study 学习, reach 到达, see 看见, rise 升起。

                     

  连系动词在句中作谓语动词,后面跟表语。连系动词有 be, seem, look, become, get, grow, feel, appear, remain, turn。

                     

  情态动词表示能力,义务,必要,猜测等说话人的语气或情态。情态动词只能和动词原形一起构成谓语动词。情态动词有 can, will, have, be, should, do, would, 等。

                     

  助动词只能和主要动词一起构成各种时态,语态和语气等动词形式。

                     

  do, shall, will, have, has.

                     

  动词的基本形式。

                     

  英语动词有四种基本形式:动词原形,过去式,过去分词和现在分词。这四种动词形式和助动词一起构成动词的时态,语态和语气。

                     

  动词的原形。就是词典中所给的形式。例如:be, have, buy, sit.

                     

  动词过去式和过去分词的构成有规则的和不规则的两种形式。规则动词的过去式和过去分词,由在原形动词的后面加词尾 -ed 构成。

                     

  work - worked - worked

                     

  不规则动词的过去式和过去分词的形式是不规则的,须要一一记忆。

                     

  go - went - gone   do - did - done

                     

  动词的现在分词由动词原形加 -ing 构成。构成方法如下:

                     

  1)一般情况在动词原形后加 -ing 。

                     

  go---going stand---standing

                     

  2)以不发音的 e 结尾的动词,去掉 e ,再加 -ing. 动词是闭音节的单音节词,或是以重读闭音节结尾的多音节词,而末尾只有一辅音字母时,这个辅音字母须双写,然后再加 ing。

                     

  arrive- arriving  get- getting

                     

  3)少数几个以 -ie 结尾的动词,须将 ie 变成 y ,再加 ing.例如: die--dying lie--lying。

                     

  动词的时态

                     

  英语动词的时态是一种动词的形式。 不同的动词时态用以表示不同的时间和方式。共有十六种时态。

                     

  一般现在时:

                     

  一般现在时表示经常发生的习惯性的动作或目前所处的状态。

                     

  We go to school every day.

                     

  我们每天去学校。

                     

  The students study very hard.

                     

  学生们学习很努力。

                     

  She has a dictionary.

                     

  她有一本词典。

                     

  在一般现在时句中,如果主语是第三人称时,动词要进行变化,变化规则如下:

                     

  1) 一般情况下,动词后面直接加 -s. 例如:

                     

  works gets says reads

                     

  2) 以ch,sh,s,x 或 o 结尾的动词,在后面加 -es。 例如:

                     

  goes teaches washes

                     

  3) 以辅音字母 + y结尾的动词,把 y变为 i 再加 -es. 例如:

                     

  studies tries carries

                     

  动词 have 遇有主语是第三人称单数时,have 改为 has。 例如:

                     

  He has an interesting book.

                     

  他有一本有趣的书。

                     

  Our classroom has two doors.

                     

  我们的教室有两个门。

                     

  动词 be 遇有主语是第一人称单数时,be 改为 am 遇有主语是第二人称时,be 改为 are, 遇有主语是第三人称单数时,be 改为 is.

                     

  I'm a student and he is a student, too.

                     

  我是一个学生 ,他也是一个学生。

                     

  We are all students.

                     

  我们都是学生。

                     

  一般现在时的具体用法:

                     

  1) 表示现在,目前存在的状态,性质或经常发生的动作或习惯。一般现在时常用下列副词或短语来作时间状语:

                     

  often, usually, always, sometimes , seldom, every day(week, year, night), twice a month

                     

  I often visit my teachers.

                     

  我经常看望我的老师。

                     

  They do morning exercises every day.

                     

  他们每天做早操。

                     

  2) 某些动词如 come, go, move, stop, leave, arrive, be, finish, continue,start 等,在一般现在时句中可用来表示将来肯定会发生的动作。

                     

  The train comes at 3 o'clock.

                     

  火车三点钟到。

                     

  Tomorrow is Sunday.

                     

  明天是星期天。

                     

  3) 在时间状语从句或条件状语从句中,一般现在时代替一般将来时。

                     

  I'll help you as soon as you have problem.

                     

  只要你有困难我就会帮助你。

                     

  Tell Xiao Li about it if you meet him.

                     

  如果你碰见小李,告诉他这件事情。

                     

  4) 一般现在时还可用在戏剧, 电影的剧本解说,体育比赛的解说以及图片的说明等场合。

                     

  Tom carries the ball to the left.

                     

  汤姆把球带到左方。

                     

  The picture shows us how they built the

                     

  motorway last year.

                     

  这张照片给我们展示了他们去年如何建设高速公路。

                     

  一般过去式 表示过去的动作和状态。

                     

  I met him yesterday. 昨天我碰见了他。

                     

  一般过去式构成: 表示一般过去式的动词通常用动词的过去式形式来表示,而动词的过去式是在动词原形的基础上变化的。动词的过去式可分为规则动词和不规则动词。规则动词的过去式变化如下:

                     

  一般情况下,动词词尾加 -ed 。

                     

  worked played wanted acted

                     

  以不发音的 -e 结尾动词,动词词尾加 -d。

                     

  lived moved decided declined hoped judged raised wiped

                     

  以辅音字母 + y结尾的动词,把-y变为-i 再加-ed。

                     

  studied tried copied justified cried carried embodied emptied

                     

  以一个辅音字母结尾的重读闭音节动词,双写词尾辅音字母,再加 -ed。

                     

  stopped begged fretted dragged dropped planned dotted dripped

                     

  不规则动词的过去式变化规律性不强,须多加记忆。

                     

  go - went make - made get - got

                     

  buy - bought come - came fly-flew

                     

  一般过去式的用法:

                     

  1) 表示过去某一时刻或某一段时间内所发生的动作或情况,通常一般过去式带有表示动作时间状语的词,词组或从句,如 yesterday, the day before last, last week, two days ago 等,上下文清楚时可以不带时间状语。

                     

  I worked in that factory last year.

                     

  去年我在那一家工厂工作。

                     

  I went to the Tian Long Mountain yesterday.

                     

  昨天我们去了天龙山。

                     

  一般将来时 表示将来的动作或装态。

                     

  一般将来时的构成: shall (will) + 动词原形. 助动词 shall用于主语是第一人称时,will 用于主语是第三人称时。

                     

  I shall attend the meeting tomorrow.

                     

  我明天要参加会议。

                     

  The workers will build a school here next year.

                     

  工人们明年将在这儿盖一所学校。

                     

  一般将来时的否定形式是在 shall 或 will 后面加 not 构成,即: shall not + 动词原形。 will not + 动词原形。 shall not和 will not可以分别缩写为shan't 和 won't.

                     

  I shall not go to the Yingze Park next time.

                     

  下一次我不去迎泽公园了。

                     

  He won't come back this week.

                     

  这一周他不回来了。

                     

  will用在第一人称时,表示将来的意愿,决心,许诺, 命令等。

                     

  I will do my best to catch up with them.

                     

  我要尽力赶上他们 。

                     

  其他表示将来的句型:

                     

  (1)be + going + 动词不定式。也是一种将来时句型,表示打算,计划,最近或将来要作的某事。

                     

  I am going to Beijing next week.

                     

  下周我要去北京。

                     

  (2)be + 动词不定式。表示有职责,义务,可能,约定,意图等。

                     

  There is to be a meeting this afternoon.

                     

  今天下午有个会。

                     

  We are to meet the guests at the station.

                     

  我们要去车站接人。

                     

  (3) be about + 动词不定式,表示马上,很快作某事。

                     

  They are about to leave.

                     

  他们就要离开。

                     

  一般完成时 一般完成时表示动作发生在过去,但与现在有关系,说明这个动作在现在的结果,例如:

                     

  I have been here for two hours.

                     

  我来这儿已有两个小时了。

                     

  She has not said anything about it.

                     

  她对这件事情什么也没有说。

                     

  一般完成时的构成 have (has) + 过去分词, has 用于主语是单数第三人称,其它用 have。

                     

  I have worked for ten hours today.

                     

  今天我工作了十个小时。

                     

  He has found his pen.

                     

  他找到了他的钢笔了。

                     

  过去分词的构成方法如下 :

                     

  一般情况下,直接在动词原形后面加 -ed。

                     

  worked spelled linked

                     

  answered obeyed wanted

                     

  以不发音的 -e 结尾的动词只加 -d。

                     

  moved hoped divided

                     

  闭音节的单音节词,或以重读闭音节结尾的多音节词,这些词的末尾只有一个辅音字母时,双写这个辅音字母,再加 -ed。

                     

  stopped regretted dropped

                     

  一般完成时的用法:

                     

  1) 一般完成时表示在说话之前已经完成或刚完成的动作。

                     

  He has gone away.

                     

  他已经走了。

                     

  I have bought a ten-speed bicycle.

                     

  我买了一辆十速自行车。

                     

  They have cleaned the classroom.

                     

  他们打扫了教室。

                     

  2) 一般完成时表示动作从过去开始持续到现在,或者还有可能持续下去的动作或状态。 一般完成时常与for 和 since 引导的短语或从句连用。

                     

  We have lived here since 1976.

                     

  从一九七六以来,我们就住在这儿。

                     

  They have waited for more than two hours.

                     

  他们等了两个多小时。

                     

  一般进行时:

                     

  一般进行时表示现在正在进行的动作。

                     

  We are working now.

                     

  我们正在工作。

                     

  一般进行时的构成: be + 现在分词。

                     

  It's raining hard. 雨下的很大。

                     

  Are you studying now? 你在学习吗?

                     

  They are watching TV. 他们在看电视。

                     

  现在分词的构成方法如下 :

                     

  一般情况下,直接在动词原形后面加 -ing.

                     

  going asking finding working being seeing printing raining standing studying speaking spelling

                     

  以不发音的-e 结尾的动词,去-e ,再加-ing。

                     

  coming taking firing encircling writing becoming breathing leaving

                     

  闭音节的单音节词,或以重读闭音节结尾的多音节词,这些词的末尾只有一个辅音字母时,双写这个辅音字母,再加 -ing.

                     

  sitting running getting cutting stopping beginning planning permitting

                     

  一般进行时的用法:

                     

  1) 一般进行时的用法表示说话者说话时正在发生或者进行的动作, 它注重现在正在进行的动作,而不管动作从什么时间开始,到什么时间结束。

                     

  What are you doing now?

                     

  你在干什么呢?

                     

  I am looking for my key.

                     

  我在找我的钥匙。

                     

  The workers are building a big library.

                     

  工人们正在建一座大型图书馆。

                     

  2) 一般进行时表示目前一段时间内正在进行的动作,也许此时此刻这个动作并没有进行。

                     

  The students are preparing for the examination.

                     

  学生们正在作考试准备。

                     

  3) 某些动词的现在进行时可以表示即将发生的动作,这些动词有 arrive, come, leave, start等。

                     

  They are going to Hong Kong tomorrow.

                     

  他们明天要去香港。

                     

  I am coming. 我就来。

                     

  过去完成时:

                     

  过去完成时表示过去某一时刻或某一动作之前完成的动作或所处的状态,过去完成时常和 by , before 等词组成的短语和从句连用。

                     

  过去完成时的构成: had + 过去分词

                     

  We had already learned two thousands words by the end of last year.

                     

  到去年年底我们已经学了2000个单词。

                     

  When we arrived at the station, they had waited for more than twenty minutes.

                     

  我们到达车站的时候,他们已经等了二十多分钟。

                     

  将来完成时:

                     

  将来完成时表示将来某一时刻或某一时刻之前完成的动作或所处的状态。

                     

  将来完成时的构成:

                     

  shall (will) + have + 过去分词

                     

  After we finish this text, we'll have learned twenty texts.

                     

  这课课文结束后,我们就学了二十课课文了。

                     

  By the next month, I'll have finished my task.

                     

  到下个月,我将完成任务。

                     

  过去进行时:

                     

  过去进行时 表示过去某一时刻或某一段时间内正在进行的动作,过去进行时常和表示过去时的时间状语词组或从句连用。

                     

  过去进行时的构成:

                     

  were (was) + 动词现在分词

                     

  He was reading last night.

                     

  昨天晚上他正在看书。

                     

  I was watching TV when she came to see me.

                     

  她来看我的时候,我正在看电视。

                     

  The students were reading loudly when I came into the classroom.

                     

  我进教室的时候,学生们正在大声地读课文 。

                     

  将来进行时

                     

  将来进行时表示将来某一段时间正在进行的动作或有可能发生或预计要发生的动作。

                     

  将来进行时的构成:

                     

  shall (will) + be + 现在分词

                     

  What will you be doing next week?

                     

  下一星期你在干什么?

                     

  I shall be typing in my office.

                     

  我将在我的办公室打字。

                    

(转帖)webwork并入struts团队了!

对学习Struts的朋友是一个利好的消息,正文如下:

webwork并入struts团队了!

来源:http://www.javaeye.com/viewtopic.php?t=17242&postdays=0&postorder=asc&start   发表时间:2005-11-29 09:29 

 

WebWork joining Struts

Yes, it's true. The WebWork development team (Jason and I) have been working with the Struts development team (Don Brown and Ted Husted) and have come to the conclusion that the best thing for Java community would be to merge WebWork in to Struts.

Read Ted's email here, but the gist of it is this: WebWork is a great technology, and Struts is a great community. It's a perfect match and bringing the two together will only be better for WebWork and Struts users alike. The only down side for me is that I'll be working less with OpenSymphony, but I believe that is a small price for all the great benefits that come from this merger.

Just to be clear, WebWork is not going away. WebWork 2.2 is still coming out any day now, and there may even be a WebWork 2.3. But new minor/major versions won't be coming out under the WebWork name for much longer. Instead, they will be released under the Struts incubator program with the intent to eventually become Struts Action Framework 2.0.

So don't worry, WebWork 2.1.8, 2.2.1, and other bug fix releases will continue to come out and we will support the WebWork community as long as needed. In addition, we'll make compatibility with both Struts and WebWork a high priority, so future releases may help with that. To be clear: no one is leaving WebWork and it will continue to be supported for a very long time.

With this renewed energy, larger development team, and larger community, the combined efforts of Struts and WebWork will surely make the Struts platform the easiest, fastest, and most powerful Java web framework available. We hope that all the WebWork users and developers are as excited about this as we are and are ready to take WebWork to the next level

原文:http://www.opensymphony.com/webwork/

 

阅读:321次  〔lanxing〕 

版权声明 

 

评论人:lanxing    参与分: 6527  专家分: 181  发表时间: 2005-11-29 09:42     评论 

 

一下文字来自javaeye的管理员 robbin

==========================================================

看到了这个消息以后感觉非常吃惊,所以跟踪相关的link仔细阅读了一下相关的网页,看完以后我认为对于webwork和struts来说这都是一个重大利好的消息。从整个事件来看,并不是单纯的webwork开发团队合并struts团队这么简单,事实上struts1.3和webwork2.2仍然按照原定roadmap继续发展,而两个团队核心开发人员发起一个新的项目Struts Ti,它的readmap是:

引用:

* Ti phase 1 = WebWork 2.2 + Struts 1.x compatibility library and migration tools

* Ti phase 2 = phase 1 + Commons Chain integration + Beehive's Page Flow + simplified annotations + quick development mode

从这个roadmap可以看出来,新项目Struts Ti是以webwork的整体架构为基础,辅以Struts的一些库,并且该项目的四个发起人联名的声明中这样说:

引用:

As some of you know, the underlying idea behind Ti was to use WebWork as the core of Struts Action Framework 2.x. Conceptually, WebWork and Struts 1.x are very similar. We've often said, without embarrassment, that WebWork does many things better than Struts 1.x. Meanwhile, WebWork has the ability to provide a layer of almost full backwards-compatibility for Struts 1.x, and we have already demonstrated we can integrate Beehive's (very cool) Page Flow with WebWork.

这段话明白无误的指明新框架是以webwork为core的,并且webwork可以提供一个抽象层,以完全向后兼容Struts1.x,并且struts还可以集成Apache Beehive的Page Flow。

因此,我想那些担心webwork从此消失的人可以打消顾虑了,消失的只是webwork这个名字,和com.opensymphony的package前缀,而webwork的程序架构却不会消失。

对于Struts的使用者来说,Struts虽然拥有一个庞大的使用群体,但是Struts在技术上已经非常落伍,再不进行重大的架构革新,势必要被淘汰。因此,这个事情是Struts开发团队的一次自救的革命,从Struts1.3到Struts Ti的改变如同EJB2到EJB3的改变,旧的Struts1.3的架构被完全抛弃,吸收了更加先进的开源软件和架构之后,推出的新东西。

对于Webwork的使用者来说,获得了更加广泛的用户群体和接受度。并且核心开发团队也得到了壮大,相信未来的新版本推出速度可以更快了,而不是现在这样,对webwork2.2都望穿秋水了。

另外非常值得注意的是,Struts Ti的目标可不止集成Webwork这么简单,看看它的phase 2,集成Beehive的Page Flow,JDK1.5的annotations,目标是Ruby on Rails般的快速开发模式,多么诱人的前景!

============================================================

 

 

 

JAVA开发者应该去的20个英文网站-转贴

JAVA开发者应该去的20个英文网站-转贴  发表时间: 2005-05-16 17:52  

 

[http://www.javaalmanac.com] - Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处.

[http://www.onjava.com] - O'Reilly的Java网站. 每周都有新文章.

[http://java.sun.com] - 官方的Java开发者网站 - 每周都有新文章发表.

[http://www.developer.com/java] - 由Gamelan.com 维护的Java技术文章网站.

[http://www.java.net] - Sun公司维护的一个Java社区网站.

[http://www.builder.com] - Cnet的Builder.com网站 - 所有的技术文章, 以Java为主.

[http://www.ibm.com/developerworks/java] - IBM的Developerworks技术网站; 这是其中的Java技术主页.

[http://www.javaworld.com] - 最早的一个Java站点. 每周更新Java技术文章.

[http://www.devx.com/java] - DevX维护的一个Java技术文章网站.

[http://www.fawcette.com/javapro] - JavaPro在线杂志网站.

[http://www.sys-con.com/java] - Java Developers Journal的在线杂志网站.

[http://www.javadesktop.org] - 位于Java.net的一个Java桌面技术社区网站.

[http://www.theserverside.com] - 这是一个讨论所有Java服务器端技术的网站.

[http://www.jars.com] - 提供Java评论服务. 包括各种framework和应用程序.

[http://www.jguru.com] - 一个非常棒的采用Q&A形式的Java技术资源社区.

[http://www.javaranch.com] - 一个论坛,得到Java问题答案的地方,初学者的好去处。

[http://www.ibiblio.org/javafaq/javafaq.html] - comp.lang.java的FAQ站点 - 收集了来自comp.lang.java新闻组的问题和答案的分类目录.

http://java.sun.com/docs/books/tutorial/] - 来自SUN公司的官方Java指南 - 对于了解几乎所有的java技术特性非常有帮助.

http://www.javablogs.com] - 互联网上最活跃的一个Java Blog网站.

http://java.about.com/] - 来自About.com的Java新闻和技术文章网站.

 

温度计摔坏后的正确处理方法

  今天,给孩子量体温前,用力的把里面的水银柱往下甩,不小心碰在拉链上,碎了。水银洒在地上成了小点。孩子正在床上睡觉。我想一点点水银可能没事,就没管。

  跟着,我就听人说,容易引起小孩汞中毒。

  正确的方法是:把水银收集起来,放在水里,再密封。说是在电视上看的。

  我赶紧把小孩带出房间,敞开房门,请母亲把房间里的水银扫出去了。因为已经碎成了小点,像电视上说的那样做是不可能的了。

  我又买了一支体温计,这支比较容易把水银柱甩下去。

  所以,大家在买体温计要试验一下,看容不容易把水银柱甩下去,不然,到时用的话很急人的。

(转帖)[译]Struts Menu开发向导

  哈,网络真是一个好东东,早就想在我们站使用菜单技术,可是我对此不熟悉,这里又有一个现存的东西可以拿来用了。

  转自:http://kb.csdn.net/java/Articles/200511/3af84c4b-0aba-47ad-9060-58f81c7592ab.html

  正文:

   您的位置:CSDN 首页 -> 知识库 -> 文章摘要

[译]Struts Menu开发向导

作者: ∣来源:BlogJava∣原文地址∣2005-11-28

 官方英文版向导(http://struts-menu.sourceforge.net/userguide.html)

一、从1.X升级到2.X需要做以下事情:

1、改变你的taglib声明中的URI。

 <% at taglib uri="http://struts-menu.sf.net/tag" prefix="menu" %>

2、改变<plug-in>,使用新的包名"net.sf.navigator." 。

 <plug-in className="net.sf.navigator.menu.MenuPlugIn">

3、改变你的menu-config.xml文件,使用新的包名"net.sf.navigator." 。

 <Displayer name="Simple"

   type="net.sf.navigator.displayer.SimpleMenuDisplayer"/>

二、快速开始:

1、下载最新的struts-menu版本;

2、解包到本地目录;

3、下载Tomcat或者其它Servlet容器;

4、把struts-menu.war包放入Tomcat安装目录的wabapps目录下,并重启Tomcat服务。

5、打开htpp://localhost:8080/struts-menu/

三、把Struts Menu整合到你的应用程序中:

Struts Menu能够被轻易的整合到你的Struts应用程序中,它也可以整合到一个非Struts的应用程序中,但是我不喜欢这样做,所以在此没有提供相应的教程。这里将一步步的带你整合这个标签库。

你需要把struts-menu.jar放到你的WEB-INF/lib目录下。然后使用URI标签声明你的JSP文件中想使用的这个标签库。

如果使用Struts Menu 2.1,你还需要 Jakarta's Standard Tag Library JAR包放入你的WEB-INF/lib目录下。下载地址:http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar,这个文件包括例程WAR包文件和二进制发布包。

1、放入struts-menu.jar包到你的应用程序的WEB-INF/lib目录中。

2、在你的struts-config.xml文件中加入plug-in设置。

 <plug-in className="net.sf.navigator.menu.MenuPlugIn">

   <set-property property="menuConfig"

     value="/WEB-INF/menu-config.xml"/>

 </plug-in>

3、你将需要在你的应用程序的/WEB-INF/menu-config.xml文件中定义你的菜单,这里提供一个简单的片断:

 <Menu name="contactMenu" title="Contact" location="?Contact">

   <Item name="email" title="E-Mail" location="?EMail"/>

   <Item name="phone" title="Phone" location="?Phone"/>

 </Menu>

  更多全面的例程,请查看应用程序的web/WEB-INF目录中的menu-config.xml文件,你可以截取一段作为你需要的菜单。完整的属性列表,可以查看MenuBase class's javadocs(http://struts-menu.source......avigator/menu/MenuBase.html)。

4、在你的JSP文件的顶部加入taglib声明:

 <% at taglib uri="http://struts-menu.sf.net/tag" prefix="menu" %>

5、在你的JSP文件中要放置菜单的位置加入taglib代码:

 <menu:useMenuDisplayer name="TabbedMenu"

   bundle="org.apache.struts.action.MESSAGE">

   <menu:displayMenu name="Home"/>

   <menu:displayMenu name="About"/>

 </menu:useMenuDisplayer>

  属性name="TabbedMenu"被定义在menu-config.xml文件的顶部:

 <Displayer name="TabbedMenu"

   type="net.sf.navigator.displayer.TabbedMenuDisplayer"/>

(译注:其实到此步即可在你的JSP文件中添加相应的菜单了,只不过是没有结合Velocity。在menu-config.xml文件的头部可以定义多个Displayer,每个Displayer都有name和type属性,name属性与JSP文件中menu:useMenuDisplayer标签的name属性相对应,即表明使用何种样式,具体的样式定义便在type属性中定义,type属性中是一个class。在menu-config.xml文件中的菜单定义中的name属性则与JSP文件中的menu:displayMenu标签的name属性相对应。)

使用定制的Velocity模版实施你的菜单,你需要整合Velocity到你的WEB应用程序中。如果需要这样做的话,请完成下面的步骤:

1、确定你的menu-config.xml文件有“Velocity”的displayer定义:

 <Displayer name="Velocity"

     type="net.sf.navigator.displayer.VelocityMenuDisplayer"/>

2、加入Velocity的JARs包到你的WEB-INF/lib目录中,下载velocity-1.4-rc1.jar(http://www.ibiblio.org/ma......y/jars/velocity-1.4-rc1.jar)和velocity-tools-view-1.0.jar(http://www.ibiblio.org/ma......velocity-tools-view-1.0.jar)。

3、加入globalMacros.vm(http://cvs.sourceforge.net/viewcvs.py/*checkout*/struts-menu/navigator/web/WEB-INF/classes/globalMacros.vm?content-type=text%2Fplain&rev=1.1(右键另存为))到你的WEB-INF/lib目录中。

4、改变你的JSP文件中displayer的值为“Velocity”,“config”属性指向一个文件(如config="/templates/tabs.html")或者如果tabs.htm在你的WEB-INF/classes目录中的话,则可设config="tabs.html"。

这里提供了一些使用Velocity的displayer例子,可在sample application(http://demo.raibledesigns.com/struts-menu/index.jsp)中查看。它总是在你的菜单需要的时候显示CSS,JavaScript和图像文件。下面有一些在当前的Struts Menu中用到的Velocity模版的例子的链接:

 CoolMenus: Demo(http://demo.raibledesigns......menu/velocity-coolmenu4.jsp),

    Template(http://struts-menu.sourceforge.net/templates/coolmenus.html)

 NiceTabs: Demo, Template

 Tabs: Demo, Template

 XTree: Demo, Template

所有相关的有用的文件如果你需要的话都可以在下面的站点上下载:

 Images (http://struts-menu.sourceforge.net/menu-images/)

 Stylesheets (http://struts-menu.sourceforge.net/styles/)

 Scripts (http://struts-menu.sourceforge.net/scripts/)

 Templates (http://struts-menu.sourceforge.net/templates/)

更多的基于roles的显示/隐藏菜单的信息,请查看FAQs(http://struts-menu.sourceforge.net/faq.html)。

四、在Struts之外使用Struts Menu:

在2.2版中,Menu Repository能够使用MenuContextListener载入:

 <!--

    - Loads the menu-config.xml for struts-menu at startup,

    - by default from "/WEB-INF/menu-config.xml".

    - To override this, add a context-param named "menuConfigLocation"

    - web.xml file.

    -->

 <listener>

     <listener-class>net.sf.navigator.menu.MenuContextListener</listener-class>

 </listener>

或者如果你使用Spring,甚至更容易。仅仅需要加入下面的部分到你的applicationContext.xml文件中:

 <bean id="menu" class="net.sf.navigator.menu.MenuLoader">

   <property name="menuConfig">

     <value>/WEB-INF/menu-config.xml</value>

   </property>

 </bean>

 <!-- The menuConfig property is an optional attribute.  It is set to

     /WEB-INF/menu-config.xml by default. -->

感谢Dan Luputan提供MenuLoader类的源代码。

五、从源文件编译:

要从源文件编译这个项目,执行下面的步骤:

1、下载并安装Maven(http://maven.apache.org/);

2、创建一个环境变量MAVEN_HOME指出你的Maven的安装目录,然后添加$MAVEN_HOME/bin到你的PATH变量中;

3、操纵这个目录你可以扩展源代码,执行“maven.jar”创建target/struts-menu.jar。

要展开struts-menu例程,需要下面的步骤:

1、下载和安装Tomcat;

2、创建一个环境变量CATALINA_HOME指出你的Tomcat的安装目录;

3、执行“maven deploy”把应用程序展开到Tomcat中;

4、打开http://localhost:8080/struts-menu在你喜爱的浏览器中。

如果你喜欢使用Eclipse开发项目,请参考此份开发向导(http://struts-menu.sourceforge.net/devguide.html)。

Robin's Java World 2005-11-28 10:15

--------------------------------------------------------------------------------