﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-随风漂流-文章分类-J2EE开发技术</title><link>http://www.blogjava.net/Martin-Liu-Hai-Shi/category/35026.html</link><description>JAVA开源技术的最爱</description><language>zh-cn</language><lastBuildDate>Sun, 02 Nov 2008 01:43:34 GMT</lastBuildDate><pubDate>Sun, 02 Nov 2008 01:43:34 GMT</pubDate><ttl>60</ttl><item><title>转:Java对图片的处理---缩放图像、图像切割、图像类型转换、彩色转为黑白</title><link>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/237999.html</link><dc:creator>aisoft</dc:creator><author>aisoft</author><pubDate>Sat, 01 Nov 2008 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/237999.html</guid><wfw:comment>http://www.blogjava.net/Martin-Liu-Hai-Shi/comments/237999.html</wfw:comment><comments>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/237999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Martin-Liu-Hai-Shi/comments/commentRss/237999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Martin-Liu-Hai-Shi/services/trackbacks/237999.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java 代码&nbsp;&nbsp;1&nbsp;import&nbsp;java.io.*;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;import&nbsp;java.awt.*;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;import&nbsp;java.awt.image.*;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/237999.html'>阅读全文</a><img src ="http://www.blogjava.net/Martin-Liu-Hai-Shi/aggbug/237999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Martin-Liu-Hai-Shi/" target="_blank">aisoft</a> 2008-11-01 10:56 <a href="http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/237999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js获取jsp中URL传递的参数</title><link>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/235985.html</link><dc:creator>aisoft</dc:creator><author>aisoft</author><pubDate>Wed, 22 Oct 2008 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/235985.html</guid><wfw:comment>http://www.blogjava.net/Martin-Liu-Hai-Shi/comments/235985.html</wfw:comment><comments>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/235985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Martin-Liu-Hai-Shi/comments/commentRss/235985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Martin-Liu-Hai-Shi/services/trackbacks/235985.html</trackback:ping><description><![CDATA[<p dir="ltr" style="margin-right: 0px">jsp的url ：test.jsp?property_id='ssss'&amp;name='test';<br />
一、定义一个js方法。<br />
function request(paras){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var url = location.href;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var paraString = url.substring(url.indexOf("?")+1,url.length).split("&amp;");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var paraObj = {}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i=0; j=paraString[i]; i++){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paraObj[j.substring(0,j.indexOf("=")).toLowerCase()] = j.substring(j.indexOf("=")+1,j.length);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var returnValue = paraObj[paras.toLowerCase()];&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(typeof(returnValue)=="undefined"){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "";&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return returnValue;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用时直接：var value=request('参数名');<br />
二、用正则表达式<br />
&nbsp;&nbsp;&nbsp; //获取jsp页面url参数的值，相当于request.getParameter('')一样。<br />
function&nbsp; getUrlParam(name){&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp;&nbsp; reg&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; RegExp("(^|&amp;)"+&nbsp;&nbsp; name&nbsp;&nbsp; +"=([^&amp;]*)(&amp;|$)");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp;&nbsp; r&nbsp;&nbsp; =&nbsp;&nbsp; window.location.search.substr(1).match(reg);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; (r!=null)&nbsp;&nbsp; return&nbsp;&nbsp; unescape(r[2]);&nbsp;&nbsp; return&nbsp;&nbsp; null;&nbsp;&nbsp; <br />
} <br />
调用过程同上。如 va&nbsp; markerId=getUrlParam('property_id');&nbsp;&nbsp;则可以获取property_id的值。 </p>
<img src ="http://www.blogjava.net/Martin-Liu-Hai-Shi/aggbug/235985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Martin-Liu-Hai-Shi/" target="_blank">aisoft</a> 2008-10-22 17:09 <a href="http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/235985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 数字签名(转载)</title><link>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/232849.html</link><dc:creator>aisoft</dc:creator><author>aisoft</author><pubDate>Tue, 07 Oct 2008 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/232849.html</guid><wfw:comment>http://www.blogjava.net/Martin-Liu-Hai-Shi/comments/232849.html</wfw:comment><comments>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/232849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Martin-Liu-Hai-Shi/comments/commentRss/232849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Martin-Liu-Hai-Shi/services/trackbacks/232849.html</trackback:ping><description><![CDATA[<div class="postText" align="center"><strong>JAVA 数字签名</strong></div>
<p class="postText"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 14px" invalid_attr_id="25px"  #>来源：赛迪网 </span><span class="content"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者：李素科 <br />
</span><br />
(转载序：网上找的好文章，一篇就把我找了几天的所有东西都概括进来了，真是非常感谢作者：李素科&nbsp; 其实在找资料的过程当中，主要没解决的问题在于如何获得KeyStore文件中的PrivateKey，本来查jsdk 1.4 api文档就可以知道了，但是居然从上到下看了2遍，没有发现这个方法:load()&nbsp; .......)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
证书(Certificate，也称public-key certificate)是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的、可以用来当成信任关系中介的数字凭证。证书发行机构通过发行证书告知证书使用者或实体其公钥(public-key)以及其它一些辅助信息。证书在电子商务安全交易中有着广泛的应用，证书发行机构也称CA(Certificate Authority)。 <br />
<br />
</p>
<center class="postText"><font color="#000099"><strong>应用证书</strong></font></center>
<p class="postText"><br />
<br />
证书在公钥加密应用中的作用是保证公钥在某些可信的机构发布，其在协议SSL、电子交易协议SET等方面有重要的应用。图1显示了一个最简单的证书应用方法： <br />
<br />
</p>
<center class="postText"><img src="http://www.it918.com/Files/NewsUpfiles/20040414C1527281.gif"  alt="" /></center>
<div class="postText"><br />
<br />
</div>
<center class="postText">图1 证书应用方法</center>
<p class="postText"><br />
<br />
证书的应用步骤是： <br />
<br />
（1） A把自己的公钥PKA送到CA(Certificate Authority)； <br />
<br />
（2） CA用自己的私钥和A的公钥生成A的证书，证书内包括CA的数字签名。签名对象包括需要在证书中说明的内容，比如A的公钥、时间戳、序列号等，为了简化这里不妨假设证书中只有三项内容：A的公钥PKA、时间戳TIME1、序列号IDA。那么CA发送给A的简单证书凭证可表达为：CertA=Eca[TIME1,IDA,PKA]； <br />
<br />
（3） B同样把自己的公钥PKB送到CA； <br />
<br />
（4） B得到CA发布的证书CertB; <br />
<br />
（5） A告知B证书CertA； <br />
<br />
（6） B告知A证书CertB。 <br />
<br />
A、B各自得到对方证书后，利用从CA得到的公钥(在CA的自签证书中)验证彼此对方的证书是否有效，如果有效，那么就得到了彼此的公钥。利用对方的公钥，可以加密数据，也可以用来验证对方的数字签名。 <br />
<br />
本文为了方便说明，并没有使用从CA获得的证书，而是通信双方各自产生自签证书，也就是说图1的A和B并没有经过CA，不过前提是A和B之间是互相拥有对方的证书。 <br />
<br />
证书的内容和意义如表1所示（这里以通用X .509证书格式为例）。 <br />
<br />
</p>
<center class="postText">表1 证书内容和意义</center>
<div class="postText"><br />
<br />
</div>
<center class="postText"><ccid_nobr>
<table class="content" width="502" border="1">
    <tbody>
        <tr>
            <td>证书内容</td>
            <td>意义</td>
        </tr>
        <tr>
            <td>Version</td>
            <td>告诉这个X.509证书是哪个版本的，目前有v1、V2、v3</td>
        </tr>
        <tr>
            <td>Serial Number</td>
            <td>由证书分发机构设置证书的序列号</td>
        </tr>
        <tr>
            <td>Signature Algorithm Identifier</td>
            <td>证书采用什么样的签名算法</td>
        </tr>
        <tr>
            <td>Issuer Name</td>
            <td>证书发行者名，也就是给这个证书签名的机构名</td>
        </tr>
        <tr>
            <td>Validity Period</td>
            <td>证书有效时间范围</td>
        </tr>
        <tr>
            <td>Subject Name</td>
            <td>被证书发行机构签名后的公钥拥有者或实体的名字，采用X.500协议，在Internet上的标志是惟一的。例如：CN=Java,OU=Infosec,O=Infosec Lab,C=CN表示一个subject name。</td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p class="postText"><br />
<br />
对证书的详细定义及其应用相关的各种协议，这里不加详细说明，详细细节请查看RFC2450、RFC2510、RFC2511、RFC2527、RFC2528、RFC2559、RFC2560、RFC2585、RFC2587等文档。 <br />
<br />
</p>
<center class="postText"><font color="#000099"><strong>生成自签证书</strong></font></center>
<p class="postText"><br />
<br />
个人或机构可以从信任的证书分发机构申请得到证书，比如说，可以从http://ca.pku.edu.cn 得到一个属于个人的证书。这里可以利用J2SDK的安全工具keytool手工产生自签证书，所谓自签证书是指证书中的&#8220;Subject Name&#8221;和&#8220;Issuer Name&#8221;相同的证书。 </p>
<p class="postText">下面产生一个自签证书。安装完J2SDK（这里用的是J2SDK1.4）后，在J2SDK安装目录的bin目录下，有一个keytool的可执行程序。利用keytool产生自签证书的步骤如下： <br />
<br />
第一步，用-genkey命令选项，产生公私密钥对。在控制台界面输入：keytool -genkey -alias testkeypair -keyalg RSA -keysize 1024 -sigalg MD5withRSA。这里的-alias表示使用这对公私密钥产生新的keystore入口的别名(keystore是用来存放管理密钥对和证书链的，缺省位置是在使用者主目录下，以.keystore为名的隐藏文件，当然也可指定某个路径存放.keystore文件)；-keyalg是产生公私钥对所用的算法，这里是RSA；-keysize定义密钥的长度；-sigalg是签名算法，选择MD5withRSA，即用RSA签名，然后用MD5哈希算法摘要。接下来，系统会提示进行一些输入： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>输入keystore密码：  abc123
            您的名字与姓氏是什么？
            [Unknown]：  Li
            您的组织单位名称是什么？
            [Unknown]：  InfosecLab
            您的组织名称是什么？
            [Unknown]：  InfosecLab Group
            您所在的城市或区域名称是什么？
            [Unknown]：  Beijing
            您所在的州或省份名称是什么？
            [Unknown]：  Beijing
            该单位的两字母国家代码是什么
            [Unknown]：  CN
            CN=Li, OU=InfosecLab, O=InfosecLab Group, L=Beijing, ST=Beijing, C=CN 正确吗？
            [否]：  y
            输入&lt;testkeypair&gt;的主密码 (如果和 keystore 密码相同，按回车）：</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
第二步，产生自签证书，输入以下命令： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>keytool -selfcert -alias testkeypair -dname "CN=Li, OU=InfosecLab, O=InfosecLab
            Group, L=Beijing, ST=Beijing, C=CN"
            输入keystore密码：  abc123</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
第三步，导出自签证书，由上面两步产生的证书，已经存放在以&#8220;testkeypair&#8221;为别名的keystore入口了，如果使用其文件，必须导出证书。输入: <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>keytool -export -rfc -alias testkeypair -file mycert.crt
            输入keystore密码：  abc123
            保存在文件中的认证 &lt;mycert.crt&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
这样，就得到了一个自签的证书mycert.crt。注意，选项rfc是把证书输出为RFC1421定义的、用Base64最终编码的格式。 <br />
<br />
</p>
<center class="postText"><font color="#000099"><strong>读取证书</strong></font></center>
<p class="postText"><br />
<br />
Java为安全应用提供了丰富的API，J2SDK1.4 的JSSE (JavaTM Secure Socket Extension) 包括javax.security.certificate包，并且提供对证书的操作方法。而对证书的读操作，只用java.security.cert. CertificateFactory和java.security.cert.X509Certificate就可以了。下面是读取证书内容的部分代码： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>import javax.swing.*;
            import java.awt.*;
            import java.awt.event.*;
            import javax.swing.table.*;
            import java.security.cert.CertificateFactory;
            import java.security.cert.X509Certificate;
            import java.io.*;
            public class CARead extends JPanel {
            private String CA_Name;
            private String CA_ItemData[][] = new String[9][2];
            private String[] columnNames = {"证书字段标记","内容" };
            public CARead(String CertName) {
            CA_Name=CertName;
            /* 三个Panel用来显示证书内容*/
            JTabbedPane tabbedPane = new JTabbedPane();
            JPanel panelNormal = new JPanel();
            tabbedPane.addTab("普通信息", panelNormal);
            JPanel panelAll=new JPanel();
            panelAll.setLayout(new BorderLayout());
            tabbedPane.addTab("所有信息",panelAll);
            JPanel panelBase64=new JPanel();
            panelBase64.setLayout(new BorderLayout());
            tabbedPane.addTab("Base64编码信息",panelBase64);
            /* 读取证书常规信息 */
            Read_Normal(panelNormal);
            /* 读取证书文件字符串表示内容 */
            Read_Bin(panelAll);
            /* 读取证原始Base64编码形式的证书文件 */
            Read_Raw(panelBase64);
            tabbedPane.setSelectedIndex(0);
            setLayout(new GridLayout(1, 1));
            add(tabbedPane);
            }
            /*以下是定义的Read_Normal()，Read_Bin(),Read_Raw()以及main()
            这里省略...   */
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
定义证书信息的读取函数如下： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>private int Read_Normal(JPanel panel){
            String Field;
            try{
            CertificateFactory certificate_factory=CertificateFactory.getInstance("X.509");
            FileInputStream file_inputstream=new FileInputStream(CA_Name);
            X509Certificate
            x509certificate=(X509Certificate)certificate_factory.generateCertificate
            (file_inputstream);
            Field=x509certificate.getType();
            CA_ItemData[0][0]="类型";
            CA_ItemData[0][1]=Field;
            Field=Integer.toString(x509certificate.getVersion());
            CA_ItemData[1][0]="版本";
            CA_ItemData[1][1]=Field;
            Field=x509certificate.getSubjectDN().getName();
            CA_ItemData[2][0]="标题";
            CA_ItemData[2][1]=Field;
            /* 以下类似，这里省略
            Field=x509certificate.getNotBefore().toString();得到开始有效日期
            Field=x509certificate. getNotAfter().toString();得到截止日期
            Field=x509certificate.getSerialNumber().toString(16);得到序列号
            Field=x509certificate.getIssuerDN().getName();得到发行者名
            Field=x509certificate.getSigAlgName();得到签名算法
            Field=x509certificate.getPublicKey().getAlgorithm();得到公钥算法 */
            file_inputstream.close();
            final JTable table = new JTable(CA_ItemData, columnNames);
            TableColumn tc=null;
            tc = table.getColumnModel().getColumn(1);
            tc.setPreferredWidth(600);
            panel.add(table);
            }catch(Exception exception){
            exception.printStackTrace();
            return -1;
            }
            return 0;
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
如果以字符串形式读取证书，加入下面Read_Bin这个函数。其中CertificateFactory.generateCertificate() 这个函数可以从证书标准编码(RFC1421定义)中解出可读信息。Read_Bin函数代码如下： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>private int Read_Bin(JPanel panel){
            try{
            FileInputStream file_inputstream=new FileInputStream(CA_Name);
            DataInputStream data_inputstream=new DataInputStream(file_inputstream);
            CertificateFactory certificatefactory=CertificateFactory.getInstance("X.509");
            byte[] bytes=new byte[data_inputstream.available()];
            data_inputstream.readFully(bytes);
            ByteArrayInputStream bais=new ByteArrayInputStream(bytes);
            JEditorPane Cert_EditorPane;
            Cert_EditorPane=new JEditorPane();
            while(bais.available()&gt;0){
            X509Certificate
            Cert=(X509Certificate)certificatefactory.generateCertificate(bais);
            Cert_EditorPane.setText(Cert_EditorPane.getText()+Cert.toString());
            }
            Cert_EditorPane.disable();
            JScrollPane edit_scroll=new JScrollPane(Cert_EditorPane);
            panel.add(edit_scroll);
            file_inputstream.close();
            data_inputstream.close();
            }catch( Exception exception){
            exception.printStackTrace();
            return -1;
            }
            return 0;
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
如果要得到原始证书编码后的信息，则可用如下代码： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>private int Read_Raw(JPanel panel){
            try{
            JEditorPane Cert_EditorPane=new JEditorPane();
            String CertText=null;
            File inputFile = new File(CA_Name);
            FileReader in = new FileReader(inputFile);
            char[] buf=new char[2000];
            int len=in.read(buf,0,2000);
            for(int i=1;i&lt;len;i++)
            {
            CertText=CertText+buf[i];
            }
            in.close();
            Cert_EditorPane.setText(CertText);
            Cert_EditorPane.disable();
            JScrollPane edit_scroll=new JScrollPane(Cert_EditorPane);
            panel.add(edit_scroll);
            }catch( Exception exception){
            exception.printStackTrace();
            return -1;
            }
            return 0;
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
最后用这个小程序看一看刚才生成的证书mycert.crt内容，把文件名写入main()中： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>public static void main(String[] args) {
            JFrame frame = new JFrame("证书阅读器");
            frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {System.exit(0);}
            });
            frame.getContentPane().add(new CARead("mycert.crt"),BorderLayout.CENTER);
            frame.setSize(700, 425);
            frame.setVisible(true);
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
证书mycert.crt的内容显示如图2所示，所有信息和Base64的显示内容，这里不再列举。 <br />
<br />
</p>
<center class="postText"><img src="http://www.it918.com/Files/NewsUpfiles/20040414C1527282.gif"  alt="" /></center>
<p class="postText"><br />
<br />
&nbsp;</p>
<center class="postText">图2 证书mycert.crt的内容显示</center>
<div class="postText" align="left"><font size="3"></font>&nbsp;</div>
<div class="postText" align="left">现在已经读取了证书的一些内容，那么怎样使用证书呢？我们可以假设A和B要共享一个绝密的文件F，B信任并拥有A的证书，也就是说B拥有A的公钥。那么A通过A和B共知的加密算法(对称密钥算法，比如DES算法)先加密文件F，然后对加密后的F进行签名和散列摘要(比如MD5算法，目的是保证文件的完整性)，然后把F发送到B。B收到文件后，先用A的证书中的公钥验证签名，然后再用通过共知的加密算法解密，就可以得到原文件了。这里使用的数字签名，可以保证B得到的文件，就是A的，A不能否认其不拥有文件F，因为只有A拥有可以让A的公钥验证其签名的私钥，同时这里使用DES算法加密，使得文件有保密性。 <br />
<br />
使用DES算法的加密解密函数类似，这里不对加密算法做进一步讨论，详细请看J2SDK的JSE部分内容，加密签名、解密验证文件结构见图3。 <br />
<br />
<center><img src="http://www.it918.com/Files/NewsUpfiles/20040414C1527283.gif"  alt="" /></center><br />
<br />
<center>图3 加密签名、解密验证文件结构图</center><br />
<br />
加密函数中的desKeyData存放DES加密密钥，如果要在程序中指定，可以设置为： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>static byte[] desKeyData = { (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
            (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08 };</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
加密函数写成： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>public static void crypt(byte[] cipherText,String outFileName){
            try{
            DESKeySpec desKeySpec = new DESKeySpec(desKeyData);
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
            Cipher cdes = Cipher.getInstance("DES");
            cdes.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] ct = cdes.doFinal(cipherText);
            try{
            FileOutputStream out=new FileOutputStream(outFileName);
            out.write(ct);
            out.close();
            }catch(IOException e){
            e.printStackTrace();
            }
            }catch (Exception e){
            e.printStackTrace();
            }
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
其中ct就是加密后的内容,outFileName保存加密后文件的文件名。把cdes.init(Cipher.ENCRYPT_MODE, secretKey)换成cdes.init(Cipher.DECRYPT_MODE, secretKey)就是解密文件了。 <br />
<br />
文件加密后就要对文件签名，保证A发送到B的文件不可伪造。下面是用存放在.keystore中的私钥进行签名的函数，签名使用的摘要算法是MD5。其中sigText是被签名内容的输入数组，outFileName是保存签名后输出文件的名称，KeyPassword是读取Keystore使用的密码，KeyStorePath是存放.keystore文件的路径，函数代码如下： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>public static void sig(byte[] sigText, String outFileName,String
            KeyPassword,String KeyStorePath){
            char[] kpass;
            int i;
            try{
            KeyStore ks = KeyStore.getInstance("JKS");
            FileInputStream ksfis = new FileInputStream(KeyStorePath);
            BufferedInputStream ksbufin = new BufferedInputStream(ksfis);
            kpass=new char[KeyPassword.length()];
            for(i=0;i&lt;KeyPassword.length();i++)
            kpass[i]=KeyPassword.charAt(i);
            ks.load(ksbufin, kpass);
            PrivateKey priv = (PrivateKey) ks.getKey(KeystoreAlias,kpass );
            Signature rsa=Signature.getInstance("MD5withRSA");
            rsa.initSign(priv);
            rsa.update(sigText);
            byte[] sig=rsa.sign();
            System.out.println("sig is done");
            try{
            FileOutputStream out=new FileOutputStream(outFileName);
            out.write(sig);
            out.close();
            }catch(IOException e){
            e.printStackTrace();
            }
            }catch(Exception e){
            e.printStackTrace();
            }
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
验证签名需要存放签名文件和被签名的文件以及证书，其中，updateData存放被签名文件的内容，sigedText存放得到的签名内容，CertName是证书名。验证签名代码如下： <br />
<br />
<ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>public static void veriSig(byte[] updateData, byte[] sigedText){
            try{
            CertificateFactory
            certificatefactory=CertificateFactory.getInstance("X.509");
            FileInputStream fin=new FileInputStream(CertName);
            X509Certificate
            certificate=(X509Certificate)certificatefactory.generateCertificate(fin);
            PublicKey pub = certificate.getPublicKey();
            Signature rsa=Signature.getInstance("MD5withRSA");
            rsa.initVerify(pub);
            rsa.update(updateData);
            boolean verifies=rsa.verify(sigedText);
            System.out.println("verified "+verifies);
            if(verifies){
            System.out.println("Verify is done!");
            }else{
            System.out.println("verify is not successful");
            }
            }catch(Exception e){
            e.printStackTrace();
            }
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
可以用keytool产生两个自签的签名证书，或者到某个CA去申请两个证书。用Java编写加密和验证程序，上述例子只是一个非常简单的证书应用，实际协议对证书的使用(比如SSL)要比这个复杂多了。 </div>
 <img src ="http://www.blogjava.net/Martin-Liu-Hai-Shi/aggbug/232849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Martin-Liu-Hai-Shi/" target="_blank">aisoft</a> 2008-10-07 10:26 <a href="http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/232849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate应该如何配置Access数据库。</title><link>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/225292.html</link><dc:creator>aisoft</dc:creator><author>aisoft</author><pubDate>Thu, 28 Aug 2008 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/225292.html</guid><wfw:comment>http://www.blogjava.net/Martin-Liu-Hai-Shi/comments/225292.html</wfw:comment><comments>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/225292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Martin-Liu-Hai-Shi/comments/commentRss/225292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Martin-Liu-Hai-Shi/services/trackbacks/225292.html</trackback:ping><description><![CDATA[<div class="blog_content">---------<a href="http://venus224.javaeye.com/blog/208934">Hibernate和Access(转载)</a>--------<br />
<br />
1、Hibernate对于Access的支持 <br />
<br />
方法一： <br />
<br />
下载两个jar包，一个是Access的JDBC驱动包；另一个是数据库方言包，里面有支持Access方言的类。 <br />
<br />
下载地址：http://www.hxtt.com/access.zip，http://www.hxtt.com/test/hibernate.zip。 <br />
<br />
配置如下： <br />
<br />
xml 代码 <br />
&lt;property name="hibernate.dialect"&gt; <br />
com.hxtt.support.hibernate.HxttAccessDialect <br />
&lt;/property&gt; <br />
&lt;property name="hibernate.connection.url"&gt; <br />
jdbc:access:///f:/mdbfiles/aaa.mdb <br />
&lt;/property&gt; <br />
&lt;property name="hibernate.connection.driver_class"&gt; <br />
com.hxtt.sql.access.AccessDriver <br />
&lt;/property&gt; <br />
<br />
方法二： <br />
<br />
首先先要在ODBC里配置好我们的Access数据库，控制面板---&gt;管理工具---&gt;ODBC，选择系统DSN选项卡，按添加按钮，选Driver do Mircosoft Access(*.mdb)，完成，在DataSource Name中输入你想要的名字比如hibtest，后面将用它来查找数据库。然后指定数据库所在位置就OK了。 <br />
<br />
Hibernate描述文件可以是一个properties或xml 文件，其中最重要的是定义数据库的连接。我这里列出的是一个XML格式的hibernate.cfg.xml描述文件。 <br />
<br />
<br />
xml 代码 <br />
&lt;?xml version="1.0" encoding="utf-8"?&gt; <br />
&lt;!DOCTYPE hibernate-configuration <br />
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" <br />
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"&gt; <br />
&lt;hibernate-configuration&gt; <br />
&lt;session-factory name="java:/hibernate/HibernateFactory"&gt; <br />
&lt;property name="show_sql"&gt;true&lt;/property&gt; <br />
&lt;property name="connection.driver_class"&gt; <br />
sun.jdbc.odbc.JdbcOdbcDriver&lt;!-- 这里是Access的JDBCdriverclass名 --&gt; <br />
&lt;/property&gt; <br />
&lt;property name="connection.url"&gt; <br />
jdbc:odbc:hibtest &lt;!-- 这里是你刚才指定的数据库名字 --&gt; <br />
&lt;/property&gt; <br />
&lt;property name="connection.username"&gt;sa&lt;/property&gt; <br />
&lt;property name="connection.password"&gt;&lt;/property&gt; <br />
&lt;property name="dialect"&gt; <br />
net.sf.hibernate.dialect.MySQLDialect &lt;!-- 这里是Access的Dialect --&gt; <br />
&lt;/property&gt; <br />
&lt;mapping resource="Customer.hbm.xml"/&gt; &lt;!-- 指定Customer的映射文件 --&gt; <br />
&lt;/session-factory&gt; <br />
&lt;/hibernate-configuration&gt; <br />
<br />
<span style="color: red">方法三： <br />
1、&lt;!-- SQL方言，Access和SQLserver相近，所以这么写，严格意义会出错，但是尝试简单连接时可以的 --&gt; <br />
&lt;property name="dialect"&gt; <br />
org.hibernate.dialect.SQLServerDialect <br />
&lt;/property&gt; <br />
2、&lt;!-- JDBC驱动程序 --&gt; <br />
&lt;property name="connection.driver_class"&gt; <br />
sun.jdbc.odbc.JdbcOdbcDriver <br />
&lt;/property&gt; <br />
<br />
<br />
3、&lt;!-- JDBC URL ，需要注意的是数据库位置使用绝对路径就可以--&gt; <br />
&lt;property name="connection.url"&gt; <br />
jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=E:\STDateBase\student.mdb <br />
&lt;/property&gt; </span></div>
    <img src ="http://www.blogjava.net/Martin-Liu-Hai-Shi/aggbug/225292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Martin-Liu-Hai-Shi/" target="_blank">aisoft</a> 2008-08-28 14:27 <a href="http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/225292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 读取网页Html文件</title><link>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/214615.html</link><dc:creator>aisoft</dc:creator><author>aisoft</author><pubDate>Sun, 13 Jul 2008 12:38:00 GMT</pubDate><guid>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/214615.html</guid><wfw:comment>http://www.blogjava.net/Martin-Liu-Hai-Shi/comments/214615.html</wfw:comment><comments>http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/214615.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Martin-Liu-Hai-Shi/comments/commentRss/214615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Martin-Liu-Hai-Shi/services/trackbacks/214615.html</trackback:ping><description><![CDATA[<p>import java.net.*;<br />
import java.io.*;</p>
<p>public class urlconnection<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer document = new StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL url = new URL("http://www.163.com");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URLConnection conn = url.openConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String line = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ((line = reader.readLine()) != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.append(line + " ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (MalformedURLException e)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (IOException e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(document.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
==========================================================<br />
方法二：<br />
==========================================================<br />
import java.net.*;<br />
import java.io.*;</p>
<p>public class useSourceViewer <br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static void main (String[] args)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (args.length &gt; 0)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL u = new URL(args[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream in = u.openStream( );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in = new BufferedInputStream(in);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reader r = new InputStreamReader(in);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int c;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ((c = r.read( )) != -1)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print((char) c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object o = u.getContent( );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("I got a " + o.getClass().getName( ));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (MalformedURLException e)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(args[0] + " is not a parseable URL");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (IOException e)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
} <br />
</p>
  <img src ="http://www.blogjava.net/Martin-Liu-Hai-Shi/aggbug/214615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Martin-Liu-Hai-Shi/" target="_blank">aisoft</a> 2008-07-13 20:38 <a href="http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/214615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>