并发编程之--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 ...
随机推荐
- HDFS导论(转)
1.流式数据访问 HDFS的构建思想是这样的:一次写入,多次读取是最高效的访问模式.数据集通常有数据源生成或从数据源复制而来,接着长时间在此数据集上进行各类分析.每次分析都将设计数据集的大部分数据甚至 ...
- Mac OS X 软件推荐
1. 前言 每个操作系统都有自己的一套软件系统,但是不同的用户却会有不同的需求,系统虽会为用户提供一些基础软件,不过为了能无碍的进入自己的学习和工作状态,总有一些软件是必须安装的,同时这些软件也可以 ...
- setTimeOut传参数(转)
无论是window.setTimeout还是window.setInterval,在使用函数名作为调用句柄时都不能带参数.带参数则立马执行,没有延时效果.可通过下面方式实现. <script ...
- C# Windows - Button 控件
.Net Framework提供了一个派生于Control的类System.Windows.Forms.ButtonBase,它实现了Button控件所需的基本功能. System.Windows.F ...
- xcode设置 - App内存暴增
当你发现你的项目中什么没有写,只是启动App内存就飙升到50M甚至60M以上,那么请你接着往下看吧,本文对你绝对非常有用! 1. Enable zombie object: 为了方便我们调试程序,我们 ...
- 【更新链接】U盘启动制作工具(UDTOOL) v3.0.2014.0427
[校验值] 文件: UDTOOLV3_Setup.exe大小: 525 MB版本: 3.0.2014.0427时间: 2014年4月27日MD5: 2E5187B7D9081E8A69B4DC45C8 ...
- Unity寻路的功能总结
源地址:http://blog.csdn.net/sgnyyy/article/details/21878163 1. 利用Unity本身自带的NavMesh 这篇文章已经比较详细,可能对于很多需要a ...
- 深入浅出 Java 8 Lambda 表达式
摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系 OneAPM 工程师编译整理. Java 是一流的面向对象语言,除了部分简 ...
- Unix/Linux下如何使用Vi编辑器
vi 的工作模式 Vi 在初始启动后首先进入编辑模式,这时用户可以利用一些预先定义的按键来移动光标.删除文字. 复制或粘贴文字等.这些按键均是普通的字符,例如 l 是向右移动光标,相当于向右箭头键,k ...
- codeforces #313 div1 B
模拟判定就可以了 判定字符串是否相等用hash来判断 QAQ 值得一提的是一开始我交的时候T了 结果我将递归的顺序调整了一下就A了 (并不知道为什么 #include<cstdio> #i ...