• Servlet3.0之九:web模块化


    一、使用web-fragment.xml

    在Servlet 3.0中,可以使用标注来设置Servlet的相关信息。实际上,Web容器并不仅读取/WEB-INF/classes中的Servlet标注信息,如果一个JAR文件中有使用标注的Servlet,Web容器也可以读取标注信息、载入类并注册为Servlet进行服务。

    在Servlet 3.0中,JAR文件可用来作为Web应用程序的部分模块。事实上,不仅是Servlet,监听器、过滤器等也可以在编写、定义标注完毕后,封装在JAR文件中,视需要放置至Web应用程序的/WEB-INF/lib中,弹性抽换Web应用程序的功能性。

    二、web-fragment.xml

    一个JAR文件中,除了可使用标注定义的Servlet、监听器、过滤器外,也可以拥有自己的部署描述文件,这个文件的名称是web-fragment.xml,必须放置在JAR文件的META-INF目录中。基本上,web.xml中可定义的元素,在web-fragment.xml中也可以定义。举个例子来说,可以在web-fragment.xml中定义如下内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-fragment id="WebFragment_ID" 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" metadata-complete="true">
        <display-name>FirstWebFrag</display-name>
        <name>FirstWebFrag</name>
        <servlet>
            <servlet-name>wfServlet1</servlet-name>
            <servlet-class>com.dxz.demo.wf.WfServlet1</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>wfServlet1</servlet-name>
            <url-pattern>/wfServlet1</url-pattern>
        </servlet-mapping>
    </web-fragment>

    web-fragment.xml的根标签是<web-fragment>而不是<web-app>。实际上,web-fragment.xml中所指定的类,不一定要在JAR文件中,也可以是在web应用程序的/WEB-INF/classes中。

    在Eclipse中内置Web Fragment Project,如果想要尝试使用JAR文件部署Servlet,或者使用web-fragment.xml部署的功能,可以按照以下步骤练习:

    (1) 选择File | New | Other命令,在出现的对话框中选择Web节点中的Web Fragment Project节点,单击Next按钮。

    (2) 在New Web Project Fragment Project对话框中,注意可以设置Dynamic Web Project membership。这里可以选择Web Fragment Project产生的JAR文件,将会部署于哪一个项目中,这样就不用手动产生JAR文件,并将之复制至另一应用程序的WEB-INF/lib目录中。

     

    (3) 在Project name文本框中输入FirstWebFrag,单击Finish按钮。

    (4) 展开新建立的FirstWebFrag项目中src/META-INF节点,可以看到预先建立的web-fragment.xml。可以在这个项目中建立Servlet等资源,并设置web-fragment.xml的内容。

    (5) 在FirstServlet项目上右击(刚才Dynamic Web Project membership设置的对象),从弹出的快捷菜单中选择Properties命令,展开Deployment Assembly节点,可以看到FirstWebFrag项目建构而成的FirstWebFrag.jar,将会自动部署至FirstServlet项目WEB-INF/ib中。

    接着可以在FirstWebFrag中新增Servlet并设置标注,看看运行结果是什么,再在web-fragment.xml中设置相关信息,并再次实验运行结果是什么。

    2. web.xml与web-fragment.xml

    Servlet 3.0对web.xml与标注的配置顺序并没有定义,对web-fragment.xml及标注的配置顺序也没有定义,然而可以决定web.xml与web-fragment.xml的配置顺序,其中一个设置方式是在web.xml中使用<absolute-ordering>定义绝对顺序。例如,在web.xml中定义:

    <web-app ...> 
        <absolute-ordering>    
            <name>WebFragment1</name>    
            <name>WebFragment2</name>    
        </absolute-ordering>       
        ...  
    </web-app> 

    各个JAR文件中web-fragment.xml定义的名称不得重复,若有重复,则会忽略掉重复的名称。另一个定义顺序的方式,是直接在每个JAR文件的web- fragment.xml中使用,在其中使用或来定义顺序。以下是一个例子,假设有三个web-fragment.xml分别存在于三个JAR文件中:

    <web-fragment ...> 
        <name>WebFragment1</name> 
        <ordering> 
            <after><name>MyFragment2</name> 
        </after></ordering> 
        ...  
    </web-fragment> 
     
    <web-fragment ...> 
        <name>WebFragment2</name> 
        ...  
    </web-fragment> 
     
    <web-fragment ...> 
        <name>WebFragment3</name> 
        <ordering> 
            <before><others/></before> 
        </ordering> 
        ...  
    </web-fragment> 

    而web.xml没有额外定义顺序信息:

    <web-app ...> 
        ...  
    </web-app> 

    则载入定义的顺序是web.xml,<name>名称为WebFragment3、WebFragment2、WebFragment1的web-fragment.xml中的定义。

    3. metadata-complete属性

    如果将web.xml中<web-app>的metadata-complete属性设置为true(默认是false),则表示web.xml中已完成Web应用程序的相关定义,部署时将不会扫描标注与web-fragment.xml中的定义,如果有<absolute-ordering>与<ordering>也会被忽略。例如:

    <web-app 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-app_3_0.xsd" version="3.0" 
             metadata-complete="true"> 
        ...  
    </web-app> 

    如果web-fragment.xml中指定的类可以在web应用程序的/WEB-INF/classes中找到,就会使用该类。要注意的是,如果该类本身有标注,而web-fragment.xml又定义该类为Servlet,则此时会有两个Servlet实例。如果将<web-fragment>的metadata-complete属性设置为true(默认是false),就只会处理自己JAR文件中的标注信息。

  • 相关阅读:
    js设置滚动条定位到所属容器的最底部
    js如何获取前后连续n天的时间
    vue实现点击区域外部的区域,关闭该区域
    使用typed.js实现页面上的写字功能
    Python3基础 函数 多值参数 元组与字典形式(键值对分别指出)
    Python3基础 函数 返回值 利用元组返回多个值
    Python3基础 变量命名 区分大小写
    Python3基础 函数 参数为list可变类型时,使用append会影响到外部实参
    Python3基础 函数 多值参数 元组与字典形式(使用星号对列表与字典进行拆包)
    Python3基础 函数 参数 多个参数都有缺省值,需要指定参数进行赋值
  • 原文地址:https://www.cnblogs.com/duanxz/p/4499460.html
Copyright © 2020-2023  润新知