??xml version="1.0" encoding="utf-8" standalone="yes"?>桃乃木かなav在线播放,国产黄在线观看免费观看不卡,中文字幕亚洲一区二区av在线http://www.aygfsteel.com/Timnity/category/6491.htmlzh-cnTue, 27 Feb 2007 08:46:23 GMTTue, 27 Feb 2007 08:46:23 GMT60巧用JDOM中的XMLOutputterc{换XML文g的编码类?/title><link>http://www.aygfsteel.com/Timnity/archive/2005/12/29/25953.html</link><dc:creator>Timnity</dc:creator><author>Timnity</author><pubDate>Thu, 29 Dec 2005 13:51:00 GMT</pubDate><guid>http://www.aygfsteel.com/Timnity/archive/2005/12/29/25953.html</guid><wfw:comment>http://www.aygfsteel.com/Timnity/comments/25953.html</wfw:comment><comments>http://www.aygfsteel.com/Timnity/archive/2005/12/29/25953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Timnity/comments/commentRss/25953.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Timnity/services/trackbacks/25953.html</trackback:ping><description><![CDATA[<P>XML文g的编码不?使用有的~辑器打开?其中的中文经怼出现q.如何解决q个问题?下面我将讲一下如何用JDOM中的XMLOutputterc进行{换XML文g的编?</P> <P>使用XMLOutputter转换XML文g的编码例子代码片?/P> <P>    SAXBuilder builder = new SAXBuilder();<BR>    Document doc;<BR>    Format format = Format.getPrettyFormat();<BR>    format.setEncoding("GB2312");<BR>    XMLOutputter outputter = new XMLOutputter();<BR>    outputter.setFormat(format);<BR>    File file = new File(realPath);<BR>    doc = builder.build(file);<BR>    String xmlString = outputter.outputString(doc);</P><img src ="http://www.aygfsteel.com/Timnity/aggbug/25953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Timnity/" target="_blank">Timnity</a> 2005-12-29 21:51 <a href="http://www.aygfsteel.com/Timnity/archive/2005/12/29/25953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDOM处理XML快速上手[转]http://www.aygfsteel.com/Timnity/archive/2005/12/29/25954.htmlTimnityTimnityThu, 29 Dec 2005 13:51:00 GMThttp://www.aygfsteel.com/Timnity/archive/2005/12/29/25954.htmlhttp://www.aygfsteel.com/Timnity/comments/25954.htmlhttp://www.aygfsteel.com/Timnity/archive/2005/12/29/25954.html#Feedback0http://www.aygfsteel.com/Timnity/comments/commentRss/25954.htmlhttp://www.aygfsteel.com/Timnity/services/trackbacks/25954.html 最q的工作常常要和XML格式的文档或字符串打交道Q发现用JDOM来做真是方便。可以实现XML应用E序的快速开发?

    ?JDOM 中,XML 元素是 Element 的实例,XML 属性就?Attribute 的实例,XML 文档本n是 Document 的实例?BR>    因ؓ JDOM 对象是?Document、Element ?Attribute q些cȝ直接实例Q因此创Z个新 JDOM 对象如?Java 语言中?new 操作W一样容易。JDOM 的用是直截了当的?BR>    JDOM 使用标准?Java ~码模式。只要有可能Q它使用 Java new 操作W而不故弄玄虚使用复杂的工厂化模式Q对象操作即便对于初学用户也很方便?BR>   
    本文分两步对JDOM的应用加以介l:XML创徏 ?XML解析
一、XML文档创徏
    我们由零开始利用JDOM生成一个XML文档。最后的l果(h文档)看v来象q样Q?BR>    <?xml version="1.0" encoding="UTF-8"?>
    <MyInfo comment="introduce myself">
        <name>kingwong</name>
        <sex value="male"/>
        <contact>
            <telephone>87654321</telephone>
        </contact>
    </MyInfo>
    1.?MyInfo 为根元素创徏文档
        Element rootElement = new Element("MyInfo");//所有的XML元素都是 Element 的实例。根元素也不例外Q)
        Document myDocument = new Document(rootElement);//以根元素作ؓ参数创徏Document对象。一个Document只有一个根Q即root元素?BR>    2.l根元素d属?BR>        Attribute rootAttri = new Attribute("comment","introduce myself");//创徏名ؓ commnet,gؓ introduce myself 的属性?BR>        rootElement.setAttribute(rootAttri);//刚创徏的属性添加到根元素?BR>        q两行代码你也可以合成一行来写,象这P
        rootElement.setAttribute(new Attribute("comment","introduce myself"));
        或?BR>        rootElement.setAttribute("comment","introduce myself");
    3.d元素和子元素
        JDOM里子元素是作?contentQ内容)d到父元素里面ȝ,所谓content是cM上面h文档?lt;name></name>之间的东东,即kingwong。罗嗦了Ҏ吧:Q?BR>        Element nameElement = new Element("name");//创徏 name 元素
        nameElement.addContent("kingwong");//kingwong作ؓcontentd到name元素
 rootElement.addContent(nameElement);//name元素作ؓcontentd到根元素
 
 q三行你也可以合Z句,象这P
 rootElement.addContent((Content)(new Element("name").addContent("kingwong")));//因ؓaddContent(Content child)Ҏq回的是一个Parent接口Q而Elementcd时承了Contentcd实现了Parent接口Q所以我们把它造型成Content?BR> 
        我们用同LҎd带属性的子元?lt;sex value="male"/>
        rootElement.addContent(new Element("sex").setAttribute("value","male"));//注意q里不需要{型,因ؓaddAttribute(String name,String value)q回值就是一?Element?BR>       
        同样的,我们d<contract />元素到根元素下,用法上一P只是E微复杂了一些:
        rootElement.addContent((Content)(new Element("contact").addContent((Content)(new Element("telephone").addContent("87654321")))));
        如果你对q种写Ş式还不太习惯Q你完全可以分步来做Q就象本节刚开始的时候一栗事实上如果层次比较多,写成分步的Ş式更清晰些,也不Ҏ出错?BR>    4.删除子元?BR>        q个操作比较单:
        rootElement.removeChild("sex");//该方法返回一个布?BR>       
        到目前ؓ止,我们学习了一下JDOM文档生成操作。上面徏立了一个样本文档,可是我们怎么知道对不对呢Q因此需要输出来看一下。我们将JDOM生成的文档输出到控制収ͼ使用 JDOM ?XMLOutputter cR?BR>    5.  ?JDOM 转化?XML 文本
        XMLOutputter xmlOut = new XMLOutputter("  ",true);
 try {
  xmlOut.output(myDocument,System.out);
 } catch (IOException e) {
  e.printStackTrace();
 }
 XMLOutputter 有几个格式选项。这里我们已指定希望子元素从父元素羃q两个空|q且希望元素间有I?BR> new XMLOutputter(java.lang.String indent, boolean newlines)q个Ҏ在最新版本中已经不徏议用。JDOM有一个专门的用来定义格式化输出的c:org.jdom.output.FormatQ如果你没有Ҏ的要求,有时候用里面的几个静态方法(应该可以说是预定义格式)?getPrettyFormat()可以了。我们把上面的输出格式稍微改一下,pq样Q?BR> XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat()); 
    6.JDOM文档转化为其他Ş?BR>        XMLOutputter q可输出?Writer ?OutputStream。ؓ了输出JDOM文档C个文本文Ӟ我们可以q样做:
        FileWriter writer = new FileWriter("/some/directory/myFile.xml");
        outputter.output(myDocument, writer);
        writer.close();
       
        XMLOutputter q可输出到字W串,以便E序后面q行再处?
        Strng outString = xmlOut.outputString(myDocument);
       
        当然Q在输出的时候你不一定要输出所有的整个文档Q你可以选择元素q行输出Q?BR>        xmlOut.output(rootElement.getChild("name"),System.out);
        一句话QJDOM非常灉|方便Q如果你惌一步研IJDOMQ请到官方网站去看一看:http://www.jdom.org

    本节CZ源码Q?BR>package com.cyberobject.study;

import java.io.IOException;

import org.jdom.Attribute;
import org.jdom.Content;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 * @author kingwong
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class TestJDOM {

 public static void main(String[] args)
 {
  Element rootElement = new Element("MyInfo");
  Document myDocument = new Document(rootElement);
  
//  Attribute rootAttri = new Attribute("comment","introduce myself");
//  rootElement.setAttribute(rootAttri);
  
  rootElement.setAttribute("comment","introduce myself");
  //rootElement.setAttribute(new Attribute("comment","introduce myself"));
//  Element sexElement = new Element("sex");
//  rootElement.addContent(sexElement);
  
//  Element nameElement = new Element("name");
//  nameElement.addContent("kingwong");
//  rootElement.addContent(nameElement);
  
  rootElement.addContent((Content)(new Element("name").addContent("kingwong")));
  rootElement.addContent(new Element("sex").setAttribute("value","male"));
  rootElement.addContent((Content)(new Element("contract").addContent((Content)(new Element("telephone").addContent("87654321")))));
  
  rootElement.removeChild("sex");
  
  XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
  try {
   xmlOut.output(myDocument,System.out);
   //xmlOut.output(rootElement.getChild("name"),System.out);
   //String outString = xmlOut.outputString(myDocument);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

       
二、XML文档解析
    JDOM 不光可以很方便的建立XML文档Q它的另一个用处是它能够读取ƈ操作现有?XML 数据?BR>    JDOM的解析器在org.jdom.input.*q个包里Q其中的DOMBuilder的功能是DOM模型的Document解析成JDOM模型的DocumentQSAXBuilder的功能是从文件或中解析出符合JDOM模型的XML树。由于我们经常要从一个文仉d数据Q因此我们应该采用后者作析工兗?BR>解析一个xml文档Q基本可以看成以下几个步骤:
    1.实例化一个合适的解析器对?BR>        本例中我们用SAXBuilder:
        SAXBuilder sb = new SAXBuilder();
    2.以包含XML数据的文件ؓ参数Q构Z个文档对象myDocument
        Document myDocument = sb.build(/some/directory/myFile.xml);
    3.获到根元?BR>        Element rootElement = myDocument.getRootElement();
       
        一旦你获取了根元素Q你可以很方便地对它下面的子元素进行操作了Q下面对Element对象的一些常用方法作一下简单说明:
        getChild("childname") q回指定名字的子节点,如果同一U有多个同名子节点,则只q回W一个;如果没有q回null倹{?BR>        getChildren("childname") q回指定名字的子节点List集合。这样你可以遍历所有的同一U同名子节点?
        getAttributeValue("name") q回指定属性名字的倹{如果没有该属性则q回null,有该属性但是gؓI,则返回空字符丌Ӏ?BR>        getChildText("childname") q回指定子节点的内容文本倹{?BR>        getText() q回该元素的内容文本倹{?BR>       
        q有其他没有|列出来的方法,如果需要的话,可以随时查阅JDOM的在U文档:http://www.jdom.org/docs/apidocs/index.html。当然你可以在你需要的地方d、删除元素操作,q记得上面的创徏XML的方法吗Q呵呵~~~
       
        学习C东还是从实例学v最为快P下面单D个例子,׃上面的XMLh代码来学习JDOM的XML解析。本例中d了样本XML文g里一些属性和contentQ最后我们还在contact元素里插入了一个新元素<email value="wanghua@cyberobject.com" />。尽我们实C对于XML的基本操作,l心的朋友可能会
有疑问:如果XML文档的层ơ稍微复杂一些,如果嵌套多达几十上百层的话(开个玩W)Q如果靠q样从根元素一U一U地通过getChild("childname")来访问子元素的话Q将会非常痛苦!是的Q的是q样Q但是我们有另一个有力的工具XPathQؓ什么不用呢Q这是后话!先卖个关子(手敲累啦Q下回吧Q呵呵)?BR>       
/*
 * Created on 2004-8-21
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.cyberobject.study;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 * @author kingwong
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class TestJDOM2 {
 public static void main(String[] args){
 SAXBuilder sb = new SAXBuilder();
    try
    {       
     Document doc = sb.build("myFile.xml");
  Element root = doc.getRootElement();
  
  String str1 = root.getAttributeValue("comment");
  System.out.println("Root Element's comment attribute is : " + str1);
  String str2 = root.getChild("sex").getAttributeValue("value");
  System.out.println("sex Element's value attribute is : " + str2);
  String str3 = root.getChildText("name");
  System.out.println("name Element's content is :" + str3);
  String str4 = root.getChild("contact").getChildText("telephone");
  System.out.println("contact Element's telephone subelement content is : " + str4 + "\n");
  Element inputElement = root.getChild("contact"); 
  inputElement.addContent(new Element("email").setAttribute("value","wanghua@cyberobject.com"));
  
  XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
     String outStr = xmlOut.outputString(root);
     System.out.println(outStr);
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}
}



Timnity 2005-12-29 21:51 发表评论
]]>
JAR 文g格式的强大功?/title><link>http://www.aygfsteel.com/Timnity/archive/2005/12/29/25943.html</link><dc:creator>Timnity</dc:creator><author>Timnity</author><pubDate>Thu, 29 Dec 2005 13:38:00 GMT</pubDate><guid>http://www.aygfsteel.com/Timnity/archive/2005/12/29/25943.html</guid><wfw:comment>http://www.aygfsteel.com/Timnity/comments/25943.html</wfw:comment><comments>http://www.aygfsteel.com/Timnity/archive/2005/12/29/25943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Timnity/comments/commentRss/25943.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Timnity/services/trackbacks/25943.html</trackback:ping><description><![CDATA[<P style="TEXT-INDENT: 2em">大多?Java E序员都熟悉?JAR 文g的基本操作。但是只有少数程序员了解 JAR 文g格式的强大功能。在本文中,作者探讨了 JAR 格式的许多功能和优势Q包括打包、可执行?JAR 文g、安全性和索引? <P style="TEXT-INDENT: 2em"><STRONG>JAR 文g是什么?</STRONG> <P style="TEXT-INDENT: 2em">JAR 文g格式以流行的 ZIP 文g格式为基Q用于将许多个文件聚集ؓ一个文件。与 ZIP 文g不同的是QJAR 文g不仅用于压羃和发布,而且q用于部|和装库、组件和插gE序Qƈ可被像编译器?JVM q样的工L接用。在 JAR 中包含特D的文gQ如 manifests 和部|描q符Q用来指C工具如何处理特定的 JAR? <P style="TEXT-INDENT: 2em">一?JAR 文g可以用于Q? <OL> <LI>用于发布和用类? <LI>作ؓ应用E序和扩展的构徏单元 <LI>作ؓlg、applet 或者插件程序的部v单位 <LI>用于打包与组件相兌的辅助资?</LI></OL> <P style="TEXT-INDENT: 2em">JAR 文g格式提供了许多优势和功能Q其中很多是传统的压~格式如 ZIP 或?TAR 所没有提供的。它们包括: <P style="TEXT-INDENT: 2em"><STRONG>安全?/STRONG>?可以?JAR 文g内容加上数字化签名。这P能够识别{֐的工具就可以有选择Cؓ您授予Y件安全特权,q是其他文g做不到的Q它q可以检代码是否被改q? <P style="TEXT-INDENT: 2em"><STRONG>减少下蝲旉</STRONG>?如果一?applet 捆绑C?JAR 文g中,那么览器就可以在一?HTTP 事务中下载这?applet 的类文g和相关的资源Q而不是对每一个文件打开一个新q接? <P style="TEXT-INDENT: 2em"><STRONG>压羃</STRONG>。JAR 格式允许您压~文件以提高存储效率? <P style="TEXT-INDENT: 2em"><STRONG>传输q_扩展</STRONG>?Java 扩展框架(Java Extensions Framework)提供了向 Java 核心q_d功能的方法,q些扩展是用 JAR 文g打包?Java 3D ?JavaMail 是?Sun 开发的扩展例子)? <P style="TEXT-INDENT: 2em"><STRONG>包密?/STRONG>?存储?JAR 文g中的包可以选择q行密封Q以增强版本一致性和安全性。密一个包意味着包中的所有类都必d同一 JAR 文g中找到? <P style="TEXT-INDENT: 2em"><STRONG>包版本控?/STRONG>?一?JAR 文g可以包含有关它所包含的文件的数据Q如厂商和版本信息? <P style="TEXT-INDENT: 2em"><STRONG>可移植?/STRONG>?处理 JAR 文g的机制是 Java q_核心 API 的标准部分? <P style="TEXT-INDENT: 2em">压羃的和未压~的 JAR <P style="TEXT-INDENT: 2em">jar 工具(有关l节参阅 jar 工具)在默认情况下压羃文g。未压羃?JAR 文g一般可以比压羃q的 JAR 文g更快地装载,因ؓ在装载过E中要解压羃文gQ但是未压羃的文件在|络上的下蝲旉可能更长? <P style="TEXT-INDENT: 2em"><STRONG>META-INF 目录</STRONG> <P style="TEXT-INDENT: 2em">大多?JAR 文g包含一?META-INF 目录Q它用于存储包和扩展的配|数据,如安全性和版本信息。Java 2 q_识别q解?META-INF 目录中的下述文g和目录,以便配置应用E序、扩展和c装载器Q? <P style="TEXT-INDENT: 2em"><STRONG>MANIFEST.MF</STRONG>?q个 manifest 文g定义了与扩展和包相关的数据? <P style="TEXT-INDENT: 2em"><STRONG>INDEX.LIST</STRONG>?q个文g?jar 工具的新选项 -i 生成Q它包含在应用程序或者扩展中定义的包的位|信息。它?JarIndex 实现的一部分Qƈq装蝲器用于加速类装蝲q程? <P style="TEXT-INDENT: 2em"><STRONG>xxx.SF</STRONG>?q是 JAR 文g的签名文件。占位符 xxx 标识了签名者? <P style="TEXT-INDENT: 2em"><STRONG>xxx.DSA</STRONG>?与签名文件相兌的签名程序块文gQ它存储了用于签?JAR 文g的公q名? <P style="TEXT-INDENT: 2em"><STRONG>jar 工具</STRONG> <P style="TEXT-INDENT: 2em">Z?JAR 文g执行基本的Q务,要用作为Java Development Kit 的一部分提供?Java Archive Tool (jar 工具)。用 jar 命o调用 jar 工具。表 1 昄了一些常见的应用Q? <P style="TEXT-INDENT: 2em"><STRONG>?1. 常见?jar 工具用法 功能 命o</STRONG> <P style="TEXT-INDENT: 2em">用一个单独的文g创徏一?JAR 文g jar cf jar-file input-file... <P style="TEXT-INDENT: 2em">用一个目录创Z?JAR 文g jar cf jar-file dir-name <P style="TEXT-INDENT: 2em">创徏一个未压羃?JAR 文g jar cf0 jar-file dir-name <P style="TEXT-INDENT: 2em">更新一?JAR 文g jar uf jar-file input-file... <P style="TEXT-INDENT: 2em">查看一?JAR 文g的内?jar tf jar-file <P style="TEXT-INDENT: 2em">提取一?JAR 文g的内?jar xf jar-file <P style="TEXT-INDENT: 2em">从一?JAR 文g中提取特定的文g jar xf jar-file archived-file... <P style="TEXT-INDENT: 2em">q行一个打包ؓ可执?JAR 文g的应用程?java -jar app.jar <P style="TEXT-INDENT: 2em"><STRONG>可执行的 JAR</STRONG> <P style="TEXT-INDENT: 2em">一个可执行?jar 文g是一个自包含?Java 应用E序Q它存储在特别配|的JAR 文g中,可以?JVM 直接执行它而无需事先提取文g或者设|类路径。要q行存储在非可执行的 JAR 中的应用E序Q必d它加入到您的c\径中Qƈ用名字调用应用程序的ȝ。但是用可执行?JAR 文gQ我们可以不用提取它或者知道主要入口点可以运行一个应用程序。可执行 JAR 有助于方便发布和执行 Java 应用E序? <P style="TEXT-INDENT: 2em"><STRONG>创徏可执?JAR</STRONG> <P style="TEXT-INDENT: 2em">创徏一个可执行 JAR 很容易。首先将所有应用程序代码放C个目录中。假讑ֺ用程序中的主cL com.mycompany.myapp.Sample。您要创Z个包含应用程序代码的 JAR 文gq标识出ȝ。ؓ此,在某个位|?不是在应用程序目录中)创徏一个名?manifest 的文Ӟq在其中加入以下一行: <P style="TEXT-INDENT: 2em">Main-Class: com.mycompany.myapp.Sample <P style="TEXT-INDENT: 2em">然后Q像q样创徏 JAR 文gQ? <P style="TEXT-INDENT: 2em">jar cmf manifest ExecutableJar.jar application-dir <P style="TEXT-INDENT: 2em">所要做的就是这些了 -- 现在可以?java -jar 执行q个 JAR 文g ExecutableJar.jar? <P style="TEXT-INDENT: 2em">一个可执行?JAR 必须通过 menifest 文g的头引用它所需要的所有其他从?JAR。如果用了 -jar 选项Q那么环境变?CLASSPATH 和在命o行中指定的所有类路径都被 JVM 所忽略? <P style="TEXT-INDENT: 2em"><STRONG>启动可执?JAR</STRONG> <P style="TEXT-INDENT: 2em">既然我们已经自q应用E序打包C一个名?ExecutableJar.jar 的可执行 JAR 中了Q那么我们就可以用下面的命o直接从文件启动这个应用程序: <P style="TEXT-INDENT: 2em">java -jar ExecutableJar.jar <P style="TEXT-INDENT: 2em"><STRONG>包密?/STRONG> <P style="TEXT-INDENT: 2em">密封 JAR 文g中的一个包意味着在这个包中定义的所有类都必d同一?JAR 文g中找到。这使包的作者可以增强打包类之间的版本一致性。密还提供了防止代码篡改的手段? <P style="TEXT-INDENT: 2em">要密包Q需要在 JAR ?manifest 文g中ؓ包添加一?Name _然后加上gؓ“true”的 Sealed 头。与可执行的 JAR 一P可以在创?JAR Ӟ通过指定一个具有适当头元素的 manifest 文g密封一?JARQ如下所C: <P style="TEXT-INDENT: 2em">Name: com/samplePackage/ <P style="TEXT-INDENT: 2em">Sealed: true <P style="TEXT-INDENT: 2em">Name 头标识出包的相对路径名。它以一个?”结束以与文件名区别。在 Name 头后面第一个空行之前的所有头都作用于?Name 头中指定的文件或者包。在上述例子中,因ؓ Sealed 头出现在 Name 头后q且中间没有IQ所?Sealed 头将被解释ؓ只应用到?com/samplePackage 上? <P style="TEXT-INDENT: 2em">如果试图从密包所在的 JAR 文g以外的其他地方装载密包中的一个类Q那?JVM 抛Z?SecurityException? <P style="TEXT-INDENT: 2em"><STRONG>扩展打包</STRONG> <P style="TEXT-INDENT: 2em">扩展?Java q_增加了功能,?JAR 文g格式中已l加入了扩展机制。扩展机制?JAR 文g可以通过 manifest 文g中的 Class-Path 头指定所需要的其他 JAR 文g? <P style="TEXT-INDENT: 2em">假设 extension1.jar ?extension2.jar 是同一个目录中的两?JAR 文gQextension1.jar ?manifest 文g包含以下_ <P style="TEXT-INDENT: 2em">Class-Path: extension2.jar <P style="TEXT-INDENT: 2em">q个头表?extension2.jar 中的cL extension1.jar 中的cȝ扩展cRextension1.jar 中的cd以调?extension2.jar 中的c,q且不要?extension2.jar 处在c\径中? <P style="TEXT-INDENT: 2em">在装载用扩展机制的 JAR ӞJVM 会高效而自动地在Class-Path 头中引用?JAR d到类路径中。不q,扩展 JAR 路径被解释ؓ相对路径Q所以一般来_扩展 JAR 必须存储在引用它?JAR 所在的同一目录中? <P style="TEXT-INDENT: 2em">例如Q假讄 ExtensionClient 引用了类 ExtensionDemo,它捆l在一个名?ExtensionClient.jar ?JAR 文g中,而类 ExtensionDemo 则捆l在 ExtensionDemo.jar 中。ؓ了 ExtensionDemo.jar 可以成ؓ扩展Q必d ExtensionDemo.jar 列在 ExtensionClient.jar ?manifest ?Class-Path 头中Q如下所C: <P style="TEXT-INDENT: 2em">Manifest-Version: 1.0 <P style="TEXT-INDENT: 2em">Class-Path: ExtensionDemo.jar <P style="TEXT-INDENT: 2em">在这?manifest ?Class-Path 头的值是没有指定路径?ExtensionDemo.jarQ表?ExtensionDemo.jar ?ExtensionClient JAR 文g处在同一目录中? <P style="TEXT-INDENT: 2em"><STRONG>JAR 文g中的安全?/STRONG> <P style="TEXT-INDENT: 2em">JAR 文g可以?jarsigner 工具或者直接通过 java.security API {֐。一个签名的 JAR 文g与原来的 JAR 文g完全相同Q只是更C它的 manifestQƈ?META-INF 目录中增加了两个文gQ一个签名文件和一个签名块文g? <P style="TEXT-INDENT: 2em">JAR 文g是用一个存储在 Keystore 数据库中的证书签名的。存储在 keystore 中的证书有密码保护,必须?jarsigner 工具提供q个密码才能?JAR 文g{֐? <P style="TEXT-INDENT: 2em" align=center><STRONG>?1. Keystore 数据?/STRONG> <P style="TEXT-INDENT: 2em"> <CENTER><IMG style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://cimg.163.com/catchpic/3/3D/3D5A6A33CE83B305CAB14F212F657CD5.gif" onload="javascript:if(this.width>500)this.style.width=500;" border=0></CENTER> <P style="TEXT-INDENT: 2em">JAR 的每一位签名者都由在 JAR 文g?META-INF 目录中的一个具?.SF 扩展名的{֐文g表示。这个文件的格式cM?manifest 文g -- 一l?RFC-822 头。如下所C,它的l成包括一个主要部分,它包括了q名者提供的信息、但是不特别针对M特定?JAR 文g,q有一pd的单独的,q些也必须包含?menifest 文g中。在验证一个签名的 JAR Ӟ签名文件的摘要g?JAR 文g中的相应计的摘要D行比较? <P style="TEXT-INDENT: 2em"><STRONG>清单 1. {֐ JAR 中的 Manifest ?signature 文g</STRONG> <P style="TEXT-INDENT: 2em">Contents of signature file META-INF/MANIFEST.MF <P style="TEXT-INDENT: 2em">Manifest-Version: 1.0 <P style="TEXT-INDENT: 2em">Created-By: 1.3.0 (Sun Microsystems Inc.) <P style="TEXT-INDENT: 2em">Name: Sample.java <P style="TEXT-INDENT: 2em">SHA1-Digest: 3+DdYW8INICtyG8ZarHlFxX0W6g= <P style="TEXT-INDENT: 2em">Name: Sample.class <P style="TEXT-INDENT: 2em">SHA1-Digest: YJ5yQHBZBJ3SsTNcHJFqUkfWEmI= <P style="TEXT-INDENT: 2em">Contents of signature file META-INF/JAMES.SF <P style="TEXT-INDENT: 2em">Signature-Version: 1.0 <P style="TEXT-INDENT: 2em">SHA1-Digest-Manifest: HBstZOJBuuTJ6QMIdB90T8sjaOM= <P style="TEXT-INDENT: 2em">Created-By: 1.3.0 (Sun Microsystems Inc.) <P style="TEXT-INDENT: 2em">Name: Sample.java <P style="TEXT-INDENT: 2em">SHA1-Digest: qipMDrkurQcKwnyIlI3Jtrnia8Q= <P style="TEXT-INDENT: 2em">Name: Sample.class <P style="TEXT-INDENT: 2em">SHA1-Digest: pT2DYby8QXPcCzv2NwpLxd8p4G4= <P style="TEXT-INDENT: 2em"><STRONG>数字{֐</STRONG> <P style="TEXT-INDENT: 2em">一个数字签名是.SF {֐文g的已{֐版本。数字签名文件是二进制文Ӟq且?.SF 文g有相同的文g名,但是扩展名不同。根据数字签名的cd -- RSA、DSA 或?PGP -- 以及用于{֐ JAR 的证书类型而有不同的扩展名? <P style="TEXT-INDENT: 2em"><STRONG>Keystore</STRONG> <P style="TEXT-INDENT: 2em">要签名一?JAR 文gQ必首先有一个私钥。私钥及其相关的公钥证书存储在名?keystores 的、有密码保护的数据库中。JDK 包含创徏和修?keystores 的工兗keystore 中的每一个密钥都可以用一个别名标识,它通常是拥有这个密钥的{֐者的名字? <P style="TEXT-INDENT: 2em">所?keystore ?密钥和信ȝ证书?都是用唯一别名讉K的。别名是在用 keytool -genkey 命o生成密钥?公钥和私?q在 keystore 中添加项时指定的。之后的 keytool 命o必须使用同样的别名引用这一V? <P style="TEXT-INDENT: 2em">例如Q要用别名“james”生成一个新的公?U钥对ƈ公钥包装到自签名的证书中,要用下q命令: <P style="TEXT-INDENT: 2em">keytool -genkey -alias james -keypass jamespass <P style="TEXT-INDENT: 2em">-validity 80 -keystore jamesKeyStore <P style="TEXT-INDENT: 2em">-storepass jamesKeyStorePass <P style="TEXT-INDENT: 2em">q个命o序列指定了一个初始密码“jamespass”,后箋的命令在讉K keystore “jamesKeyStore”中与别名“james”相兌的私钥时Q就需要这个密码。如?keystore“jamesKeyStore”不存在Q则 keytool 会自动创建它? <P style="TEXT-INDENT: 2em"><STRONG>jarsigner 工具</STRONG> <P style="TEXT-INDENT: 2em">jarsigner 工具使用 keystore 生成或者验?JAR 文g的数字签名? <P style="TEXT-INDENT: 2em">假设像上qC子那样创Z keystore “jamesKeyStore”,q且它包含一个别名ؓ“james”的密钥Q可以用下面的命令签名一?JAR 文gQ? <P style="TEXT-INDENT: 2em">jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass <P style="TEXT-INDENT: 2em">-keypass jamespass -signedjar SSample.jar Sample.jar james <P style="TEXT-INDENT: 2em">q个命o用密码“jamesKeyStorePass”从名ؓ“jamesKeyStore”的 keystore 中提出别名ؓ“james”、密码ؓ“jamespass”的密钥Qƈ?Sample.jar 文g{֐、创Z个签名的 JAR -- SSample.jar? <P style="TEXT-INDENT: 2em">jarsigner 工具q可以验证一个签名的 JAR 文gQ这U操作比{֐ JAR 文g要简单得多,只需执行以下命oQ? <P style="TEXT-INDENT: 2em">jarsigner -verify SSample.jar <P style="TEXT-INDENT: 2em">如果{֐?JAR 文g没有被篡改过Q那?jarsigner 工具׃告诉?JAR 通过验证了。否则,它会抛出一?SecurityExceptionQ?表明哪些文g没有通过验证? <P style="TEXT-INDENT: 2em">q可以用 java.util.jar ?java.security API 以编E方式签?JAR(有关l节参阅参考资?。也可以使用?Netscape Object Signing Tool q样的工兗? <P style="TEXT-INDENT: 2em"><STRONG>JAR 索引</STRONG> <P style="TEXT-INDENT: 2em">如果一个应用程序或?applet 捆绑到多?JAR 文g中,那么c装载器׃用一个简单的U性搜索算法搜索类路径中的每一个元素,qɾc装载器可能要下载ƈ打开许多?JAR 文gQ直到找到所要的cL者资源。如果类装蝲器试囑֯找一个不存在的资源,那么在应用程序或?applet 中的所?JAR 文g都会下蝲。对于大型的|络应用E序?appletQ这会导致启动缓慢、响应迟~ƈ费带宽? <P style="TEXT-INDENT: 2em">?JDK 1.3 以后QJAR 文g格式开始支持烦引以优化|络应用E序中类的搜索过E,特别?applet。JarIndex 机制攉?applet 或者应用程序中定义的所?JAR 文g的内容,q将q些信息存储到第一?JAR 文g中的索引文g中。下载了W一?JAR 文g后,applet c装载器用收集的内容信息高效地装?JAR 文g。这个目录信息存储在?JAR 文g?META-INF 目录中的一个名?INDEX.LIST 的简单文本文件中? <P style="TEXT-INDENT: 2em"><STRONG>创徏一?JarIndex</STRONG> <P style="TEXT-INDENT: 2em">可以通过?jar 命o中指?-i 选项创徏一?JarIndex。假设我们的目录l构如下图所C: <P style="TEXT-INDENT: 2em" align=center><STRONG>?2. JarIndex</STRONG> <P style="TEXT-INDENT: 2em"> <CENTER><IMG style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://cimg.163.com/catchpic/3/39/390B2F53CE4352348363CAAAFB8671DB.gif" onload="javascript:if(this.width>500)this.style.width=500;" border=0></CENTER> <P style="TEXT-INDENT: 2em">您将使用下述命o?JarIndex_Main.jar、JarIndex_test.jar ?JarIndex_test1.jar 创徏一个烦引文Ӟ <P style="TEXT-INDENT: 2em">jar -i JarIndex_Main.jar JarIndex_test.jar SampleDir/JarIndex_test1.jar <P style="TEXT-INDENT: 2em">INDEX.LIST 文g的格式很单,包含每个已烦引的 JAR 文g中包含的包或者类的名字,如清?2 所C: <P style="TEXT-INDENT: 2em"><STRONG>清单 2. JarIndex INDEX.LIST 文gCZ</STRONG> <P style="TEXT-INDENT: 2em">JarIndex-Version: 1.0 <P style="TEXT-INDENT: 2em">JarIndex_Main.jar <P style="TEXT-INDENT: 2em">sp <P style="TEXT-INDENT: 2em">JarIndex_test.jar <P style="TEXT-INDENT: 2em">Sample <P style="TEXT-INDENT: 2em">SampleDir/JarIndex_test1.jar <P style="TEXT-INDENT: 2em">org <P style="TEXT-INDENT: 2em">org/apache <P style="TEXT-INDENT: 2em">org/apache/xerces <P style="TEXT-INDENT: 2em">org/apache/xerces/framework <P style="TEXT-INDENT: 2em">org/apache/xerces/framework/xml4j <P style="TEXT-INDENT: 2em"><STRONG>l束?/STRONG> <P style="TEXT-INDENT: 2em">JAR 格式q远出了一U压~格式,它有许多可以改进效率、安全性和l织 Java 应用E序的功能。因些功能已l徏立在核心q_ -- 包括~译器和c装载器 -- 中了Q所以开发h员可以利?JAR 文g格式的能力简化和改进开发和部vq程? <P style="TEXT-INDENT: 2em">Q关键字Qjava jarQ? <P style="TEXT-INDENT: 2em">Q来源:csdn.netQ?/P><img src ="http://www.aygfsteel.com/Timnity/aggbug/25943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Timnity/" target="_blank">Timnity</a> 2005-12-29 21:38 <a href="http://www.aygfsteel.com/Timnity/archive/2005/12/29/25943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank">ٹ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˶</a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank">ζ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">׳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">п</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">կ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank">Ͳ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>