Servlet3.0模块化支持

系统 1571 0

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 项目的目录结构应该是这个样子的:


Servlet3.0模块化支持
 
       web-fragment.xml文件的作用与Web应用下的web.xml文件的作用是相似的,在web.xml文件可以配置的信息都可以在web-fragment.xml文件中进行配置。此外,它们的文档结构也非常的相似。所不同的是web-fragment.xml文件的根元素是web-fragment,所使用的schema也是web-fragment相应的schema。

      <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 http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd">
  
</web-fragment>
    

 

        另外,在 web-fragment.xml 文件中我们可以通过 <name> 元素来指定当前模块的名称,用 <ordering> 元素来指定当前模块相对的加载顺序。 <ordering> 元素下面可以指定 <before> <after> 元素,而 <before> <after> 元素下又可以指定 <name> <others> 元素。我们来看几个指定 ordering 的示例。

在其他模块之前加载

         <ordering>
      <!-- 在其它模块之前加载 -->
      <before>
         <others/>
      </before>
   </ordering>
    

  

在指定模块之后加载

         <ordering>
      <!-- 在指定模块之后加载 -->
      <after>
         <name>模块名称</name>
      </after>
   </ordering>

    

  

       除了可以在 web-fragment.xml 文件里面通过 <ordering> 元素定义当前模块的加载顺序外,我们还可以在 web.xml 文件中通过 <absolute-ordering> 元素指定各模块的 加载顺序。而且 web.xml 文件中指定的加载顺序比 web-fragment.xml 文件中指定的加载顺序具有更高的优先级。如:

         <absolute-ordering>
      <name>module1</name>
      <name>module2</name>
      <name>module3</name>
      <others/>
   </absolute-ordering>

    

  

       接下来我们来展示一个创建 web 模块的例子。假设我们要创建一个叫做 module1 的模块,其中含有一个 Module1Servlet ,其代码如下所示:

      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 文件,其内容如下:

      <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 http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd">
  
   <!-- 指定模块名称 -->
   <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 了。

 

 

Servlet3.0模块化支持


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论