題記:以前用MyEclipse+Tomcat進行過struts2的學習,最後學習計劃不了了之。現在因爲工作需用到struts2 進行開發,所以打算從新開始學習struts2。但是,在ubuntu上進行開發時,我喜歡用vim,所以就想要不乾脆放棄IDE,直接用vim進行開發。然後,就是查找相關不用IDE進行web開發的指導教程。最後,被我發現在《struts2權威指南》有對該方面的介紹,於是開始了無IDE的web開發之旅。
ubuntu安裝JDK:
從sun網站上http://www.oracle.com/technetwork/java/javase/downloads/index.html下載JDK。在這裏我下載的版本是jdk-7u45-linux-x64.tar.gz。下載完畢後,直接tar命令解壓到任意目錄下(此處解壓到/usr/lib/jdk),然後在.profile中添加JAVA_HOME環境變量,具體配置如下。
export JAVA_HOME=/usr/lib/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
最後,使用java -version命令判斷JDK是否安裝成功。若出現如下提示,則表明JDK安裝成功。
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
ubuntu上安裝Tomcat:
衆所周知,Tomcat是開源的web容器,可直接到網站http://tomcat.apache.org/上下載。我下載的是apache-tomcat-6.0.37.tar.gz文件,該文件無需安裝,直接解壓即可使用。當然,在此之前需安裝好jdk。
下載struts2源碼:
struts2也是apache的一個開源項目,可從網站http://struts.apache.org/development/2.x/上下載。目前,最新的版本是2.3.16,我下載的是完全版struts-2.3.15.3-all.zip。在下載目錄解壓該文件,可看到如下文件:
ANTLR-LICENSE.txt lib SITEMESH-LICENSE.txt
apps LICENSE.txt src
CLASSWORLDS-LICENSE.txt NOTICE.txt XPP3-LICENSE.txt
docs OGNL-LICENSE.txt XSTREAM-LICENSE.txt
FREEMARKER-LICENSE.txt OVAL-LICENSE.txt
第一個web應用:
在tomcat主目錄下的webapps下創建一個自己的web應用根目錄,例:myapps。並在根目錄下創建兩個目錄:WEB-INF,lib。
進入到struts的apps目錄,解壓該目錄下的struts2-blank.war文件,進入WEB-INF/lib,並其中的jar包拷貝到我們創建的lib目錄下,需要拷貝的jar包如下所示:
commons-fileupload-1.3.jar javax.servlet.jsp.jstl.jar
commons-io-2.0.1.jar jstl-impl.jar
commons-lang3-3.1.jar log4j-1.2.17.jar
commons-logging-1.1.3.jar ognl-3.0.6.jar
freemarker-2.3.19.jar struts2-core-2.3.15.3.jar
javassist-3.11.0.GA.jar xwork-core-2.3.15.3.jar
如果沒有拷貝javassist-3.11.0.GA.jar到lib目錄下,將會出現以下錯誤:
java.lang.reflect.InvocationTargetException - Class: com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector
File: ContainerImpl.java
Method: inject
Line: 301 - com/opensymphony/xwork2/inject/ContainerImpl.java:301:-1
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:502)
at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:57)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:424)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4072)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4726)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1079)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1002)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:506)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:301)
at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.construct(ContainerImpl.java:438)
at com.opensymphony.xwork2.inject.ContainerBuilder$5.create(ContainerBuilder.java:207)
at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:51)
at com.opensymphony.xwork2.inject.ContainerBuilder$3.create(ContainerBuilder.java:93)
at com.opensymphony.xwork2.inject.ContainerBuilder$7.call(ContainerBuilder.java:487)
at com.opensymphony.xwork2.inject.ContainerBuilder$7.call(ContainerBuilder.java:484)
at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:584)
at com.opensymphony.xwork2.inject.ContainerBuilder.create(ContainerBuilder.java:484)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.createBootstrapContainer(DefaultConfiguration.java:324)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:221)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:446)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:490)
... 29 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:299)
... 42 more
Caused by: java.lang.ExceptionInInitializerError
at com.opensymphony.xwork2.ognl.OgnlValueStackFactory.setContainer(OgnlValueStackFactory.java:84)
... 47 more
Caused by: java.lang.IllegalArgumentException: Javassist library is missing in classpath! Please add missed dependency!
at ognl.OgnlRuntime.<clinit>(OgnlRuntime.java:168)
... 48 more
Caused by: java.lang.ClassNotFoundException: javassist.ClassPool
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at ognl.OgnlRuntime.<clinit>(OgnlRuntime.java:165)
... 48 more
Dec 07, 2013 10:37:06 PM org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart
Dec 07, 2013 10:37:06 PM org.apache.catalina.core.StandardContext start
SEVERE: Context [/Hello] startup failed due to previous errors
最後,把struts.xml文件從myapps/WEB-INF/classes目錄下,web.xml文件拷貝到myapps/WEB-INF目錄下,並在myapps目錄下添加屬於自己的jsp文件,例如:login.jsp。根據實際情況配置好這些文件之後,啓動tomcat測試用例的正確性。