使用Maven+Jetty配置基于Struts的Web应用
最近打算在入职前把Struts好好的看一看,虽然在最近这一年多里,对基于SSH这种开发模式有了一些实战经验,但由于之前没有系统学习过,所以对这些框架也是用到哪儿了解到哪儿。尤其是Struts,因为我们采用的的SpringMVC,所以对Struts的了解仅限于看过马士兵和传智播客的教程,没有实际的项目经验,这样最大的问题就在于,你看了之后一段时间不用,就又忘记了,相当于白看。但简历上你又必须得写熟悉SSH,因为不写的话,面试机会就会少很多,没办法,很现实的问题。
说正事,计划先是结合例子把《深入Struts内幕》这本书看看,在了解struts的同时,也学习一下人家是怎么读框架的源码的,掌握这种方式,可以省去很多在网上找现成答案的麻烦。工欲善其事,必先利其器。搭建一个简单的学习环境,这是前提,根据工作中的一些习惯和趋势,我决定使用Maven来构建项目,并使用Jetty作Web服务器,理由是部署和启动方便,而且能和Maven无缝结合。虽然一直在用,但对Maven和Jetty都不太了解,折腾了一个晚上,总算是搭好了一个简单的例子,能够运行,我觉得不错。以后就可以专注于理解struts了,下面把搭建过程总结下来,这样下次忘记了的话,也不用在网上一顿乱找了。
1)使用Maven构建一个WebApp项目
Eclipse中如果装有Maven插件的话,建个Maven项目是很方便的事,但是我想借这个机会了解一下Maven的基本操作,所以决定在命令界面来完成创建的操作。作为开源项目来说,官网上的介绍肯定是最全的,所以我直接上在其官网上找到了相关的使用说明,其地址如下:http://maven.apache.org/index.html ,在那上面我很快找到一篇入门介绍:http://maven.apache.org/guides/getting-started/index.html,基本上这篇内容看完了,即使之前从没用过,也至少可以使用了。
我关注的是如何创建一个WEB应用,通过上面的介绍,命令如下:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.oupeng.app \
-DartifactId=my-webapp
上面的命令中,archetype:generate 表示创建命令 -D后面接key=value的形式,表示对某个参数进行设置,一般情况下,我们只需要指定groupId和artifactId即可,前者表示项目惟一的组织名,后者表示项目的ID,对于WebApp,需要指定 -DarchetypeArtifactId=maven-archetype-webapp,当然还可以指定一些其它参数,比如version之类的。
执行完上述命令之后,maven会帮我们建立好一个结构完整的项目,主要包括src/main/resources/目录,src/main/webapp/WEB-INF目录等,以及生成一个pom文件,描述了项目的结构,并引入junit依赖,说明Maven认为测试很重要。就这样一个命令,项目帮我们建立好了,这还是比较方便的。
简单解释一下Maven的几个常用的命令,compile:编译项目,package:打包,将项目打成一个war包或者jar包,install:将打包好的文件安装到本地的Maven仓库,clean:删除之前创建的jar包,test:编译并运行测试用例。一般情况下,直接使用install即可,我常用的是mvn install -T 8
2)添加Jetty
因为Jetty可以以插件的形式在maven的Pom文件中配置,非常方便,所以它是不二的Web容器选择,当然生产环境下还是使用Tomcat或者Resin比较好,毕竟功能强大。配置Jetty也很简单,但我配置的时候走了点弯路,最后发现原因是Jetty的新版本和原版本在很多方面有一些差别,所以这个要注意,弄清楚使用的是什么版本,个人建议是显示指定版本号。这样便于控制,代码如下:
<plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.26</version> <!--configuration --> <configuration> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>9090</port> <maxIdleTime>60000</maxIdleTime> </connector> </connectors> <contextPath>/strutsDemo</contextPath> </configuration> </plugin> </plugins>
上面的代码给出了一个比较简单的配置,不过需要注意的是,新版本的Jetty(>=7),artifactId的值是jetty-maven-plugin,而且好像也去掉了org.mortbay.jetty.nio.SelectChannelConnector,用什么代替了,由于我只是想跑通,所以没做进一步的查询,而是指定了7以下的版本。另外还有一个需要注意的地方,就是上面这段代码应该放在<build>节点下,要不然会有问题。
以上两步部署完成后,再使用mvn jetty:run来启动,浏览器中输入localhost:9090/strutsDemo,能看到Hello World!表示配置成功。另外,上面这段代码参考了jetty的官网中的一些说明,http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html。
3)改造为Struts项目
参考struts官网上的一篇文章,http://struts.apache.org/release/2.3.x/docs/create-struts-2-web-application-using-maven-to-manage-artifacts-and-to-build-the-application.html,按上面的说明,很方便的就建立了一个简单的struts Web应用。简单的说需要以下三步:
1. 修改pom.xml文件,加入对struts2.xml的依赖,以及对log4j.xml的依赖,如下:
<!--struts--> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.8</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
2)修改web.xml文件,添加struts2过滤器,并添加log4j.xml文件到resources目录。如下:
<!-- filter to start the struts --> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3)添加struts.xml文件,配置action,示例如下:
<struts> <constant name="struts.devMode" value="true" /> <package name="basicstruts2" namespace="/firstdemo" extends="struts-default"> <action name="index"> <result>/WEB-INF/index.jsp</result> </action> </package> </struts>
以上,配置完成后,重启服务,浏览器中输入:http://localhost:9090/strutsDemo/firstdemo/index,如果能正常出现Hello World,则配置成功。
总结:这是一次很简单的配置过程,其中一些(struts项目构建)之前已做过好几次,但再次做的时候,还是不知道,又在网上查,我相信这次总结之后,以后不用再查了,除非struts的配置方式有很大的更新。所以虽然花了一个晚上,还是值得的,从明天起,就可以专注于学习struts了。