将共享代码和web.xml从WAR项目拆分为常见的JAR项目

时间:2015-05-05 07:44:17

标签: servlets java-ee web.xml modularity

我有不同的webapps,它们共享web.xml配置的很大一部分。例如,某些servlet的映射方式对于所有应用程序都是相同的,但有些webapps具有自定义servlet,或其他过滤器或共享托管bean。

每个webapp都是我IDE中的一个不同项目。我想将web.xml的公共部分重构为“通用”项目,并让所有特定于应用程序的web.xml扩展“通用”web.xml。有可能这样做吗?

3 个答案:

答案 0 :(得分:7)

是的,你可以。假设Eclipse(您的问题历史记录确认您正在使用它),只需创建一个" Web Fragment Project":

enter image description here

并将其与向导中的主项目相关联:

enter image description here

您可以根据需要(重新)在"部署程序集"中配置它。主Web项目的属性(或以任何其他方式配置构建,最终以主Web项目的/WEB-INF/lib中的JAR结束)。

enter image description here

它基本上是一个具有以下文件夹结构的Java项目:

CommonWebProject
 |-- com.example... (you can put e.g. @WebServlet classes here)
 |
 |-- META-INF
 |    |-- resources (you can put shared web resources here)
 |    |    |-- common.css
 |    |    |-- common.js
 |    |    |-- template.jsp
 |    |    :
 |    |
 |    |-- beans.xml
 |    |-- web-fragment.xml
 |    `-- MANIFEST.MF
 :

/META-INF/resources文件夹中的任何内容都以与WAR的webcontent相同的方式解析(我的Eclipse Luna SR1没有预先创建/resources文件夹,因此您需要手动创造它)。而且,重要的是,WAR中已经具有相同名称的任何资源(包括类!)将具有优于JAR中的资源的加载优先级,因此您可以在必要时使用#34;覆盖"这种方式来自WAR的常见JAR资源。

请注意,web-fragment.xml文件的名称必须与web.xml完全相同,因此不能<?xml version="1.0" encoding="utf-8"?> <web-fragment xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd" version="3.0" > <!-- Put shared web.xml config here. --> </web-fragment> 。 IDE应该只为你自动生成一个,但为了完整起见,Servlet 3.0兼容的看起来像这样:

if(process.env.MYKEY) { 
    console.log('It is set!'); 
}
else { 
    console.log('No set!'); 
}

另见:

答案 1 :(得分:1)

如果您在glassfish上部署应用程序,则可以将常用配置放在default-web.xml位置下的domain-dir\config\文件中。

答案 2 :(得分:0)

通常,Web服务器具有定义默认web.xml的功能,可满足您的要求。我建议您探索您正在使用的Web服务器的选项。