Maven实战 第12章 使用maven构件Web应用
2015-10-29 13:49
211 查看
第12章 使用Maven构建web应用
12.1 Web项目的目录结构
一个War包下至少包含两个子目录:META-INF和WEB-INF。META-INF包含一些打包元数据信息,不必关心。
WEB-INF是WAR包的核心,WEB-INF下必须包含一个Web资源表述文件web.xml,子目录classes包含所有该Web项目的类,而另一个子目录lib则包含所有该Web项目的依赖的JAR包,classes和lib目录都会在运行的时候被加入到Classpath中。
Maven对web项目的布局结构有一个通用的约定:
Web项目的类及资源文件同一般JAR项目一样,默认位置都是src/main/java和src/main/resources,测试类及测试资源文件的默认位置是src/test/java和src/test/resources/。web项目还有一个资源文件,Web资源目录,其默认位置是src/main/webapp/。
在src/main/webapp/目录下,必须包含一个子目录WEB-INF,该子目录还必须要包含web.xml文件。src/main/webapp目录下的其他文件和目录包含包括html,jsp,css,JavaScript等,它们与WAR包中的Web资源完全一致。
12.2 account-service
account-service用来封装account-email、account-persist和account-captcha三个模块的细节。account-service的POM
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-parent</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>account-service</artifactId> <name>Account Service</name> <properties> <greenmail.version>1.3.1b</greenmail.version> </properties> <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>account-email</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>account-persist</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>account-captcha</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>com.icegreen</groupId> <artifactId>greenmail</artifactId> <version>${greenmail.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <testResources> <testResource> <directory>src/test/resources</directory> <filtering>true</filtering> </testResource> </testResources> </build> </project>由于是同一项目中的其他模块,groupId和version都完全一致,因此可以使用Maven属性${project.groupId}和${project.version}进行替换,这样可以在升级项目版本的时候减少更改的数量。
12.2.2 account-service的主代码
12.3 account-web
12.3.1 account-web的POM
除了使用打包方式war之外,Web项目的POM与一般项目并没多大的区别。account-web的POM
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-parent</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>account-web</artifactId> <packaging>war</packaging> <name>Account Web</name> <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>account-service</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <pluginManagement> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>7.1.0.RC1</version> <configuration> <scanIntervalSeconds>10</scanIntervalSeconds> <webAppConfig> <contextPath>/account</contextPath> </webAppConfig> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>account-web的packaging元素值为war,表示这是一个Web项目,需要以war方式进行打包。
account-web依赖于servlet-api和jsp-api这两个几乎所有Web项目都要依赖的包,它们为servlet和jsp的编写提供支持。需要注意的是,这两个依赖的范围是provided,表示它们最终不会被打包至war文件中,这是因为几乎所有Web容器都会提供这两个类库,如果war包中重复出现,就会导致潜在的依赖冲突问题。
12.3.2 account-web的主代码
account-web的主代码包含了2个jsp页面和4个Servlet。web.xml的配置:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Sample Maven Project: Account Service</display-name> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:/account-persist.xml classpath:/account-captcha.xml classpath:/account-email.xml classpath:/account-service.xml </param-value> </context-param> <servlet> <servlet-name>CaptchaImageServlet</servlet-name> <servlet-class>com.juvenxu.mvnbook.account.web.CaptchaImageServlet</servlet-class> </servlet> <servlet> <servlet-name>SignUpServlet</servlet-name> <servlet-class>com.juvenxu.mvnbook.account.web.SignUpServlet</servlet-class> </servlet> <servlet> <servlet-name>ActivateServlet</servlet-name> <servlet-class>com.juvenxu.mvnbook.account.web.ActivateServlet</servlet-class> </servlet> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.juvenxu.mvnbook.account.web.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CaptchaImageServlet</servlet-name> <url-pattern>/captcha_image</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>SignUpServlet</servlet-name> <url-pattern>/signup</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ActivateServlet</servlet-name> <url-pattern>/activate</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> </web-app>
12.4 使用jetty-maven-plugin进行测试
相关文章推荐
- C++中正确使用PRId64
- H - Garbage Heap
- 晓月_【斗战神学习四十】金山寺
- Python练习册,第 0003 题
- HTTP Header 详解
- search-in-rotated-sorted-array
- P3-weixin-2.0.1 版本发布,JAVA微信插件框架
- AFNetworking
- 最大连续子数组和。
- Freescale i.MX53 GPIO 按键驱动
- Eclipse 小图标的意义
- Java AbstractCollection源码分析
- C#实现Excel模板导出和从Excel导入数据
- oracle练习题后15个
- VBS教程:获取本机网卡地址
- win_python+python_opencv安装配置
- Python练习册,第 0002 题
- Android工程师必会做的20道题
- Android工程师必会做的20道题
- Linux中使用diff生成的补丁格式说明