关于 XML standalone 的解释
XML standalone 定义了外部定义的 DTD 文件的存在性. standalone element 有效值是 yes 和 no. 如下是一个例子:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE s1 PUBLIC "http://www.ibm.com/example.dtd" "example.dtd">
<s1>.........</s1>
值 no 表示这个 XML 文档不是独立的而是依赖于外部所定义的一个 DTD. 值 yes 表示这个 XML 文档是自包含的(self-contained).
Categorized in: Java, SOA · Tagged with: Java, XML
Java 程序中如何对 XML 文档进行验证?
Table Of Content
Introduction
Validation when parsing
Validation against preparsed schema
Validate a DOMSource or SAXSource against preparsed schema
Introduction
XML 作为一种数据存储和描述语言,这些年得到了广泛运用,尤其以web服务为代表。XML之所以广受欢迎,原因之一是它具有丰富的数据描述手段,你甚至可以对要存储的数据做出各种限制: 字符串长度,数字大小,等等。
最早的XML使用DTD(Document Type Definition)进行定义,后来人们又发明了XML Schema。XML Schema本质上也是一种XML,这相比DTD大大减少了学习曲线,而且XML Schema提供了更丰富的校验机制。
参看《XML Schema 与 XML DTD 的技术比较与分析》,有更详细的比较。
Categorized in: Java, SOA · Tagged with: Java, schema, XML
Dynamic Proxy Classes
本文翻译自 Java SE 6 Technotes -《Dynamic Proxy Classes》, 少部分内容取自 Java SE API 中文版.
Table Of Contents
Introduction
Dynamic Proxy API
Serialization
Examples
Introduction
一个动态代理类(dynamic proxy class)是实现了一组在运行期指定的接口的类, 通过已实现接口中的某个接口而对代理类某实例的方法调用将被编码并分派给另一个具有同一接口的对象上(a method invocation through one of the interfaces on an instance of the class will be encoded and dispatched to another object through a uniform interface). 因此, 一个动态代理类可用于为一组接口创建类型安全的代理对象而不需预先(例如使用编译期工具)生成这些代理类. 对一个动态代理类的某个实例进行方法调用会被分派给该实例调用处理器(invocation handler)中的某一方法, 且这些调用会以一个 java.lang.reflect.Method 对象(标识要调用的这些方法)和一个类型为 Object 的数组(包含方法参数信息)进行编码.
对于那些需要提供对(实现接口的)对象的调用进行安全的反射分派(type-safe reflective dispatch of invocations on objects)的应用程序或者库来说, 动态代理类是非常有用的. 例如, 一个应用程序可以使用一个动态代理类去创建一个实现多个任意(继承自java.util.EventListener)事件监听器接口的对象, 以一种统一风格去处理各种各样的不同类型事件, 例如将所有这样的事件记录到一个文件中.
Dynamic Proxy Class API
一个动态代理类(dynamic proxy class) (以下简单引用为代理类(proxy class)) 是一个实现了一组在运行期间所指定的接口列表的类.
Read more »
Categorized in: Design Patterns, Java · Tagged with: AOP, Java
Java Scripting Programmer’s Guide
Java 6 引入了 script 功能, 使得很多 script language 可以运行于 Java VM 中. 这会给我们的很多应用带来很有趣又很有用的特性, 比如将一些(需动态改变的)业务逻辑交给这些 script language 来处理. 本文翻译自 <Java Scripting Programmer’s Guide>.
———————————————————
Table Of Content
- Who is the Java Scripting API For?
- Scripting Package
- Examples
- JavaScript Script Engine
- JavaScript to Java Communication
- Implementing Your Own Script Engine
- References
Who is the Java Scripting API For?
脚本语言的一些有用特性有:
- 方便(Convenience): 大部分脚本语言是动态类型的(dynamically typed). 你常常可以创建新的变量而不需声明变量的类型, 并且你可以重用这些变量去存储其它不同类型的对象. 脚本语言也倾向于对许多类型进行自动转换, 例如, 在必要时将数字 10 转化为文本 “10″.
- 快速开发雏型(Developing rapid prototypes): 你完全可以避免 编写-编译-运行 这一周期, 而仅仅 编辑-运行!
- 应用程序的扩展/定制(Application extension/customization): 你可以将你的应用程序的某些部分”外部化(externalize)” – 像配置脚本, 业务逻辑/规则 和用于财务应用程序的数学运算表达式.
- 用于应用程序的”命令行”shell (“Command line” shells for applications) – 这可用于 debugging, runtime/deploy 期间配置等. 现在, 大部分应用程序都有一个 web-based GUI 配置工具. 但 系统管理员/部署员 常常倾向于使用命令行工具. 因此, 可以使用一个标准的脚本语言, 而不需为该目的重新发明特定脚本语言.
JavaTM Scripting API 是一个独立于脚本语言的框架, 用于在 Java 代码中使用脚本引擎. 通过使用 Java Scripting API, 使得通过 Java 语言编写 可定制的/可扩展的 应用程序成为可能, 终端用户可以自行选择用于定制目的的脚本语言. Java 应用程序开发人员在开发期间不需选择扩展语言. 如果你使用 JSR-223 API 编写你的程序, 那么你的用户就可以使用任何 JSR-223 兼容的脚本语言.
Categorized in: Java · Tagged with: Java, Scripts
使用 netbeans 6.5 创建 firefox 扩展
今天偶然在 Sun 中国网站上发现这样一篇文章, 介绍如何使用 netbeans 及其插件开发 firefox 及其它 Mozilla 程序的 addons. 文章写得很简短、很清楚.
该 Netbeans 插件叫做 foxbeans, 可从 http://plugins.netbeans.org/ 找到
Categorized in: Java · Tagged with: Addon, Browser, Firefox, NetBeans, Plugins
探讨JAR文件无限可能性(转载)
所有Java开发者都知道JAR文件只是包含Java类树的压缩(ZIP)文件。但是,不是人人(包括一些经验丰富的开发者)了解这种文件格式的其它优点。在本文中,我将简单介绍JAR文件格式,并说明利用它可以实现的各种可能性。
JAR文件简介
JAR文件以流行的二进制ZIP文件格式为基础,用以把许多文件合并成一个文件。它还包含一个名为META-INF的可选目录,这个目录位于文件根目录下。
有两种方法可以建立JAR文件:应用命令行工具jar,或使用Java中的java.util.jar API编程。如果JAR文件包含在Java类路径中,使JVM可看到它,则JAR文件包含Java类和/或可由类加载器运行、使用及加载的资源。
在许多情况下,JAR文件不仅仅是简单的Java类档案文件和/或资源;它们还可用来为应用程序和扩展建立语句块。META-INF目录(如存在)用于存储数据包和扩展配置数据,包括安全、版本、扩展和服务。
META-INF目录的作用
META-INF目录中的下列文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务:
- MANIFEST.MF:清单文件,用来定义与扩展和数据包相关的数据。
- INDEX.LIST:这个文件由JAR工具的新“-i”选项生成,其中包含在一个应用程序或扩展中定义的数据包的地址信息。它是JarIndex的一部分,被类加载器用来加速类加载过程。
- x.SF:JAR文件的签名文件。x代表基础文件名。
- x.DSA:这个签名块文件与同名基础签名文件有关。此文件存储对应签名文件的数字签名。
- services/:这个目录存储所有服务提供程序配置文件。
下面我们来了解一下每种组合。
Categorized in: Java · Tagged with: Java
也谈谈 JAAS
JAAS (Java Authentication and Authorization Service) 自 J2SDK 1.3 以可选的扩展包方式引入, 而到了 J2SDK 1.4 则完全集成进来.
JAAS 主要有两种用途:
- 认证用户: 确认用户是谁.
- 授权用户: 决定用户具有哪些权限才能执行特定代码.
之前的 Java 沙箱(sandbox)完全是基于代码来源(codesource-based)进行访问控制, 显然与当前 RBAC (Role-Based Acess Control) 理念有差距. JAAS 在此基础上, 增强了授权方面的支持.
下面将从这两方面介绍 JAAS. 在这之前, 先介绍一些概念.
Subject
表示请求实体, 最常见的就是一个人. 每个 subject 都会有一个或多个身份标识, 即 principal. subject 也可能具有一些安全相关的属性, 即 credential.
Principals
标识 subject 的身份, 如 身份证, 保险号等.
Credentials
credential 并非 JAAS 核心类库的一部分, 任何 class 都可以作为 credetial.
一. Authentication
对于访问程序的请求者, 首先要做的就是验证这个人是可靠的、可信任的吗? JAAS 提供了一种可插拔的方式 (Pluggable Authentication Module,PAM) 来执行这种认证, 即使要增加新的验证模块, 也不需要更改现有程序, 要做的仅仅是将新的认证模块插入到 JAAS 安全体系中.
Categorized in: Java · Tagged with: Java
Reading – Java™ Servlet Specification Version 2.4 – Mapping Requests to Servlets
Use of URL Paths
当 Web container 接到请求后, 首先确定将这个请求 forward 给哪个 Web application. 首先确定这个 Web application 的 context path 与 request URL 开始部分相匹配. URL 中相匹配的部分就是 context path.
Web container 接下来必须定位由哪个 servlet 来处理这个 request, 使用如下描述的 path mapping 步骤. 用于映射到一个 servlet 的 path 是 request URL 减去 context path 和 path parameters. 下面的 URL path mapping rules 要按顺序进行. 第一个成功匹配的 servlet 将用于请求处理, 而不会继续进行匹配:
- container 会尝试将 request path 与 servlet path 进行精确匹配. 如果成功, 那么就选择这个 servlet.
- container 会递归尝试匹配最长路径前缀(path-prefix). 使用 ’/’ 作为路径分隔符, 每次去掉 path tree 上的一个路径, 进行匹配. 具有最长长度的那次匹配所选择的 servlet 用来处理请求.
- 如果 URL path 尾部包含一个 extension (e.g. .jsp), servlet container 会尝试匹配是否有这样的 servlet 用来处理带有这种扩展的请求.
- 如果前 3 步都没有 servlet 匹配成功, container 会尝试为该请求提供合适内容(the container will attempt to serve content appropriate for the resource requested). 如果为该 application 定义了 “default” servlet, 那么就会使用这个 servlet.
进行匹配时, container 必须对字符串进行大小写敏感比较.
Specification of Mappings
在 Web application 部署描述中, 可使用下面这些句法定义 mappings:
- 以一个 ‘/’ 字符开头并以一个 ‘/*’ 结尾的字符串用于路径映射.
- 以一个 ‘*.’ 开头的字符串用于扩展映射.
- 只包含 ’/’ 字符串表示这是这个 application 的 “default” servlet. 在这种情形下, servlet path 是 request URI 减去 context path, path info 是 null.
- 其它所有字符串只用于精确匹配.
Implicit Mappings
如果 container 具有 JSP container, *.jsp 扩展用于映射 JSP, 允许 JSP pages 按需要执行. 这种映射叫做 implicit mapping. 如果 Web application 定义了一个 *.jsp mapping, 这个 mapping 优先于 implicit mapping.
servlet container 也可做其它 implicit mappings, 只要能让 explicit mappings 优先即可.

(
(4.00 out of 5)