使用Java与XSLT的10条技巧

这篇文章从书中选出了我认为非常重要的10条技巧。但实际上这有限的10条只是粗略的描述了什么是可能的。其中大多数都集中在JavaXSLT的组合上,而不是在XSLT(可扩展样式表转换)技术规范。而更详细的信息,在文章结尾处指出了一些有价值的资源。
    
基本的XSL转换是非常简单的:一个或多个包含着指令的XSLT样式表,这些指令定义了如何把XML数据转换成其他格式。XSLT处理器完成实际的工作;Sun微系统的Java API for XML Processing (JAXP)为不同种类的处理器提供了一套标准的Java接口。这里有一个用JAXPAPI执行XSL转换的简单例子:

import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
public class Transform {
  /**
   * Performs an XSLT transformation, sending the results
   * to System.out.
   */
  public static void main(String[] args) throws Exception {
    if (args.length != 2) {
      System.err.println("Usage: java Transform [xmlfile] [xsltfile]");
      System.exit(1);
    }
    File xmlFile = new File(args[0]);
    File xsltFile = new File(args[1]);     // JAXP reads data using the Source interface
    Source xmlSource = new StreamSource(xmlFile);
    Source xsltSource = new StreamSource(xsltFile);
    // the factory pattern supports different XSLT processors
    TransformerFactory transFact = TransformerFactory.newInstance();
    Transformer trans = transFact.newTransformer(xsltSource);
    trans.transform(xmlSource, new StreamResult(System.out));
  }
}

    你可以点击这里下载一个很小的ZIP文件,这个文件包含了这个例子以及相应的XSLT样式表和XML数据文件。其中的README文件解释了怎样编译和运行这个例子。
    
这个这个例子是利用StreamSource从文件中读取数据,JAXP还能从SAX解释器或DOM树来读取XML数据。下面依次介绍我推荐的10条技巧:

1 尽可能使用缓存。
    
执行XSLT转换是很耗费CPU和内存的,所以在任何时候进行可能的优化都是很有意义的。使用由XSLT驱动的Web应用,提高它的实时运行性能表现的最好方法之一就是使用各种类型的缓存技术。
    
图一举例说明了一个典型的使用XSL对数据库进行转换的Web应用。


图一、典型的XSL转换


    
与动态生成的XML不同,XSLT样式表是静态存储在文件中的。由于这些文件很少被改动,就可以用JAXPjavax.xml.transform.Templates接口把它们解析好了进内存里缓存起来。下面这个程序片断解释了这个过程是怎样完成的:

Source xsltSource = new StreamSource(xsltFile);
TransformerFactory transFact = TransformerFactory.newInstance();
Templates cachedXSLT = transFact.newTemplates(xsltSource);
Transformer trans = cachedXSLT.newTransformer();

    XSLT样式表通过Templates接口缓存进了内存中,现在它就可以被重复用于很多不同的转换里。最重要的好处是,这样就避免了重复把XSLT解析进内存。它也给了XSLT处理器一个机会来优化转换指令,就象编译器优化软件那样。
    
有人可能会想是否可以把XML数据也缓存进内存中。对于那些高度动态和个体化的应用,XML数据是随着每一个客户请求而动态生成的并随时都在变化。对于这种应用,缓存是不实际的。对于很多其它类型的应用,XML数据可能改变的不是很频繁。当数据改变不是很频繁时,相对于缓存XML数据,将转换后的结果缓存可能更有意义。这是一种最快的可行性解决方案,推荐在任何可行的情况下使用。

2、部署前做测试。
    
在开发Web应用项目选择XMLXSLT的关键在于可以清楚的把数据、程序逻辑和表达分开。Java代码与后台数据源交互并生成XML数据,XSLT样式表把XML数据转换为XHTML(或WML,或其它),然后浏览器显示结果。
    
这种结构的一个独特的,然而时常被忽略的好处是它支持自动单元测试的能力。象JUnit这样的工具鼓励程序员去写适合自动单元测试的套件。这些测试大大的减少了在系统中加入新特性时所产生的错误。考虑一下一个典型的Java+XML+XSLT网站的这些组件:

·  Java实现商业逻辑。由于Java代码没有和表达逻辑混在一起,就可以象其他任何Java代码一样测试它。

·  把应用数据转换为XML。这一步是特别容易的。只要生成XML然后用一个DTD或一个XML Schema验证它就行了。

·  XML转换为XHTML。同样的,生成的XHTML可以用一个XHTML DTD来验证。虽然这样做不能证明信息是正确的,但是的确能保证XHTML被正确的生成而且是有效的。

    与很多其它的Web开发技术不同,测试这些单元中的任何一个都不用将其部署到Web服务器上。这使自动单元测试更容易被实现,自动单元测试也是极限编程(XP

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。<br>第1章 Java基础 <br>1.1 转换基本数据类型 <br>1.2 Java的运算符 <br>1.3 控制程序的流程 <br>1.4 计算阶乘 <br>1.5 实现命令行程序 <br>第2章 Java面向对象程序设计 <br>2. 1 复数类 <br>2. 2 equals.chashCode和clone方法 <br>2. 3 Java的参数传递 <br>2. 4 自定义形状类 <br>2. 5 类的加载顺序 <br>2. 6 方法和变量在继承时的覆盖与隐藏 <br>2. 7 排序类 <br>2. 8 Singleton单例模式 <br>2. 9 Factory工厂模式 <br>2. 10 Adapter适配器模式 <br>第3章 数字 <br>3. 1 数字与数字封装类 <br>3. 2 格式化数字 <br>3. 3 数字的舍入 <br>3. 4 转换数字的进制 <br>3. 5 生成随机数 <br>3. 6 处理大数字 <br>第4章 数组与集合 <br>4. 1 使用Arrays <br>4. 2 求质数. <br>4. 3 动态调整数组长度 <br>4. 4 矩阵 <br>4. 5 ArrayList. Vector和LinkedList <br>4. 6 生成不重复的随机数序列 <br>4. 7 自定义队列 <br>4. 8 对List排序 <br>4. 9 HashSet. LinkedHashSet和TreeSet <br>4. 10 列表. 集合与数组的互相转换 <br>4. 11 HashMap. Hashtable. LinkedHashMap和TreeMap <br>4. 12 对Map排序 <br>4. 13 Properties属性文件 <br>第5章 字符串 <br>5. 1 使用String <br>5. 2 基本数据类型与字符串的转化 <br>5. 3 判断Java标识符 <br>5. 4 使用StringBuffer <br>5. 5 IP地址转化成整数 <br>5. 6 18位身份证格式验证 <br>5. 7 表达式解析器 <br>5. 8 字符串编码的转换 <br>5. 9 字符串对齐器 <br>5. 10 密码加密与验证 <br>5. 11 制作命令行程序 <br>5. 12 使用StringTokenizer <br>5. 13 使用正则表达式操作字符串 <br>5. 14 使用正则表达式验证电话号码的格式 <br>第6章 Java异常处理 <br>6. 1 throw. throws. try和catch <br>6. 2 自定义异常类 <br>6. 3 使用finally <br>6. 4 使用异常的技巧与原则 <br>第7章 IO——输入输出流 <br>7. 1 获取文件的属性信息 <br>7. 2 列出指定目录下的文件 <br>7. 3 创建文件和目录 <br>7. 4 删除文件和目录 <br>7. 5 移动文件和目录 <br>7. 6 复制文件和目录 <br>7. 7 一个简单的文件搜索器 <br>7. 8 读文件 <br>7. 9 写文件 <br>7. 10 添加内容到文件尾 <br>7. 11 文件的分割与合并 <br>7. 12 从键盘接收数据并输出到文件 <br>7. 13 使用StreamTokenizer统计文件的字符数 <br>7. 14 序列化和反序列化对象 <br>7. 15 控制对象的序列化和反序列 <br>7. 16 读jar包的资源文件 <br>7. 17 用Zip格式压缩和解压缩文件 <br>7. 18 操作Excel文件 <br>7. 19 操作PDF文件 <br>7. 20 自定义日志文件类 <br>第8章 线程 <br>8. 1 定义和启动线程 <br>8. 2 停止线程 <br>8. 3 线程的互斥 <br>8. 4 线程的协作 <br>8. 5 线程join <br>8. 6 生产者. 消费者问题 <br>8. 7 线程优先级 <br>8. 8 列出虚拟机中所有的线程 <br>8. 9 守护线程Daemon <br>8. 10 线程池 <br>8. 11 一个死锁的例子 <br>8. 12 定时器Timer <br>第9章 Java GUI <br>9. 1 日历 <br>9. 2 开窗户游戏 <br>9. 3 标准型计算器 <br>9. 4 更改组件的外观 <br>9. 5 自定义对话框 <br>9. 6 制作欢迎画面 <br>9. 7 一个简单的编辑器 <br>9. 8 Swing的Drag和Drop <br>第10Java图形 <br>10. 1 一个圆形的按钮 <br>10. 2 捕捉屏幕 <br>10. 3 缩放图片 <br>10. 4 2D图形 <br>10. 5 3D图形.. <br>10. 6 一个时钟程序 <br>第11章 Java多媒体 <br>11. 1 滚动的消息 <br>11. 2 三维弹球 <br>11. 3 贪吃蛇游戏 <br>11. 4 Java声音处理 <br>11. 5 媒体播放器 <br>第12章 反射 <br>12. 1 instanceof操作符 <br>12. 2 获取类的信息 <br>12. 3 动态调用类的方法 <br>第13章 网络编程 <br>13. 1 获取URL的信息 <br>13. 2 Web浏览器 <br>13. 3 获取IP地址和域名 <br>13. 4 HTTP客户端 <br>13. 5 基本的Socket编程 <br>13. 6 HTTP服务器 <br>13. 7 一个支持多线程的服务器框架 <br>13. 8 代理服务器 <br>13. 9 Telnet客户端 <br>13. 10 UDP编程 <br>13. 11 聊天室服务器端 <br>13. 12 聊天室客户端 <br>13. 13 FTP客户端 <br>第14章 数据库 <br>14. 1 连接各种数据库 <br>14. 2 获得数据库和表的元数据 <br>14. 3 查询和更新数据库 <br>14. 4 批处理 <br>14. 5 提交与回滚事务 <br>14. 6 使用PreparedStatement <br>14. 7 读写二进制数据 <br>14. 8 读写Blob数据 <br>14. 9 使用ResultSet更新数据库 <br>14. 10 使用RowSet <br>14. 11 调用存储过程 <br>14. 12 一个数据库连接池 <br>第15章 Applet <br>15. 1 Applet时钟 <br>15. 2 处理鼠标和键盘事件 <br>15. 3 英文打字游戏 <br>15. 4 Applet间通信 <br>15. 5 汉诺塔游戏 <br>第16章 J2SE 5. 0新特性 <br>16. 1 自动装箱和拆箱 <br>16. 2 新的for循环 <br>16. 3 枚举类型 <br>16. 4 静态导入 <br>16. 5 可变长参数Varargs <br>16. 6 格式化输出 <br>16. 7 使用ProcessBuilder执行本地命令 <br>16. 8 泛型编程 <br>16. 9 注释功能Annotation <br>16. 10 监控与管理虚拟机 <br>16. 11 线程——Callable和Future <br>16. 12 线程——任务执行架构 <br>16. 13 线程——锁Lock <br>16. 14 线程——件Condition <br>16. 15 线程——Semaphore <br>16. 16 线程——CountDownLatch <br>16. 17 线程——Cycli Barrier <br>16. 18 线程——Exchanger <br>16. 19 线程——BlockingQueue <br>第17章 JavaXML <br>17. 1 用DOM处理XML文档 <br>17. 2 用SAX处理XML文档 <br>17. 3 用XSLT转换XML <br>17. 4 对象与XML的转换 <br>第18章 Java Mail <br>18. 1 使用SMTP协议发送简单邮件 <br>18. 2 发送带附件的邮件 <br>18. 3 给多人发送邮件 <br>18. 4 使用POP3接收邮件 <br>第19章 JSP与Servlet <br>19. 1 获取客户端的真实IP地址 <br>19. 2 设置矛口读取Cookie <br>19. 3 JSP无刷新聊天室 <br>19. 4 上传文件 <br>19. 5 用Servlet生成图形验证码 <br>19. 6 用Servlet实现分页查看数据库 <br>
内容: 1 转换基本数据类型;运算符;计算阶乘; 2 复数类;java的参数传递;自定义形状类;类的加载顺序;方法和变量在继承时的覆盖和隐藏;排序类; 3数字 数字类;格式化数字;转换数字进制;生成随机数; 4数组和集合 使用Arrays类;动态调整数组长度;java为数据结构中的列表定义了一个接口类java.util.list同时提供了3个实现类,分别是ArrayList、Vector、LinkedList使用; 生成不重复的随机数序列;列表、集合与数组的互相转换;java为数据结构中的映射定义一个接口java.util.Map,有四个实现类HashMap Hashtable LinkedHashMap TreeMap用法和区别;对Map排序; 5字符串 使用String;判断一个字符串是否是合法的java标识符;使用StringBuffer;IP地址转化成整数,整数转化成IP地址; 十八为身份证格式验证;表达式解析器;字符串编码的转换;字符串对齐器;密码加密和验证(MD5); 制作命令行程序;使用正则表达式操作字符串;使用正则表达式验证电话号码的格式; 6java异常处理 throw和throws、try和catch;自定义异常类;使用finally;使用异常的技巧和原则; 7 IO输入输出流 获取文件的基本信息;列出指定目录下的文件,并可过滤文件;创建文件和目录;删除文件和目录;移动文件和目录; 复制文件和目录;一个简单的文件搜索器; 多种方式读文件内容, 按字节读取文件内容、按字符读取文件内容、按行读取文件内容、随机读取文件内容; 多种方式写文件内容, 按字节写文件内容、按字符写文件内容、按行写文件内容 ; 添加内容到文件结尾;文件的分割和合并;使用StreamTokenizer统计文件的字符数; 序列化和反序列化对象(将不长用的对象暂时持久化到文件中为对象的序列化,反之用时再把对象恢复到内存为反序列化); 控制对象的序列化和反序列化; 读jar包的资源文件;用zip格式压缩 和解压文件;操作Excel文件;操作Pdf文件;自定义日志文件类; 8线程 线程的启动 和停止;线程的互斥;线程的协作;线程join;生产者、消费者问题;线程的优先级;列出虚拟机中所有的线程;守护线程Daemon;线程池;一个死锁的例子; 定时器Timer:包括在指定时间执行任务,在指定时间之后执行任务以及在某个时间之后每隔时间段重复执行的任务; 9 Java GUI 日历:使用swing和awt实现一个图形化的日历可以查询星期、日期和年份信息(CalenderTrain.java);标准计算器(Callulator.java);更改组建外观,对日历设置几个显示外观(lookandfeel.java);自定义对话框DialogWindows;制作欢迎界面SplashWindow.java; 10 java图形 一个圆形按钮,当单击按钮时颜色发生变化CircleButton.java; 捕捉屏幕相当于键盘上的PrintScreen,CsreenCaputure.java; 缩放图片JPGTransforme.java; 2d图形,实现一个2d画板,能够画2d的线、圆和矩形,能指定图形的颜色并且能够撤销和恢复图形,command.java; 3d图形,Graphic3d.java; 一个时钟程序,能够显示星期和日期,变化背景和透明度Clock.java; 11 java多媒体 滚动的消息,实现一个简单的动画,具有滚动效果的文本消息RollingMessage.java; 三维弹球,BouncingB.java; 贪吃蛇游戏SnakeModel.java; java的声音处理,介绍java中如何处理声音,包括实现响铃,播放wav,au等音频文件,以及控制声音的大小和音量,Beep.java; 媒体播放器,JMFMediaPlayer.java; 12反射 是java程序开发的特征之一,允许java程序对自身进行检查,并能直接操作程序的内部属性; instanceof操作符,instanceof.java; 获取类的信息,ViewClassInfoJrame.java; 动态调用类的方法,CallMetod.java; 13、网络编程 获取URL信息,主要是使用URLConnection类,GetUrlInfo.java; web浏览器,webbrowser.java; 获取IP地址和域名,GetIpAddress.java; Http客户端,httpClient.java; 基本socket编程,介绍socket编程的基本步骤,启动socket服务器后,在打开socket的客户端,在输入框里输入消息发送到服务器,服务器受到消息后返回给客户端; Http服务器,httpsever.java; 一个支持多线程的服务器框架,GeneralServer.java; 代理服务器,ProxyServer.java; telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; UDP编程,包括收发udp报文; 聊天室服务器端,Chatserver.java;聊天室客户端,ChatClient.java; Ftp客户端,Mainframe.java; 14数据库 连接各种数据库DBconnector.java; 获得数据库和表的元数据Getmetadata.java; 查询和更新数据库OperateDatadb.java; 批处理,介绍如何一次执行一批sql语句,这些sql语句用插入、更新和删除等相关操作; 提交和回滚transaction.java使用PreparedStatement,动态执行sql语句,UsingPreparedStatement.java; 读写二进制数据,BinaryData.java; 读写Blob数据,blob数据常以二进制形式存储比较大的文件数据,如图片、视频文件等,本文介绍如何往数据库中读写blob数据,BlobData.java使用ResultSet更新数据库,UpdateWithResultSet.java使用RowSet,.UsingRowSet.java; 调用存储过程,StorageProcedure.java; 一个数据库连接池,JDBCInfo.java; 15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容java的web浏览器中运行的程序; applet时钟,Clock.java; 处理鼠标和键盘,用户在applet上按下键盘时,该实列能把按下的建显示出来,点击鼠标时能把鼠标事件和鼠标坐标显示出来,MouseAndKeyapplet.java; 英文打字小游戏,TypingGame.java; applet间通信; 汉诺塔游戏, 16 j2se5.0 新特性 自动装箱和拆箱; 新的for循环; 枚举类型; 静态导入; 格式化输出; 使用ProcessBuilder执行本地命令; 泛型编程; 监控和管理虚拟机;新的线程执行架构; 线程锁; 线程件; 线程同步装置:semaphore countdownlatch cyclicbarrier exchanger; 17 javaxml 用dom处理xml文档; 用sax处理xml文档; 用xslt转换xml; 对象与xml的转换; 18 java mail 使用smtp协议发送简单邮件; 发送带附件的邮件; 给多人发送邮件; 使用pop3接收邮件; 19jsp与servlet 获取客户端的真实ip地址; jsp无刷新聊天室; 设置和读取cookie; 上传文件; 用servlet生成图形验证码; 用servlet实现分页查看数据库;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值