并发编程之--ConcurrentSkipListMap
一、使用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文件中的标注信息。
并发编程之--ConcurrentSkipListMap的更多相关文章
- 并发编程从零开始(九)-ConcurrentSkipListMap&Set
并发编程从零开始(九)-ConcurrentSkipListMap&Set CAS知识点补充: 我们都知道在使用 CAS 也就是使用 compareAndSet(current,next)方法 ...
- Java并发编程:并发容器之ConcurrentHashMap(转载)
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- Java并发编程:并发容器之ConcurrentHashMap
转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...
- Java并发编程-并发工具包(java.util.concurrent)使用指南(全)
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- Java并发编程-总纲
Java 原生支持并发,基本的底层同步包括:synchronized,用来标示一个方法(普通,静态)或者一个块需要同步执行(某一时刻,只允许一个线程在执行代码块).volatile,用来标识一个变量是 ...
- Java并发编程:并发容器ConcurrentHashMap
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- 笔记:java并发编程实践1
Java 5.0 adds ConcurrentHashMap, a replacement for synchronized hash-based Map implementations, and ...
- 【Java进阶】并发编程
PS:整理自极客时间<Java并发编程> 1. 概述 三种性质 可见性:一个线程对共享变量的修改,另一个线程能立刻看到.缓存可导致可见性问题. 原子性:一个或多个CPU执行操作不被中断.线 ...
- (转)并发编程 – Concurrent 用户指南
原文出处: 高广超 译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/in ...
随机推荐
- 【socket】TCP 和 UDP 在socket编程中的区别
一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UD ...
- iOS中touches事件,addtarget ...action和GestureRecognizer详解
刚学完uiview,uicontrol类,许多人知道 touchesBegain,touchesMoved,touchesEnd,GestureRecognizer的用途,但仔细考虑这些事件之间的关系 ...
- python学习笔记10(函数一): 函数使用、调用、返回值
一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明和函数定义可以出现在不同的文件中,比如C语言),但是在Python中,函数声明和函数定义是视为一体的.在Py ...
- Qt编译postgreSQL驱动
安装postgreSQL,安装目录下的lib和bin添加到path 打开Qt安装目录,找到src\plugins\sqldrivers\psql编辑psql.pro,添加INCLUDEPATH += ...
- iOS9下修改回HTTP模式进行网络请求
升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...
- jquery bind()方法与live()方法的区别
jquery bind() 方法和 live() 方法都可以绑定元素事件. <!DOCTYPE html> <html> <head> <meta chars ...
- SpringMVC注解@RequestParam(转)
鸣谢:http://shawnccx.iteye.com/blog/730239 -------------------------------------------------- 在SpringM ...
- 【链表】bzoj 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1136 Solved: 458[Submit] ...
- fill 函数
fill函数的作用是:将一个区间的元素都赋予val值.函数参数:fill(first,last,val);//first为容器的首迭代器,last为容器的末迭代器,val为将要替换的值. 例题:给你n ...
- hdu 3927 Math Geek
纯数论题,不解释!!!! 代码如下: #include<stdio.h> int main(){ ,m; scanf("%d",&t); while(t--){ ...