一、有这么一道题:
一个Java 类 User 的定义如下 : 
public class User { 
         private String name; 
         private String emailAddress; 
         private boolean male;          public String getEmailAddress() { 
                   return emailAddress; 
         }         public void setEmailAddress(String address) { 
                   this.emailAddress = address; 
         }          public boolean isMale() { 
                   return male; 
         }          public void setMale(boolean male) { 
                   this.male = male; 
         }          public String getName() { 
                   return name; 
         }          public void setName(String name) { 
                   this.name = name; 
         }          public User( String name, String emailAddress, boolean male ) { 
                   this.name = name; 
                   this.emailAddress = emailAddress; 
                   this.male = male; 
         } 
}
假设在 Velocity 的 runtime context 中已经存在一个 Java 容器类 ArrayList 的实例变量 $user 。 
$user 的初始化方法为: 
java.util.List user = new java.util.ArrayList(5); 
user.add( new User( "John", "[email protected]", true ) ); 
user.add( new User( " Alice ", "[email protected]", false ) ); 
user.add( new User( "Tom", "[email protected]", true ) ); 
user.add( new User( "Elisa", "[email protected]", false ) ); 
user.add( new User( "Zine", "[email protected]", true ) );请写一个 velocity 模版,这个模版可以生成一个 html 页面,输出 $user 中包含的动态用户信息,要求: 
1. 采用 table 的形式,每个用户一行,每行包括用户名, email 地址,性别三列信息。 
2. 性别需要转换成 “ 男 ” , “ 女 ” ,不要直接输出 boolean 值。 
3. 男用户输出行背景为蓝色,女用户输出行背景为红色。二、我是这么做的:
TestVelocity.java代码如下:
//package testVelocity;
import java.io.StringWriter;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
public class TestVelocity{
 public static void main( String[] args )throws Exception{
  VelocityEngine ve = new VelocityEngine();
  ve.init();
  Template t = ve.getTemplate( "userTable.vm" );
  VelocityContext context = new VelocityContext();
  context.put("name", "Eiffel Qiu");
  context.put("site", "http://www.j2medev.com");  java.util.List user = new java.util.ArrayList(5); 
  user.add( new User( "John", "[email protected]", true ) ); 
  user.add( new User( " Alice ", "[email protected]", false ) ); 
  user.add( new User( "Tom", "[email protected]", true ) ); 
  user.add( new User( "Elisa", "[email protected]", false ) ); 
  user.add( new User( "Zine", "[email protected]", true ) );
  context.put("user", user);
  StringWriter writer = new StringWriter();
  t.merge( context, writer );
  System.out.println( writer.toString() ); 
 }
}Uesr.java代码:
//package testVelocity;
public class User { 
    private String name; 
    private String emailAddress; 
    private boolean male; 
    public String getEmailAddress() { 
              return emailAddress; 
    } 
    public void setEmailAddress(String address) { 
              this.emailAddress = address; 
    } 
    public boolean isMale() { 
              return male; 
    } 
    public void setMale(boolean male) { 
              this.male = male; 
    } 
    public String getName() { 
              return name; 
    } 
    public void setName(String name) { 
              this.name = name; 
    } 
    public User( String name, String emailAddress, boolean male ) { 
              this.name = name; 
              this.emailAddress = emailAddress; 
              this.male = male; 
    } 
}userTable.vm代码:
<html>
<title>TestVelocity</title>
<body>
<h1>采用 table 的形式显示:</h1><br/>
<table border=1>
<tr>
<td>Name</td>
<td>EMailAddress</td>
<td>Male or Female</td>
</tr>
#foreach($userInstance in $user)
<tr>
<td>$userInstance.name</td>
<td>$userInstance.emailAddress</td>
#if($userInstance.male)
<td bgcolor="blue">男</td>
#else
<td bgcolor="red">女</td>
</tr>
#end
</table>
</body>
</html>web.xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name>TestVelocity</display-name>
<description>TestVelocity</description>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list><servlet>
<servlet-name>test</servlet-name>
<servlet-class>cn.ac.ict.TestVelocity</servlet-class>
</servlet><servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>三、用tomcat打开就这样的错误:HTTP Status 500 - 
--------------------------------------------------------------------------------
type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException: Error allocating a servlet instance
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
java.lang.Thread.run(Thread.java:534)
root cause java.lang.NoClassDefFoundError: cn/ac/ict/TestVelocity (wrong name: TestVelocity)
java.lang.ClassLoader.defineClass0(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:539)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1634)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:860)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1307)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1189)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
java.lang.Thread.run(Thread.java:534)note The full stack trace of the root cause is available in the Apache Tomcat/5.0.28 logs.--------------------------------------------------------------------------------Apache Tomcat/5.0.28四、我的classpath是
.;C:\j2sdk1.4.2_14\lib\dt.jar;C:\j2sdk1.4.2_14\lib\tools.jar;C:\j2sdk1.4.2_14\jre\lib\rt.jar;C:\Tomcat 5.0\common\lib\servlet-api.jar;C:\Tomcat 5.0\common\lib;C:\Tomcat 5.0\webapps\velocity\WEB-INF\lib\velocity-dep-1.5.jar;C:\Tomcat 5.0\webapps\velocity\WEB-INF\lib\velocity-1.5.jar;C:\Tomcat 5.0\webapps\velocity\WEB-INF\classes\cn\ac\ict\TestVelocity.class五、我的j2dk1.4.2_14
tomcat5.0.28
j2re1.4.2_14六、为什么不能正确显示出网页呢?
我在网上搜了一下,有的说*.java文件加上引入的包package就行了,但我前边两个java文件如果加了包就不能编译通过,去掉包就编译顺利通过,郁闷阿~~找高人指点!!

解决方案 »

  1.   

    加上package 然后编译时候 javac -d . 编译
      

  2.   

    javac user.java -d
    是这种格式么?
      

  3.   

    用javac -d . *.java 编译成功了,但是启动tomcat打开网页还是那样的错误。“HTTP Status 500 - ”
      

  4.   

    那把这些类 放到 web-inf classes下面
      

  5.   

    或者userTable.vm需要修改呢?高手呢?帮帮忙啊...
      

  6.   

    嗯,两个class文件都放到web-inf classes下面了。
      

  7.   

    很奇怪,我重启tomcat之后输入网址http://localhost:8080/velocity/test,还显示“HTTP Status 500 -”的错误,。但我刷新一遍就显示如下错误了。
    HTTP Status 404 - Servlet test is not available--------------------------------------------------------------------------------type Status reportmessage Servlet test is not availabledescription The requested resource (Servlet test is not available) is not available.
    --------------------------------------------------------------------------------Apache Tomcat/5.0.28
      

  8.   

    <servlet>
    <servlet-name>test</servlet-name>
    <servlet-class>cn.ac.ict.TestVelocity</servlet-class>
    </servlet>
    TestVelocity.java 的包名是 cn.ac.ict 吗
      

  9.   

    没错,TestVelocity.java和User.java的包名都改成package cn.ac.ict;了。
      

  10.   

    tomcat 的安装目录下 logs文件夹
      

  11.   

    太长了,只贴最后几个吧。2007-04-08 21:34:28 StandardWrapperValve[test]: Servlet test is currently unavailable
    2007-04-08 21:34:31 StandardWrapperValve[test]: Servlet test is currently unavailable
    2007-04-08 21:36:47 StandardWrapperValve[test]: Servlet test is currently unavailable
    2007-04-08 21:36:47 StandardWrapperValve[test]: Servlet test is currently unavailable
    2007-04-08 21:36:50 StandardContext[/WebContent]Marking servlet hello as unavailable
    2007-04-08 21:36:50 StandardContext[/WebContent]Error loading WebappClassLoader
      delegate: false
      repositories:
        /WEB-INF/classes/
    ----------> Parent Classloader:
    StandardClassLoader
      delegate: true
      repositories:
        file:C:\Tomcat 5.0\shared\classes\
    ----------> Parent Classloader:
    StandardClassLoader
      delegate: true
      repositories:
        file:C:\Tomcat 5.0\common\classes\
        file:C:\Tomcat 5.0\common\endorsed\xercesImpl.jar
        file:C:\Tomcat 5.0\common\endorsed\xml-apis.jar
        file:C:\Tomcat 5.0\common\lib\ant-launcher.jar
        file:C:\Tomcat 5.0\common\lib\ant.jar
        file:C:\Tomcat 5.0\common\lib\commons-collections-3.1.jar
        file:C:\Tomcat 5.0\common\lib\commons-dbcp-1.2.1.jar
        file:C:\Tomcat 5.0\common\lib\commons-el.jar
        file:C:\Tomcat 5.0\common\lib\commons-pool-1.2.jar
        file:C:\Tomcat 5.0\common\lib\jasper-compiler.jar
        file:C:\Tomcat 5.0\common\lib\jasper-runtime.jar
        file:C:\Tomcat 5.0\common\lib\jsp-api.jar
        file:C:\Tomcat 5.0\common\lib\naming-common.jar
        file:C:\Tomcat 5.0\common\lib\naming-factory.jar
        file:C:\Tomcat 5.0\common\lib\naming-java.jar
        file:C:\Tomcat 5.0\common\lib\naming-resources.jar
        file:C:\Tomcat 5.0\common\lib\servlet-api.jar
        file:C:\Tomcat 5.0\common\lib\tools.jar
    ----------> Parent Classloader:
    sun.misc.Launcher$AppClassLoader@19fcc69
     cn.ac.ict.HelloVelocity
    java.lang.ClassNotFoundException: cn.ac.ict.HelloVelocity
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1340)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1189)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:964)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:687)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:144)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:534)
      

  12.   

    这是最新的,2007-04-08 21:36:50 StandardWrapperValve[hello]: Allocate exception for servlet hello
    javax.servlet.ServletException: Wrapper cannot find servlet class cn.ac.ict.HelloVelocity or a class it depends on
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:974)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:687)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:144)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:534)
    ----- Root Cause -----
    java.lang.ClassNotFoundException: cn.ac.ict.HelloVelocity
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1340)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1189)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:964)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:687)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:144)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:534)2007-04-08 21:37:16 StandardWrapperValve[test]: Servlet test is currently unavailable
      

  13.   

    cn.ac.ict.HelloVelocity 这个类找不到你那里用到这个类了
      

  14.   

    啊?不会把?我看看java文件去。==啊。
      

  15.   

    没有那个类啊,不过我现在这个velocity文件夹原来写过HelloVelocity,并且编译成功也能在页面上显示出来,后来我把原来HelloVelocity的东西全删了,从新写的现在的文件。
    这个有关系么?用不用重新建一个文件夹呢?
      

  16.   

    或者是不是web.xml里边的这些东西要改啊?<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
      

  17.   

    不过我现在这个velocity文件夹原来写过HelloVelocity,并且编译成功也能在页面上显示出来,后来我把原来HelloVelocity的东西全删了,从新写的现在的文件。
    这个有关系么?用不用重新建一个文件夹呢?不懂
      

  18.   

    就是说,我现在的这些class文件夹WEB-INF文件夹以及java文件都存在一个叫velocity的文件夹中,就是这样:“C:\Tomcat 5.0\webapps\velocity\WEB-INF\classes\cn\ac\ict”。之前,velocity文件夹原来写过一个叫HelloVelocity的VTL模板,并且在tomcat下运行成功了。然后我把关于HelloVelocity的文件全删了,重新写了现在这个userTable.vm和两个java文件。
      

  19.   

    TestVelocity这个类定义不是Servlet。
    就是说你在Web.xml里定义的那个cn.ac.ict.TestVelocity的类必须继承HttpServlet,然后写在main方法里的那些东西也要改在overload的doGet或者doPost或者service里边,还有就是输出也不是System.out而是写入HttpResponse的out里。
      

  20.   

    chfly_2000() ,
    有时间么?能详细帮我说说么?
    我qq13408528
      

  21.   

    不好意思,我不用QQ。
    web.xml里的配置:
    <servlet>
    <servlet-name>test</servlet-name>
    <servlet-class>cn.ac.ict.TestVelocity</servlet-class>
    </servlet>
    是用来配置Servlet的,所有的Servlet就要从HttpServlet继承,然后覆盖父类的那几个方法之一就可以了,如果你是页面之间请求或是使用GET方式,就覆盖doGet,如果是POST方式就覆盖doPost,如果不区分用覆盖service就可以了。
      

  22.   

    不过我真的不太懂,能不能帮我写写TestVelocity.java?要依题意。这是一道考试题,我真的很挠头...
      

  23.   

    <servlet>
    <servlet-name>test</servlet-name>
    <servlet-class>cn.ac.ict.TestVelocity</servlet-class>
    </servlet>TestVelocity.java代码如下:
    //package testVelocity;
    import java.io.StringWriter;
    import org.apache.velocity.app.VelocityEngine;
    import org.apache.velocity.Template;
    import org.apache.velocity.VelocityContext;
    public class TestVelocity{在web.xml中声明的类为cn.ac.ict.TestVelocity,在包cn.ac.ict里,而你定义的类的包声明是package testVelocity;
    还有要在web-inf/classes目录下建cn/ac/ict子目录放TestVelocity类
      

  24.   

    有新进展了,现在启动tomcat运行web不显示错误了,但是现在显示的是白屏,什么都没有。