A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Servlet3.0模块化支持

        Servlet3.0现在已经支持各Web组件的模块化了。也就是说现在我们可以把各Web组件单独拿出来进行开发,之后把它们打成对应的jar包放到主项目中就可以了,而不必像之前那样——所有的内容都必须在web.xml文件中进行定义。有了对模块化的支持后我们在实际应用中就可以把某些通用功能的Filter、Listener、Servlet作为一个单独的Web模块进行定义,在需要使用它们的项目中就把对应Web模块对应的jar包加进去就可以了。是不是很有用呢?接下来我们就来看一下这些Web组件究竟是怎样模块化的。
       Web模块打成的jar包的内容的文件结构要求是这个样子的:
|--META-INF
|     |--web-fragment.xml
|     |--resources
|     |     |--jsp、图片等,相当于web的根目录
|--class文件和类路径下的文件
       其中web-fragment.xml文件是必须要的。上述目录结构就相当于在我们的类路径下有一个META-INF目录,该目录下有web-fragment.xml文件及包含jsp、图片等资源的resources目录。针对于上述这样的目录结构,所以当我们在使用Maven构建项目的时候,我们的Maven项目的目录结构应该是这个样子的:

        web-fragment.xml文件的作用与Web应用下的web.xml文件的作用是相似的,在web.xml文件可以配置的信息都可以在web-fragment.xml文件中进行配置。此外,它们的文档结构也非常的相似。所不同的是web-fragment.xml文件的根元素是web-fragment,所使用的schema也是web-fragment相应的schema。
xml代码:
[XML] 纯文本查看 复制代码
<web-fragment version="3.0" 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 [url=http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd]http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd[/url]">  
    
</web-fragment>  
         另外,在web-fragment.xml文件中我们可以通过<name>元素来指定当前模块的名称,用<ordering>元素来指定当前模块相对的加载顺序。<ordering>元素下面可以指定<before>或<after>元素,而<before>和<after>元素下又可以指定<name>和<others>元素。我们来看几个指定ordering的示例。

在其他模块之前加载
xml代码:
[XML] 纯文本查看 复制代码
<ordering>  
   <!-- 在其它模块之前加载 -->  
   <before>  
      <others/>  
   </before>  
</ordering>  

在指定模块之后加载
xml代码:
[XML] 纯文本查看 复制代码
<ordering>  
   <!-- 在指定模块之后加载 -->  
   <after>  
      <name>模块名称</name>  
   </after>  
</ordering>  
         除了可以在web-fragment.xml文件里面通过<ordering>元素定义当前模块的加载顺序外,我们还可以在web.xml文件中通过<absolute-ordering>元素指定各模块的 加载顺序。而且web.xml文件中指定的加载顺序比web-fragment.xml文件中指定的加载顺序具有更高的优先级。如:
xml代码:
[XML] 纯文本查看 复制代码
<absolute-ordering>  
   <name>module1</name>  
   <name>module2</name>  
   <name>module3</name>  
   <others/>  
</absolute-ordering>  
    接下来我们来展示一个创建web模块的例子。假设我们要创建一个叫做module1的模块,其中含有一个Module1Servlet,其代码如下所示:
Java代码:
[Java] 纯文本查看 复制代码
public class Module1Servlet extends HttpServlet {  
   
   private static final long serialVersionUID = 1L;  
   
   @Override  
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
         throws ServletException, IOException {  
      this.doPost(req, resp);  
   }  
   
   @Override  
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
         throws ServletException, IOException {  
      req.getRequestDispatcher("/module1.jsp").forward(req, resp);  
   }  
   
}  
    接着我们在类路径下创建一个META-INF文件夹,在该文件夹下创建一个resources目录,在resources目录下创建一个module1.jsp文件。接着在META-INF目录下创建一个web-fragment.xml文件,其内容如下:
xml代码:
[XML] 纯文本查看 复制代码
<web-fragment version="3.0" 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 [url=http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd]http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd[/url]">  
    
   <!-- 指定模块名称 -->  
   <name>module1</name>  
   <!-- 加载顺序 -->  
   <ordering>  
      <!-- 在其它模块之前加载 -->  
      <before>  
         <others/>  
      </before>  
   </ordering>  
    
   <servlet>  
      <servlet-name>module1Servlet</servlet-name>  
      <servlet-class>com.xxx.Module1Servlet</servlet-class>  
   </servlet>  
    
   <servlet-mapping>  
      <servlet-name>module1Servlet</servlet-name>  
      <url-pattern>/servlet/module1</url-pattern>  
   </servlet-mapping>  
    
</web-fragment>  
    之后我们把该项目打成一个jar包就可以把它作为一个jar加到其它Web应用中,在其它Web应用中使用了。放到其它Web应用中后,我们通过访问/servlet/module1就可以访问到我们module1模块中定义的Module1Servlet了。


3 个回复

正序浏览
回复 使用道具 举报
回复 使用道具 举报
ヾ(◍°∇°◍)ノ゙
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马