一、Web产品的客户化定制开发概述
很多产品在为具体客户进行部署后,每个客户都有可能提出一些个性化的需求,这就需要对产品进行一定的定制开发,此现象在中小IT公司尤其常见。在产品的定制开发过程中不可避免的需要在原产品中增加或修改功能,由于JavaWeb技术本身对模块化的支持严重不足,在进行定制开发时通常会导致版本控制混乱、开发调试不便和部署复杂等问题。
目前客户化定制开发常见模式主要有:
1.直接修改方式
通常通过SVN创建产品的分支,然后直接修改源码,添加或变更产品的部分功能。
此方式修改方便,但会导致产品版本控制混乱。
?
2.覆盖方式
类似直接修改方式,但不直接在产品源码中修改,在部署时先部署产品然后将修改后的类和资源文件向产品部署目录进行覆盖。
此方式部署较复杂,通常还需要修改已部署产品的配置文件,另外也会导致版本控制问题。
?
3.产品架构设计支持方式
产品在设计之初就考虑到各种客户化定制的需求,采用OSGI插件或其它技术支持客户化功能变更。
此方式的主要问题是设计复杂增加开发难度,另外调试不便。
Servlet3.0 WebFragment简介
2010年发布的Servlet3.0规范(从属于JavaEE6的一部分)中增加了Web片段技术,大大加强了Web项目的模块化开发支持。Servlet3.0中同时增加了异步Servlet、WebSocket、原生文件上传、注解等多种现代化特性。
目前几乎各种主流Web服务器都已经支持Servlet3.0/JavaEE6,例如:Tomcat7.x、Jetty8.x、GlassFish3.x等。
同样各种开发工具也已经提供支持,例如:Eclipse3.6、MyEclipse9.1、Netbeans7.x、IntelliJ IDEA 10.x等。
?
二、WebFragment实践
?
开发环境:MyEclipse9.1/Tomcat7.0
?
1.创建一个标准Web Project做为主项目
此项目除了JavaEE版本从JavaEE5变化为JavaEE6,项目整体结构上没有特别之处,主要区别是web.xml中的版本号定义为3.0。
?
1.1项目结构视图
屏幕剪辑的捕获时间: 2012/8/1 16:27
?
1.2 web.xml截图
屏幕剪辑的捕获时间: 2012/8/1 16:27
?
2.创建一个Web Fragment Project做为项目模块
?
2.1选择Web Fragment Project项目向导
屏幕剪辑的捕获时间: 2012/8/1 16:32
?
注意:如果找不到Web?Fragment Project,请勾选“Show All Wizards”选项。
?
2.2?创建Web Fragment Project项目
屏幕剪辑的捕获时间: 2012/8/1 16:32
?
注意:“Dynamic Web Project name”项务必选中主项目。
?
2.3 Web Fragment项目结构视图
?
?
屏幕剪辑的捕获时间: 2012/8/1 17:07
?
可以看到此项目结构类似于普通的“Java?Project",项目结构中没有常见Web项目的WebRoot目录,而是在src下多了一个META-INF目录。
目录下的resources目录相当于主Web项目中的WebRoot目录,resources目录需要自行创建。
目录下的web-fragment.xml就是此Web项目片段的配置文件,相当于主Web项目中的web.xml。
?
?
2.4? web-fragment.xml截图
屏幕剪辑的捕获时间: 2012/8/1 16:43
?
可以看到web-fragment.xml文件中的根标签与web.xml文件中的根标签不同,但实际上它们的内容元素(子标签)都是相同的。
?
?
3.在主项目和模块项目中各自Servlet和JSP尝试模块化开发模式
?
3.1在主项目“Product”中创建ServletA
创建Serlvet的过程与Serlvet2.5/JavaEE5中基本没有区别,使用默认生成的代码即可。
?
3.2在模块项目“ProductPlugin”中创建ServletB
3.2.1使用Servlet向导创建ServletB
屏幕剪辑的捕获时间: 2012/8/1 16:43
?
注意:可以不用勾选“Generate/Map web.xml file”选项,因为在Fragment项目中根本不存在web.xml文件,所以也不需要理会向导中的错误提示信息。
?
3.2.2?在模块项目中引入JavaEE6库
ServletB创建之后会发现,代码中出现错误提示
屏幕剪辑的捕获时间: 2012/8/1 17:10
?
此错误很明显是由于项目中未引入JavaEE相关类库,导致无法识别HttpServlet类。
?
在项目上右击,选择“Build?Path -> Add Library”,打开添加库窗口,选择“MyEclipse Libraries -> JavaEE 6 Libraries”点击确定,错误自动消除。
屏幕剪辑的捕获时间: 2012/8/1 17:15
?
3.2.3?配置ServletB
?
可以按照JavaEE5中配置Servlet的标准方式在web-fragment.xml中配置ServletB,在此示例中将尝试注解的方式进行配置。
打开ServletB代码,在类声明前增加“@WebServlet("/ServletB")”,注解括号中是指ServletB的UrlMapping,可以按需设置。
?
3.3?在模块项目中创建一个JSP
只要把JSP文件创建到src/META-INF/resources/目录下即可,可以在文件内容中添加一些关于模块项目的说明文字。
?
4.运行项目,验证模块化开发结果
4.1运行效果截图
4.1.1?主项目默认欢迎页
4.1.2?主项目ServletA
4.1.3?模块项目ServetB
?
4.1.4?模块项目JSP
?
通过每个功能的URL地址来看,使用WebFragment模块化开发的运行结果,与普通的WebProject开发的运行结果是一致的。
?
?
4.3?打包项目部署,分析打包结果
将主项目按照传统过程导出为标准WAR文件,然后按照生产环境部署到Tomcat7中。
进入Tomcat7/webapps/Product目录,可以看到目录中并不存在模块项目“ProductPlugin”中的jsp/servlet文件,而是在“WEB-INF/lib”目录下多出了一个“ProductPlugin.jar”文件。
模块项目“ProductPlugin”以jar的方式存在,所有模块项目的代码和资源文件都已经打包在“ProductPlugin.jar”文件中,主项目的web.xml文件中没有额外的配置,因此模块项目的加入没有污染主项目,部署也非常简单。?
?
5?结论
?
因此Servlet3.0 WebFragment提供的模块化开发模式,完全克服了传统产品客户化项目的问题,其效果达到了引用第三方jar包的便捷性。
一、Web产品的客户化定制开发概述
很多产品在为具体客户进行部署后,每个客户都有可能提出一些个性化的需求,这就需要对产品进行一定的定制开发,此现象在中小IT公司尤其常见。在产品的定制开发过程中不可避免的需要在原产品中增加或修改功能,由于JavaWeb技术本身对模块化的支持严重不足,在进行定制开发时通常会导致版本控制混乱、开发调试不便和部署复杂等问题。
目前客户化定制开发常见模式主要有:
1.直接修改方式
通常通过SVN创建产品的分支,然后直接修改源码,添加或变更产品的部分功能。
此方式修改方便,但会导致产品版本控制混乱。
?
2.覆盖方式
类似直接修改方式,但不直接在产品源码中修改,在部署时先部署产品然后将修改后的类和资源文件向产品部署目录进行覆盖。
此方式部署较复杂,通常还需要修改已部署产品的配置文件,另外也会导致版本控制问题。
?
3.产品架构设计支持方式
产品在设计之初就考虑到各种客户化定制的需求,采用OSGI插件或其它技术支持客户化功能变更。
此方式的主要问题是设计复杂增加开发难度,另外调试不便。
Servlet3.0 WebFragment简介
2010年发布的Servlet3.0规范(从属于JavaEE6的一部分)中增加了Web片段技术,大大加强了Web项目的模块化开发支持。Servlet3.0中同时增加了异步Servlet、WebSocket、原生文件上传、注解等多种现代化特性。
目前几乎各种主流Web服务器都已经支持Servlet3.0/JavaEE6,例如:Tomcat7.x、Jetty8.x、GlassFish3.x等。
同样各种开发工具也已经提供支持,例如:Eclipse3.6、MyEclipse9.1、Netbeans7.x、IntelliJ IDEA 10.x等。
?
二、WebFragment实践
?
开发环境:MyEclipse9.1/Tomcat7.0
?
1.创建一个标准Web Project做为主项目
此项目除了JavaEE版本从JavaEE5变化为JavaEE6,项目整体结构上没有特别之处,主要区别是web.xml中的版本号定义为3.0。
?
1.1项目结构视图
屏幕剪辑的捕获时间: 2012/8/1 16:27
?
1.2 web.xml截图
屏幕剪辑的捕获时间: 2012/8/1 16:27
?
2.创建一个Web Fragment Project做为项目模块
?
2.1选择Web Fragment Project项目向导
屏幕剪辑的捕获时间: 2012/8/1 16:32
?
注意:如果找不到Web?Fragment Project,请勾选“Show All Wizards”选项。
?
2.2?创建Web Fragment Project项目
屏幕剪辑的捕获时间: 2012/8/1 16:32
?
注意:“Dynamic Web Project name”项务必选中主项目。
?
2.3 Web Fragment项目结构视图
?
?
屏幕剪辑的捕获时间: 2012/8/1 17:07
?
可以看到此项目结构类似于普通的“Java?Project",项目结构中没有常见Web项目的WebRoot目录,而是在src下多了一个META-INF目录。
目录下的resources目录相当于主Web项目中的WebRoot目录,resources目录需要自行创建。
目录下的web-fragment.xml就是此Web项目片段的配置文件,相当于主Web项目中的web.xml。
?
?
2.4? web-fragment.xml截图
屏幕剪辑的捕获时间: 2012/8/1 16:43
?
可以看到web-fragment.xml文件中的根标签与web.xml文件中的根标签不同,但实际上它们的内容元素(子标签)都是相同的。
?
?
3.在主项目和模块项目中各自Servlet和JSP尝试模块化开发模式
?
3.1在主项目“Product”中创建ServletA
创建Serlvet的过程与Serlvet2.5/JavaEE5中基本没有区别,使用默认生成的代码即可。
?
3.2在模块项目“ProductPlugin”中创建ServletB
3.2.1使用Servlet向导创建ServletB
屏幕剪辑的捕获时间: 2012/8/1 16:43
?
注意:可以不用勾选“Generate/Map web.xml file”选项,因为在Fragment项目中根本不存在web.xml文件,所以也不需要理会向导中的错误提示信息。
?
3.2.2?在模块项目中引入JavaEE6库
ServletB创建之后会发现,代码中出现错误提示
屏幕剪辑的捕获时间: 2012/8/1 17:10
?
此错误很明显是由于项目中未引入JavaEE相关类库,导致无法识别HttpServlet类。
?
在项目上右击,选择“Build?Path -> Add Library”,打开添加库窗口,选择“MyEclipse Libraries -> JavaEE 6 Libraries”点击确定,错误自动消除。
屏幕剪辑的捕获时间: 2012/8/1 17:15
?
3.2.3?配置ServletB
?
可以按照JavaEE5中配置Servlet的标准方式在web-fragment.xml中配置ServletB,在此示例中将尝试注解的方式进行配置。
打开ServletB代码,在类声明前增加“@WebServlet("/ServletB")”,注解括号中是指ServletB的UrlMapping,可以按需设置。
?
3.3?在模块项目中创建一个JSP
只要把JSP文件创建到src/META-INF/resources/目录下即可,可以在文件内容中添加一些关于模块项目的说明文字。
?
4.运行项目,验证模块化开发结果
4.1运行效果截图
4.1.1?主项目默认欢迎页
4.1.2?主项目ServletA
4.1.3?模块项目ServetB
?
4.1.4?模块项目JSP
?
通过每个功能的URL地址来看,使用WebFragment模块化开发的运行结果,与普通的WebProject开发的运行结果是一致的。
?
?
4.3?打包项目部署,分析打包结果
将主项目按照传统过程导出为标准WAR文件,然后按照生产环境部署到Tomcat7中。
进入Tomcat7/webapps/Product目录,可以看到目录中并不存在模块项目“ProductPlugin”中的jsp/servlet文件,而是在“WEB-INF/lib”目录下多出了一个“ProductPlugin.jar”文件。
模块项目“ProductPlugin”以jar的方式存在,所有模块项目的代码和资源文件都已经打包在“ProductPlugin.jar”文件中,主项目的web.xml文件中没有额外的配置,因此模块项目的加入没有污染主项目,部署也非常简单。?
?
5?结论
?
因此Servlet3.0 WebFragment提供的模块化开发模式,完全克服了传统产品客户化项目的问题,其效果达到了引用第三方jar包的便捷性。