学习struts2.0,尝试手动建立一个简单项目有,结构如下
struts2qs
| — WEB-INF
| | — classes(包含struts.xml)
| | — lib
| | — web.xml
|
| — login.jsp
其中lib文件夹中只导入struts2-core-2.1.6jar、xwork-2.1.2.jar、ognl-2.6.11.jar、freemaker-2.3.13.jar、commons-logging.jar五个jar包;
因为是在DOS窗口下手动编译Struts 2相关的程序,所以将Struts2-core-2.1.6.jar和xwork-2.1.2.jar添加到系统的CLASSPATH环境变量里;同时将tomcat文件中lib文件夹下的servlet-api.jar拷贝到jdk/jre/lib/ext文件夹下,否则编译Servlet类时,会报错找不到包javax.Servlet.*
因为struts 2要求jdk5.0的运行环境,需要支持Servlet API 2.4和JSP API 2.0的Web容器,所以我这里采用的是jdk1.6.0,tomcat6.0版本;
项目部署到tomcat之后,服务器启动,出现错误信息:
严重: Error filterStart
2009-5-15 17:03:36 org.apache.catalina.core.StandardContext start
严重: Context [/struts2qs] startup failed due to previous errors
2009-5-15 17:03:37 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
查看tomcat错误日志,才能发现根本的原因所在
2009-5-15 17:03:36 org.apache.catalina.core.StandardContext filterStart
严重: Exception starting filter Struts2
Unable to load configuration. - bean - jar:file:/D:/apache-tomcat-6.0.18/webapps/struts2qs/WEB-INF/lib/struts2-core-2.1.6.jar!/struts-default.xml:46:178
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:360)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:403)
at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:190)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3709)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4363)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: Unable to load bean: type:org.apache.struts2.dispatcher.multipart.MultiPartRequest class:org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - bean - jar:file:/D:/apache-tomcat-6.0.18/webapps/struts2qs/WEB-INF/lib/struts2-core-2.1.6.jar!/struts-default.xml:46:178
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:222)
at org.apache.struts2.config.StrutsXmlConfigurationProvider.register(StrutsXmlConfigurationProvider.java:101)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:165)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:55)
... 30 more
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getDeclaredConstructors(Class.java:1836)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:212)
... 33 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileUploadException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 37 more
最终原因是需要导入commons-fileupload-1.2.1.jar!!!
对此深有感触的是:出错时查看tomcat日志文件真的是程序员调试的好习惯!!!
关于该问题的详细可参考:
http://topic.csdn.net/u/20080619/15/402f0fd5-b22b-4123-af9c-143799be60ee.html
——————————————————————————————————————————————————————
还有另外一个问题:
实际服务器在启动开始时,还有一段信息
信息: The APR based Apache Tomcat Native library which allows optimal performanc
e in production environments was not found on the java.library.path: D:/jdk1.6.0
_10/bin;.;C:/WINDOWS/Sun/Java/bin;C:/WINDOWS/system32;C:/WINDOWS;D:/jdk1.6.0_10/
bin;D:/jdk1.6.0_10/jre/bin;D:/oracle/ora92/bin;C:/Program Files/Oracle/jre/1.3.1
/bin;C:/Program Files/Oracle/jre/1.1.8/bin;C:/Program Files/IDM Computer Solutio
ns/UltraEdit-32;D:/MySQL/MySQL Server 5.0/bin;C:/windows/system32;D:/apache-tomc
at-6.0.18/bin;
出现它的原因则并非有什么错误,只是tomcat建议使用apache的apr
APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。
在早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用 APR而已。
目前APR主要还是由Apache使用,不过由于APR的较好的移植性,因此一些需要进行移植的C程序也开始使用APR,开源项目比如Flood loader tester(http://httpd.apache.org/test/flood/,该项目用于服务器压力测试,不仅仅适用于Apache)、FreeSwitch(www.freeswitch.org),JXTA-C(http://jxta-c.jxta.org,C版本的JXTA点对点平台实现);商业的项目则包括Blogline(http://www.bloglines.com/,covalent(http://www.covalent.net) 等等。 APR使得平台细节的处理进行下移。对于应用程序而言,它们根本就不需要考虑具体的平台,不管是Unix、Linux还是Window,应用程序执行的接口基本都是统一一致的。因此对于APR而言,可移植性和统一的上层接口是其考虑的一个重点。而APR最早的目的并不是如此,它最早只是希望将Apache 中用到的所有代码合并为一个通用的代码库,然而这不是一个正确的策略,因此后来APR改变了其目标。有的时候使用公共代码并不是一件好事,比如如何将一个请求映射到线程或者进程是平台相关的,因此仅仅一个公共的代码库并不能完成这种区分。
APR的目标则是希望安全合并所有的能够合并的代码而不需要牺牲性能。 APR的最早的一个目标就是为所有的平台(不是部分)提供一个公共的统一操作函数接口,这是一个非常了不起的目的,当然也是不现实的一个目标。我们不可能支持所有平台的所有特征,因此APR目前只能为大多数平台提供所有的APR特性支持,包括Win32、OS/2、BeOS、Darwin、Linux等等。为了能够实现这个目标,APR开发者必须为那些不能运行于所有平台的特性创建了一系列的特征宏(FEATURE MACROS)以在各个平台之间区分这些特征。这些特征宏定义非常简单,通常如下: APR_HAS_FEATURE 如果某个平台具有这个特性,则该宏必须设置为true,比如Linux和window都具有内存映射文件,同时APR提供了内存映射文件的操作接口,因此在这两个平台上,APR_HAS_MMAP宏必须设置,同时ap_mmap_*函数应该将磁盘文件映射为内存并返回适当的状态码。如果你的操作系统并不支持内存映射,那么APR_HAS_MMAP必须设置为0,而且所有的ap_mmap_*函数也可以不需要定义。第二步就是对于那些在程序中使用了不支持的函数必须提出警告。
APR中支持的基本类型
文件夹名称 描述
atomic/srclib/apr/atomic 原子操作
dso/srclib/apr/dso 动态加载共享库
fileio/srclib/apr/file_io 文件IO处理
mmap/srclib/apr/mmap 内存映射文件
locks/srclib/apr/locks 进程和线程互斥锁
memory/srclib/apr/memory 内存池操作
network_io/srclib/apr/network_io 网络IO处理
poll/srclib/apr/poll 轮询IO
table/srclib/apr/tables Apache数组(堆栈)和表格以及哈希表
process /srclib/apr/threadproc 进程和线程操作
user /srclib/apr/user 用户和用户组操作
time /srclib/apr/time 时间操作
string/srclib/apr/strings 字符串操作
password /srclib/apr/passwd 终端密码处理
misc /srclib/apr/misc 大杂烩,不属于其余类的任何apr类型都可以放在里面
shmem /srclib/apr/shmem 共享内存
random /srclib/apr/random 随机数生成库
apr 是apache portable runtime 用上这个后可以有效的提高tomcat处理静态页面的能力.如果想使用apr的话, 实际操作很简单,
下载 http://tomcat.heanet.ie/native/1.1.1/binaries/win32/tcnative-1.dll
将这个文件复制到C:/WINDOWS/system32/下面,然后重新启动tomcat,就会发现tomcat 的控制台信息为:
2007-12-31 9:55:40 org.apache.catalina.core.AprLifecycleListener init
信息: An older version 1.1.8 of the Apache Tomcat Native library is installed, while Tomcat recommends version greater then 1.1.10
2007-12-31 9:55:40 org.apache.catalina.core.AprLifecycleListener init
信息: Loaded Apache Tomcat Native library 1.1.8.
本问题参考:
http://www.blogjava.net/sealyu/archive/2009/04/11/265054.html
http://www.diybl.com/course/3_program/java/javashl/2008422/110729.html