一、Web 模块支持

Servlet3.0 新增的可插性(Pluggability)支持则将 Servlet 配置的灵活性提升到了新的高度。使用该特性,现在我们可以在不修改已有 Web 应用的前提下,只需将按照一定格式打包成的 JAR 包放到 WEB-INF/lib 目录下,即可实现新的功能的扩充,不需要额外的配置。Servlet3.0 引入了称为“Web 模块部署描述文件片段”的 web-fragment.xml 来实现可插性的。web-fragment.xml 部署描述文件可以定义一切可以在 web.xml 中定义的内容。

  1. 原来一个 web 应用的任何配置都需要在 web.xml 中进行,因此会使得 web.xml 变得很混乱,而且灵活性差。现在可通过 Web 模块来部署管理它们。

  2. Web 模块对应一个 Jar 包,即 Servlet 3.0 可以将每个 Servlet、Filter、Listener 打成 jar 包,然后放在 WEB-INF\lib 中。

  3. 每个模块都有自己的配置文件,这个配置文件的名称为 web-fragment.xml 。

  4. 制作一个 Servlet 模块的步骤:

(1)正常编写 Servlet,并编译;

(2)将此编译 class 文件及所在包通过 jar 包命令打成 jar 包;

(3)将此 jar 包用 winrar 打开,将 META-INF 中的 manifest 删除后添加 web-fragment.xml;

(4)将此 jar 包放入 WEB-INF\lib 中即可;

  1. web-fragment.xml 说明:
<web-fragment>为根元素;
<name></name>表示模块名称(模块的唯一标识);
<ordering></ordering>定义模块加载顺序的标签,当然可以不设置模块加载顺序;
<before><others/></before>表示在所有模块前面加载(第一个加载);
<after><name>A</name></after>表示在 A 模块后面加载;
可以在里面部署 listener、filter、servlet
值得注意的是,web.xml 中用<absolute-ordering>标签指定的模块加载顺序将会覆盖 web 模块的 web-fragment.xml 文件中指定的加载顺序。
  1. 打包

如何用 myEclipse 打 jar 包(有些人不知道)

右键你 web 项目里的编写的 servlet(或 filter 或 listener)类——>Export…——>JAR file——>NEXT——>(Browse)填写导出名字和存放位置——>finish

这样就生成了我们需要的 jar 包了。

二、示例

注解方式

servlet 类代码片段:

@WebServlet(name="test",urlPatterns={"/basic.do"})
public class TestServlet extends HttpServlet{

    //使用该方法可响应客户端的所有请求
    public void service(HttpServletRequest req, HttpServletResponse resp)throws IOException{
        System.out.println("进servlet了");
        PrintStream out = new PrintStream(resp.getOutputStream());
        //向页面输入下面字符串
        out.print("1234567890");
    }

}

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>mySerModule</name>

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

在 web-fragment.xml 里的配置和之前的 web.xml 里类似,如果是注解实现的 servlet 的配置,则在 web-fragment.xml 里就将不再写配置了,如果不是,则还需要写配置。

打成 jar 包放在一个项目里面启动后,就可通过上面 servlet 注解配置的/basic.do 路径访问上面的 servle 了。

配置方式:

1、servlet 类

public class FragmentDemoServlet extends HttpServlet {
    @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 {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        out.println("这是我Servlet3.0的第一个可插性示例");
        out.flush();
    }
    @Override
    public void destroy() {
        //空
    }
    @Override
    public void init() throws ServletException {
        //空
    }
}

2、在 web 目录下新建一个目录 META-INF,在该目录下新建一个 web-fragment.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"
        version="3.0"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"

        metadata-complete="true">

    <!--给当前配置文件定义一个名称-->
    <name>FragmentA</name>
    <servlet>
        <servlet-name>fragmentDemo</servlet-name>
        <servlet-class>com.yyq.servlet3.pluggability.FragmentDemoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>fragmentDemo</servlet-name>
        <url-pattern>/fragment</url-pattern>
    </servlet-mapping>
</web-fragment>

3、将 FragmentDemoServlet 和 META-INF 目录一起打包成 JAR 包,假如 JAR 包叫 fragment.jar。

4、将 fragment.jar 放到其他 Web 项目中的 WEB\lib 目录中,然后访问http://localhost:8080/fragment即可。

posted on 2021-11-23 14:45  格物致知_Tony  阅读(109)  评论(0编辑  收藏  举报