<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Jatula</title>
    <description>专做于细，我喜欢简单的东西，东西不在深，在于用得流畅；</description>
    <link>http://jatula.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Jqury回调</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/219506" style="color:red;">http://jatula.javaeye.com/blog/219506</a>&nbsp;
          发表时间: 2008年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>动作：</strong></p>
<p>function saveDefault(ptid){</p>
<p>&nbsp;&nbsp;var httpRequest;<br />&nbsp;&nbsp;httpRequest = $.get("&lt;%=request.getContextPath()%&gt;/play/playList.do?do=savePlayTime&amp;id="+ptid+"&amp;startTime="+starttime+"&amp;endTime="+endtime+"","",function(){saveHourOk("stateHour_"+ptid,httpRequest)});}</p>
<p><strong>处理：</strong></p>
<p>httpRequest为回调部分</p>
<p>&nbsp;</p>
<p>前面请求部分返回处理为：out.print("success");</p>
<p>不要用out.println()，不然出错；</p>
<p><strong>CallBack:</strong></p>
<p>function saveHourOk(id,httpRequest){<br />&nbsp;&nbsp;var message=httpRequest.responseText;<br />&nbsp;&nbsp;alert(message);<br />&nbsp;&nbsp;alert(id);<br />&nbsp;&nbsp;if(message=="true"){<br />&nbsp;&nbsp;&nbsp;showMsg(id,"&lt;bean:message key='playTempletList.view.save'/&gt;");<br />&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;showMsg(id,"&lt;bean:message key='playTempletList.view.savefalse'/&gt;");<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;miss(id);<br />}</p>
<p>&nbsp;</p>
<p>//返回信息<br />function showMsg(id,msg){<br />&nbsp;show(id);<br />&nbsp;var obj = document.getElementById(id);<br />&nbsp;obj.innerHTML = msg;</p>
<p>&nbsp;miss(id);<br />&nbsp;<br />}</p>
<p>&nbsp;</p>
<p>//消失吧<br />function miss(id){<br />&nbsp;window.setTimeout(function(){$("#"+id).fadeOut('slow')},4000);<br />&nbsp;//window.setTimeout(function(){hide(id)},3000);<br />}</p>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/219506#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Jul 2008 14:07:40 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/219506</link>
        <guid>http://jatula.javaeye.com/blog/219506</guid>
      </item>
      <item>
        <title>深入了解struts中的struts-config.xml</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/195474" style="color:red;">http://jatula.javaeye.com/blog/195474</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>弄清楚struts-config.xml中各项元素的作用，对于我们构建web项目有莫大的好处。&lt;struts-config&gt;是struts的根元素，它主要有8个子元素，DTD定义如下： </p>
<p>&lt;!ELEMENT struts-config<br />(data-sources?,form-beans?,global-exceptions?,global-forwards?,action-mappings?,controller?,message-resources*,plug-in*)<br />&gt;<br />以上8个元素，下面一一描述：<br /><span style="color: #ff0000;"><strong>1. date-sources元素<br /></strong></span><span style="color: #000000;"><strong>　　</strong>date-sources元素用来配置应用程序所需要的数据源。java语言提供了javax.sql.DateSource接口，所有数据源必须实现该接口。如下配置：<br />&lt;data-sources&gt;<br />　　&lt;data-source type="org.apached.commons.dbcp.BasicDataSource"&gt;<br />　　　　&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;<br />　　&lt;/data-source&gt;<br /></span>&lt;/data-sources&gt;<br />在Action中访问方式如：<br />javax.sql.DataSource dataSource;<br />java.sql.Connection myConnection;<br />try<br />{<br />　　dataSource = getDataSource(request);<br />　　myConnection　＝　dataSource.getConnection();<br />}<br />&hellip;&hellip;&hellip;&hellip;<br />　　如果是多数据源，可用如下配置：<br />&lt;data-sources&gt;<br />　　&lt;data-source key="a"&nbsp; type="org.apached.commons.dbcp.BasicDataSource"&gt;<br />　　　　&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;<br />　　&lt;/data-source&gt;<br />　　&lt;data-source key="b"&nbsp;&nbsp; type="org.apached.commons.dbcp.BasicDataSource"&gt;<br />　　　　&hellip;&hellip;&hellip;&hellip;&hellip;&hellip; <br />　　&lt;/data-source&gt;<br />&lt;/data-sources&gt;<br />访问方式：dataSource = getDataSource(request,"a");</p>
<p><strong><span style="color: #ff0000;">&nbsp;2. form-beans元素</span></strong><br />　　该元素主要用来配置表单验证的类。它包含如下属性：<br />　　1. classname：一般用得少，指定和form-bean无素对应的配置类，默认为org.apache.struts.config.FormBeanConfig，如果自定义，则必须扩展FormBeanConfig类。可有可无。<br />　　2. name：ActionForm Bean的惟一标识。必须。<br />　　3. type：ActionForm的完整类名。必须。<br />如下所示：<br />&lt;form-beans&gt;<br />　　&lt;form-bean <br />　　　　　　name="Loign"<br />　　　　　　type="com.ha.login"&gt;<br />　　&lt;/form-bean&gt;<br />&lt;/form-beans&gt;<br />　　如果是动态Action FormBean，还必须配置form-bean元素的form-property子元素。它包含四个属性，上面三个，还有一个initial 元素：以字符串的形式设置表单字段的初始值，如果没有设置该属性，则是基本类型为0，如果是对象则为null。可有可无。如下所示：<br />&lt;form-beans&gt;<br />　　&lt;form-bean <br />　　　　　　name="Loign"<br />　　　　　　type="com.ha.login"&gt;<br />　　　　　&lt;form-property name="ok"&nbsp; type="java.lang.String"/&gt;<br />　　　　　&lt;form-property name="oks"&nbsp; type="java.lang.String"/&gt;<br />　　　　　&lt;form-property name="okss"&nbsp; type="java.lang.Integer" initial="20"/&gt;<br />　　&lt;/form-bean&gt;<br />&lt;/form-beans&gt;</p>
<p><strong><span style="color: #ff0000;">&nbsp;3. global-exceptions元素</span></strong><br />　　该元素主要配置异常处理，它的exception子元素代表全局的异常配置。struts采取配置的方式来处理异常。它用来设置java异常和异常处理类org.apache.struts.action.ExceptionHandler之间的映射。它有七个属性，如下所示：<br />　　1. className：指定和exception元素对应的配置类，默认为：org.apache.struts.config.ExceptionConfig。可有可无。<br />　　2. Handler：指定异常得理类，默认为：org.apache.struts.action.ExceptionHandler。可有可无<br />　　3. key：指定在Resource Bundle中描述该异常的消息key<br />　　4. path：指定当异常发生时的转发路径。<br />　　5. scope：指定ActionMessages实例的存放范围，可选值包括：request和session，默认为request。可有可无。<br />　　6. type：指定所需处理异常类的名字，必须。<br />　　7. bundle：指定Resource Bundle<br />如下所示：<br />&lt;global-exceptions&gt;<br />　　&lt;exception <br />　　　　　　key="global.error.invalidlogin"<br />　　　　　　path="/error.jsp"<br />　　　　　　scope="request"<br />　　　　　　type="com.hn.tree"<br />　　/&gt;<br />&lt;/global-exceptions&gt;</p>
<p><span style="color: #ff0000;"><strong>&nbsp;4. global-forwards元素<br /></strong></span>　　该元素主要用来声明全局的转发关系，它具有以下四个属性：<br />　　1. className：和forward元素对应的配置类，默认为：org.apache.struts.action.ActionForward。可有可无。<br />　　2. contextRelative：此项为true时，表时path属性以＂/＂开头，相对于当前上下文的URL，默认为false．可有可无。　<br />　　3. name：转发路径的逻辑名．必填。<br />　　4. path：转发或重定向的URL，当contextRelative=false时，URL路径相对于当前应用（application），当为ture时，表示URL路径相对于当前上下文（context）。<br />　　5.&nbsp; redirect：当此项为ture时，表示执行重定向操作。当此项为false时表示转向操作。默认为false。<br />如下所示：<br />&lt;global-forwards&gt;<br />　　&lt;forward&nbsp; name="forms1" &nbsp;path="/a.do"/&gt;<br />　　&lt;forward&nbsp; name="forms2" &nbsp;path="/nb.jsp"/&gt;<br />&lt;global-forwards&gt;</p>
<p><span style="color: #ff0000;"><strong>&nbsp;5. action-mappings元素</strong></span><br />　　描述从特定的请求路径到相应的Action类的映射。它具有以下几个属性：<br />　　1. attribute：设置和Action关联的ActionForm Bean在request和session范围内的key。如：Form Bean存在于request范围内，此项设为&ldquo;myBenas&rdquo;，则在request.getAttribute("myBenas")就可以返回该Bean的实例。<br />　　2. classsName：和action元素对应的配置元素，默认为：org.apache.struts.action.ActionMapping.<br />　　3. forward：转发的URL路径。<br />　　4. include：指定包含的URL路径。<br />　　5. input：输入表单的URL路径，当表单验证失败时，将把请求转发到该URL。<br />　　6. name：指定和Action关联的Action FormBean的名字，该名字必须在Form-Bean定义过。<br />　　7. path：指定访问Action的路径，以&ldquo;/&rdquo;开头，无扩展名。<br />　　8. parameter：指定Actgion的配置参数，在Action类的execute()方法中，可以调用ActionMapping对象的getParameter()方法来读取该配置参数。<br />　　9. roles：指定允许调用该Action的安全角色，多个角色之间用，隔开，在处理请求时，RequestProcessor会根据该配置项来决定用户是否有权限调用Action权限。<br />　　10. scope：指定ActionForm Bean的存在范围，可选取为request和session，默认为session。<br />　　11. type：指定Action类的完整类名。<br />　　12. unknown：如果此项为true，表示可以处理用户发出的所有无效的Action URL，默认为false；<br />　　13. validate：指定是否要调用Action FormBean的validate方法，默认值为ture.<br />注：forward、include、type属性只能选中其中一项。<br />如下：<br />&lt;action path="/search"<br />　　　　type="zxj.okBean"<br />　　　　name="a1"<br />　　　　scope="request"<br />　　　　validate="true"<br />　　　　input="/b.jsp"&gt;<br />　　&lt;forward name="tig" path="/aa.jsp"/&gt;<br />&lt;/action&gt;<br />注：此中的forward是指局部的转发路径。global-forwards表示全局的转发路径。</p>
<p><span style="color: #ff0000;"><strong>&nbsp;6. controller元素<br /></strong></span>　　该元素用于配置ActionServlet。它具有以下属性。<br />　　1. bufferSize：指定上载文件的输入缓冲大小，可选，默认为4096<br />　　2. className：指定和controller元素对应的配置类，默认为org.apache.struts.config.ControllerConfig<br />　　3. conentType：字符编码，如果在Action和JSP网页中设置了，则覆盖该设置。<br />　　4. locale：指定是否把Locale对象保存到当前用户的session中，默认值为false.<br />　　5. processorClass：指定负责请求的java类完整路径。<br />　　6. tempDir：指定处理文件的临时工作目录，如果此项没有设置，将采用Servlet容器为web应用分配的临时工作目录。<br />　　7. nochache：如果为true：在响应结果中将加入特定的头参数：Pragma,Cache-Control和Expise，防止页面被保存在客户端的浏览器中，默认为false<br />如下：<br />&lt;controller<br />　　contentType="text/html;charset="UTF-8""<br />　　locale="true"<br />　　processorClass="con.ok"/&gt;</p>
<p><span style="color: #ff0000;"><strong>&nbsp;7. message-resources元素</strong></span><br />　　主要配置本地化消息文本，它具有以下属性。<br />　　1. className：和message-resources元素对应的配置类，默认为org.apache.struts.config.MessageResourcesConfig。<br />　　2. factory：指定消息资源的工厂类，默认为：org.apache.struts.util.PropertyMessageResourcesFactory类<br />　　3. key：指定Resource Bundle存放的ServletContext对象中时采用的属性Key，默认由Globals.MESSAGES_KEY定义的字符串常量，只允许一个Resource Bundle采用默认的属性Key。<br />　　4. null：指定MessageSources类如何处理未知消息的key，如果为true，则返回空字符串，如果为false，则返回相关字串，默认为false<br />　　5. prameter：指定MessageSources的资源文件名，如果为：a.b.ApplicationResources，则实际对应的文件路径为：WEB-INF/classes/a/b/ApplicationResources.properties.<br />如：<br />&lt;message-resources null="false" parameter="defaultResource"/&gt;<br />&lt;message-resources key="num1" null="false" parameter="test"/&gt;<br />访问为：<br />&lt;bean:message&nbsp; key="zxj"/&gt;<br />&lt;bean:message&nbsp; key="zxj"&nbsp; bundle="num1"/&gt;<br />其中，zxj表法，messagesource资源文件中的一个字符串。</p>
<p><span style="color: #ff0000;"><strong>&nbsp;8. plugin-in元素</strong></span><br />　　配置Struts的插件，属性如下：<br />　　1.&nbsp;className：指定的Struts插件类，必须实现org.apache.struts.action.PlugiIn接口。如：<br />&lt;plug-in<br />　　className="a.b.c."&gt;<br />　　&lt;set-property property="xxx" value="/WEB-INF/aa.xml"&nbsp;&nbsp;/&gt;<br />&lt;/plug-in&gt;</p>
<p>&nbsp;后记，多模块的配置，可以供多个应用应用不同的struts-config.xml&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/195474#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 May 2008 02:25:13 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/195474</link>
        <guid>http://jatula.javaeye.com/blog/195474</guid>
      </item>
      <item>
        <title>JAVA回调机制</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/193335" style="color:red;">http://jatula.javaeye.com/blog/193335</a>&nbsp;
          发表时间: 2008年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>其技巧就是：定义一个简单接口，并在该接口中声明我们要调用的方法。</p>
<p>下面举一个例子：</p>
<p>假定我们希望在某个事件发生时得到通知。我们可以定义一个接口：</p>
<p>/*<br />&nbsp;* 在某个事件发生时得到通知．<br />&nbsp;*/<br />public interface InterestingEvent {<br />　　&nbsp;public void interestingEvent();<br />}</p>
<p>此接口中的方法，是个没有返回值的也没有任何参数，如果您愿意也可以有返回值，也可以带参数．这就要看具体需求而定．</p>
<p>这使得我们可以控制实现该接口的类的任何对象。因此，我们不必关心任何外部类型信息。与在将 C++ 代码用于Motif 时使用窗口小部件的数据域来容纳对象指针的难以控制的 C 函数相比，这种方法要好得多。</p>
<p>实现接口的代码如下：</p>
<p>public class CallMe implements InterestingEvent {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public CallMe() {<br />　　&nbsp;}</p>
<p>　　&nbsp;public void interestingEvent() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　 System.out.println("发生了打印事件，哈哈"); <br />&nbsp;　　}</p>
<p>}</p>
<p>public class CallYou implements InterestingEvent {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public CallYou() {<br />&nbsp;&nbsp;　&nbsp;}</p>
<p>&nbsp;public void interestingEvent() {<br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("发生了查询事件，哈哈"); <br />&nbsp;}</p>
<p>}</p>
<p>发出事件信号的类必须等待实现了 InterestingEvent 接口的对象，并在适当时候调用 interestingEvent() 方法。</p>
<p>public class EventNotifier {<br />&nbsp;private InterestingEvent ie;<br />&nbsp;private boolean somethingHappened ;<br />&nbsp;public EventNotifier() {<br />&nbsp;&nbsp;somethingHappened = true ;<br />&nbsp;}<br />&nbsp;public void setInterestingEvent(InterestingEvent ie){<br />&nbsp;&nbsp;this.ie = ie ;<br />&nbsp;}<br />&nbsp;public void doWork(){<br />&nbsp;&nbsp;if(somethingHappened){<br />&nbsp;&nbsp;&nbsp;ie.interestingEvent();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;<br />}</p>
<p>下面做一下测试．</p>
<p>public class Test {</p>
<p>&nbsp;/**<br />&nbsp; * @param args<br />&nbsp; */<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;CallMe cm = new CallMe();<br />&nbsp;&nbsp;CallYou cy = new CallYou();<br />&nbsp;&nbsp;EventNotifier en = new EventNotifier();</p>
<p>&nbsp;&nbsp;en.setInterestingEvent(cm);<br />&nbsp;&nbsp;en.doWork();<br />&nbsp;&nbsp;en.setInterestingEvent(cy);<br />&nbsp;&nbsp;en.doWork();<br />&nbsp;}</p>
<p>}</p>
<p>此测试在发生指定的调用CalMe事件时，就扫行CallMe下的命令，如发生CallYou事件时，就调用CallYou下的命令．此种方法可以结合Command模式．实现MS-Windows 和 X Window System 事件驱动编程模型．</p>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/193335#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 May 2008 16:55:30 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/193335</link>
        <guid>http://jatula.javaeye.com/blog/193335</guid>
      </item>
      <item>
        <title>FTP命令详解及使用技巧</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/188611" style="color:red;">http://jatula.javaeye.com/blog/188611</a>&nbsp;
          发表时间: 2008年05月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>ascii: 设定以ASCII方式传送文件(缺省值) <br />bell: 每完成一次文件传送,报警提示. <br />binary: 设定以二进制方式传送文件. <br />bye: 终止主机FTP进程,并退出FTP管理方式. <br />case: 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母. <br />cd: 同UNIX的CD命令. <br />cdup: 返回上一级目录. <br />chmod: 改变远端主机的文件权限. <br />close: 终止远端的FTP进程,返回到FTP命令状态, <br />所有的宏定义都被删除. <br />delete: 删除远端主机中的文件. <br />dir [remote-directory] [local-file] <br />列出当前远端主机目录中的文件.如果有本地文件,就将结果 <br />写至本地文件. <br />get [remote-file] [local-file] <br />从远端主机中传送至本地主机中. <br />help [command] <br />输出命令的解释. <br />lcd: 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录. <br />ls [remote-directory] [local-file] <br />同DIR. <br />macdef: 定义宏命令. <br />mdelete [remote-files] <br />删除一批文件. <br />mget [remote-files] <br />从远端主机接收一批文件至本地主机. <br />mkdir directory-name <br />在远端主机中建立目录. <br />mput local-files <br />将本地主机中一批文件传送至远端主机. <br />open host [port] <br />重新建立一个新的连接. <br />prompt: 交互提示模式. <br />put local-file [remote-file] <br />将本地一个文件传送至远端主机中. <br />pwd: 列出当前远端主机目录. <br />quit: 同BYE. <br />recv remote-file [local-file] <br />同GET. <br />rename [from] [to] <br />改变远端主机中的文件名. <br />rmdir directory-name <br />删除远端主机中的目录. <br />send local-file [remote-file] <br />同PUT. <br />status: 显示当前FTP的状态. <br />system: 显示远端主机系统类型. <br />user user-name [password] [account] <br />重新以别的用户名登录远端主机. <br />?: 同HELP. <br />FTP使用技巧 <br /><br />FTP(文件传输)和E-mail(电子邮件)、Telnet(远程登录)一样,是 <br />Internet的三大主要功能之一。因为使用频繁,用户往往会遇到各种 <br />各样的问题,合理利用FTP命令的初始化文件.netrc,使运行FTP后自动 <br />执行某些FTP的内部命令,可有效地克服各种使用中的不便,极大地方 <br />便FTP的使用者。 <br />&middot;netrc中应包含的基本命令 <br />FTP中有几十个命令,在.netrc中应该设置的大致有如下几条: <br />1.default login&lt;login_name&gt;password&lt;password&gt; <br />在Internet中,存在大量的匿名ftp帐户,用户在不同的主机间频 <br />繁登录anonymous帐户,输入自己的电子邮件地址作为口令,这种输入 <br />极其繁琐,完全有必要利用.netrc文件,在进入ftp时自动完成该过程 <br />。 <br />2.binary <br />许多用户在下载大量文件之后才意识到下载的文件是二进制文件 <br />,而自己却是使用ascii方式传输,使下载文件无法使用,做了许多无用 <br />功。在.netrc文件中提前将传输方式设置为binary,完全可避免出现 <br />上述情况。 <br />3.runique <br />使用Internet的用户都知道,在浩如烟海的文件中,有大量同名文 <br />件,如readme、index等,如果将同名文件下载到同一目录,则新传的文 <br />件会覆盖原同名文件。为了使具有潜在重要性的文件不至于被意外覆 <br />盖,也需要在.netrc文件中,设置runique参数防止上述错误。 <br />4.prompt off <br />使用ftp时,经常会用到mget或其它需要确认的ftp命令,将这种确 <br />认过程取消,可大大方便使用者。 <br />5.hash on <br />ftp中的hash命令,使得在进行文件传输时,每传输1千字节,在屏 <br />幕上显示一个"#"号,用户通过观看屏幕上的"#"号,可以很直观地看到 <br />传输速度的快慢,以及文件的传输完成情况,以决定进一步的操作。 <br />6.idle 7200 <br />目前国内的Internet专线速率普遍偏低,用户数却在急剧膨胀,所 <br />以用ftp传输销大一些的文件时,经常会因为线路拥塞而断线,致使ftp <br />进程中断,为了减少因断线而反复登录的次数,需将idle命令的参数设 <br />置为最大(一般为7200秒)。 <br />7.macdef&lt;macro_name&gt; <br />macdef定义一个宏,macro_name为宏定义的名称。在macdef行下, <br />可输入任何有效的ftp命令,并以空行结束宏定义,执行时只需在宏名 <br />前加"$"号即可。如果宏名定义为init,则该宏命令在启动ftp后自动 <br />加以执行,无需用户输入$ macro_name。 <br />&middot;netrc的使用举例 <br />1.用vi编辑器先编辑一个如下的文件: <br />default login anonymous password user@my.site <br />macdef init <br />binary . <br />runique . <br />hash on . <br />prompt off <br />idle 7200 <br />(空行) <br />第1行意为缺省情况下,进入anonymous帐户,并以自己的电子邮件 <br />地址为口令;第2行至第8行定义了宏init,该宏中的所有5条命令将在 <br />进入ftp环境后立刻执行,第8行(空行)不可省略,否则为无效宏定义。 <br />2.利用.netrc可将用户所需操作大大简化,极大地提高工作效率 <br />。如,利用archie命令查找到文件xplaygizmo-1.0.gz在匿名ftp主机s <br />unsite.unc.e-du的目录/pub/packages/solaris/freeware下,用户欲 <br />将该文件用ftp下载,只需用vi编辑器将archie的查找结果插入到.net <br />rc文件空行之上,即增加下列三行: <br />cd/pub/packages/solaris/freeware <br />get xplaygizmo-1.0.gz <br />bye <br />(空行) <br />运行ftp sunsite.unc.edu,即自动完成上述.netrc中的所有操作 <br />,无需任何人工干预。屏幕将显示类似于下面的结果: <br />Connected to sunsite.unc.edu. <br />220 calzone FTP server(Version wu-2.4(38)Wed 0ct 2 09:30 <br />:40 EDT 1996)ready <br />331 Guest login ok,send your complete e-mail address as <br />password. <br />230............. <br />230 Guest login ok,access resrictions apply. <br />200 Type set to I. <br />Receive unique on. <br />Hash mark printing on (1024 bytes/hash mark). <br />Interactive mode off. <br />200 Maximum IDLE time set to 7200 seconds <br />cd/pub/packages/solaris/freeware <br />250 CWD command successful. <br />get xplaygizmo-1.0.gz <br />200 PORT command successful. <br />150 Opening BINARY mode data connection for xplaygizmo-1 <br />.0.gz(8753 bytes). <br />######## <br />226 Transfer complete. <br />8753 bytes received in 50.8 secs(0.17 Kbytes/sec) <br />221 Goodbye. <br />缺省时,运行ftp命令将检测用户的HOME目录中的.netrc文件,并 <br />自动加以执行,如果不想使用.netrc,可在ftp命令行中使用-n参数加 <br />以取消。</p>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/188611#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 01 May 2008 11:38:42 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/188611</link>
        <guid>http://jatula.javaeye.com/blog/188611</guid>
      </item>
      <item>
        <title>FTP状态代码说明及PORT模式和PASV模式比较</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/188317" style="color:red;">http://jatula.javaeye.com/blog/188317</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>PORT模式和PASV模式</p>
<p>PORT模式下的FTP服务： <br />缺省情况下PORT模式的数据端口是20， 控制端口是21（控制端口可以设定， 本文假定使用21）。 当进行连接时,客户端使用一个</p>
<p>随机的端口N（N大于1024)连接服务器的控制端口21， 然后客户端开始监听端口N+1，并向服务器发送命令 PORT N+1，服务器用自</p>
<p>己的数据端口20连回客户的N+1端口。 <br />由于PORT模式仅仅是发送端口给服务器，由服务器连回客户端，如果客户端有防火墙，这样的连接会被认为是外部主机试图连接内</p>
<p>部的主机， 通常情况下是不允许的。 <br />为了解决这个问题， 引入了PASV模式 </p>
<p>PASV模式下的FTP服务： <br />当进行连接时,客户端使用一个随机的端口N（N大于1024) <br />连接服务器的控制端口21， 并向服务器发送命令 PASV，服务器使用一个随机的数据端口M(M&gt;1024)并发回客户端, 客户端用数据端</p>
<p>口N+1连接服务器的端口M。 <br />由于客户端发起数据连接， 这样就解决了防火墙带来的问题。 </p>
<p><br />FTP状态代码说明 </p>
<p>110 Restart marker reply. In this case, the text is exact and not left to the particular implementation; it must </p>
<p>read: MARK yyyy = mmmm where yyyy is User-process data stream marker, and mmmm server's equivalent marker (note the </p>
<p>spaces between markers and "=". <br />重新启动标志回应。这种情况下，信息是精确的并且不用特别的处理；可以这样看：标记 yyyy = mmm 中 yyyy是 用户进程数据流</p>
<p>标记，mmmm是服务器端相应的标记（注意在标记和等号间的空格） </p>
<p>120 Service ready in nnn minutes. <br />服务在NNN时间内可用 </p>
<p>125 Data connection already open; transfer starting. <br />数据连接已经打开，开始传送数据. </p>
<p>150 File status okay; about to open data connection. <br />文件状态正确，正在打开数据连接. </p>
<p>200 Command okay. <br />命令执行正常结束. </p>
<p>202 Command not implemented, superfluous at this site. <br />命令未被执行，此站点不支持此命令. </p>
<p>211 System status, or system help reply. <br />系统状态或系统帮助信息回应. </p>
<p>212 Directory status. <br />目录状态信息. </p>
<p>213 File status. <br />文件状态信息. </p>
<p>214 Help message.On how to use the server or the meaning of a particular non-standard command. This reply is useful </p>
<p>only to the human user. <br />帮助信息。关于如何使用本服务器或特殊的非标准命令。此回复只对人有用。 </p>
<p>215 NAME system type. Where NAME is an official system name from the list in the Assigned Numbers document. <br />NAME系统类型。 </p>
<p>220 Service ready for new user. <br />新连接的用户的服务已就绪 </p>
<p>221 Service closing control connection. <br />控制连接关闭 </p>
<p>225 Data connection open; no transfer in progress. <br />数据连接已打开，没有进行中的数据传送 </p>
<p>226 Closing data connection. Requested file action successful (for example, file transfer or file abort). <br />正在关闭数据连接。请求文件动作成功结束（例如，文件传送或终止） </p>
<p>227 Entering Passive Mode (h1,h2,h3,h4,p1,p2). <br />进入被动模式 </p>
<p>230 User logged in, proceed. Logged out if appropriate. <br />用户已登入。 如果不需要可以登出。 </p>
<p>250 Requested file action okay, completed. <br />被请求文件操作成功完成 </p>
<p>257 "PATHNAME" created. <br />路径已建立 </p>
<p>331 User name okay, need password. <br />用户名存在，需要输入密码 </p>
<p>332 Need account for login. <br />需要登陆的账户 </p>
<p>350 Requested file action pending further information <br />对被请求文件的操作需要进一步更多的信息 </p>
<p>421 Service not available, closing control connection.This may be a reply to any command if the service knows it </p>
<p>must shut down. <br />服务不可用，控制连接关闭。这可能是对任何命令的回应，如果服务认为它必须关闭 </p>
<p>425 Can't open data connection. <br />打开数据连接失败 </p>
<p>426 Connection closed; transfer aborted. <br />连接关闭，传送中止。 </p>
<p>450 Requested file action not taken. <br />对被请求文件的操作未被执行 </p>
<p>451 Requested action aborted. Local error in processing. <br />请求的操作中止。处理中发生本地错误。 </p>
<p>452 Requested action not taken. Insufficient storage space in system.File unavailable (e.g., file busy). <br />请求的操作没有被执行。 系统存储空间不足。 文件不可用 </p>
<p>500 Syntax error, command unrecognized. This may include errors such as command line too long. <br />语法错误，不可识别的命令。 这可能是命令行过长。 </p>
<p>501 Syntax error in parameters or arguments. <br />参数错误导致的语法错误 </p>
<p>502 Command not implemented. <br />命令未被执行 </p>
<p>503 Bad sequence of commands. <br />命令的次序错误。 </p>
<p>504 Command not implemented for that parameter. <br />由于参数错误，命令未被执行 </p>
<p>530 Not logged in. <br />没有登录 </p>
<p>532 Need account for storing files. <br />存储文件需要账户信息 </p>
<p>550 Requested action not taken. File unavailable (e.g., file not found, no access). <br />请求操作未被执行，文件不可用。 </p>
<p>551 Requested action aborted. Page type unknown. <br />请求操作中止，页面类型未知 </p>
<p>552 Requested file action aborted. Exceeded storage allocation (for current directory or dataset). <br />对请求文件的操作中止。 超出存储分配 </p>
<p>553 Requested action not taken. File name not allowed <br />请求操作未被执行。 文件名不允许 </p>
<p>这种错误跟http协议类似，大致是： <br />2开头－－成功 <br />3开头－－权限问题 <br />4开头－－文件问题 <br />5开头－－服务器问题 </p>
<p><br />FTP中的两种工作方式</p>
<p>下面的文章介绍了FTP的两种模式和在实际工作中的一些注意事项和使用技巧，希望对大家有所帮助，并和大家一起来探讨、交流。<br />FTP是一种文件传输协议，它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动</p>
<p>方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP server。Passive模式FTP的客户端发送 PASV命令到 FTP Server。<br />下面介绍一个这两种方式的工作原理:<br />Standard模式FTP 客户端首先和FTP Server的TCP 21端口建立连接，通过这个通道发送命令，客户端需要接收数据的时候在这个通</p>
<p>道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候，服务器端通过自己的TCP 20端口发送数据。 </p>
<p>FTP server必须和客户端建立一个新的连接用来传送数据。<br />Passive模式在建立控制通道的时候和Standard模式类似，当客户端通过这个通道发送PASV 命令的时候，FTP server打开一个位于</p>
<p>1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求，然后FTP server 将通过这个端口进行数据的传送，这个</p>
<p>时候FTP server不再需要建立一个新的和客户端之间的连接。 <br />现在的FTP软件里面包括在IE5以上的版本里面也已经支持这两种模式了。一般一些FTP客户端的软件就比较好设置了，一般都有一个</p>
<p>PASV的选项，比如CuteFTP，传输的方式都有Standard和PASV的选项，可以自己进行选择；另外在IE里面如果要设置成PASV模式的话</p>
<p>可以选中工具－Internet选项－高级－为FTP站点启用文件夹视图，否则就采用Standard模式。<br />很多防火墙在设置的时候都是不允许接受外部发起的连接的，所以FTP的Standard模式在许多时候在内部网络的机器通过防火墙出去</p>
<p>的时候受到了限制，因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接，造成无法工作。当然也可以设置成功，首</p>
<p>先要创建一条规则就是允许内部的IP连接外部的IP的21端口；第二条就是禁止外部IP的TCP 20端口连接内部IP的&lt;1024的端口，这条</p>
<p>是为了防止外部连接内部的常规端口；第三条验证ACK是否等于1，这个的原理就参见TCP建立连接的三次握手吧。所以如果安全的配</p>
<p>置的话非常困难，这个时候就想起来了PASV模式，因为不用建立新的连接，所以也就不会涉及到后面的问题了。但是管理员可能不</p>
<p>想使用PASV模式，因为这个时候FTP Server会开放一个随机的高端口，尽管在IIS4和IIS5里面端口的范围是1024－5000，但是许多</p>
<p>FTP Server的端口范围达到了1024－65535，这个时候在这个主动开放的随机端口上是有完全的访问权限的，如果IIS也要设置成开</p>
<p>放的端口为1024－65535，具体方法如下：<br />1. regedt32<br />2. 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters <br />3. 编辑－添加－数值<br />value Name: MaxUserPort Data Type: REG_DWORD value: 65534 <br />所以如果遇到了有防火墙的话或者怕配置麻烦的话还是采用PASV模式比较好些，但是如果真的对安全的需求很高的话建议采用</p>
<p>Standard模式。</p>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/188317#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Apr 2008 10:45:27 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/188317</link>
        <guid>http://jatula.javaeye.com/blog/188317</guid>
      </item>
      <item>
        <title>30款最受欢迎photoshop滤镜下载</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/188315" style="color:red;">http://jatula.javaeye.com/blog/188315</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1---------------------------------------------------------</p>
<p>推荐人：图钉<br />推荐滤镜：Digital Film Tools 55mm v7.0<br />推荐理由：从6.0升级到7.0，新增了一些摄友所关注的新功能<br />滤镜介绍：Digital FilmTools 55mm是一套面向Avid Xpress的一款数字特效插件，是一套非常独特的出自于数字胶片工具的插件包，它不但出色地模仿了流行的照相机滤光镜、专业镜头、光学试验过程、胶片的颗粒、颜色修正等效果，还模仿了自然光和摄影特效,所有的这些都可以在8或16位通道中进行加工处理。这套插件包括：烟雾、去焦、扩散、双色调、模糊、红外滤光镜、薄雾等30多种特效。 <br />55mm是数码照片工具中的一套独特的滤光工具，可以模拟一般的光学照相机的滤光片、专业透镜、光学实验室中的处理、颜色更正等，使照片就象在自然光下或者是加入特效。<br />滤镜网站：<a href="http://www.digitalfilmtools.com/55mm/">http://www.digitalfilmtools.com/55mm/</a></p>
<p>2----------------------------------------------------------</p>
<p>推荐人：honghu <br />推荐滤镜：Neat image 5.6 pro <br />推荐理由：玩photoshop的人都知道数码照片的噪点问题，Neat image出色的去噪能力是众所周知的，而且用于人像磨皮效果显著。<br />滤镜介绍： Neat Image 是一款功能强大的专业图片降噪软件，适合处理 1600&times;1200以下的图像，非常适合处理曝光不足而产生大量噪波的数码照片，尽可能地减小外界对相片的干扰。Neat Image的使用很简单，界面简洁易懂。降噪过程主要分四个步骤：打开输入图像、分析图像噪点、设置降噪参数、输出图像。输出图像可以保存为 TIF、JPEG或者 BMP 格式。<br />官方Demo下载：<a href="http://www.neatimage.net/files/NeatSetup.exe">http://www.neatimage.net/files/NeatSetup.exe</a><br />滤镜网站：<a href="http://www.neatimage.com/">http://www.neatimage.com/</a></p>
<p>3-----------------------------------------------------------</p>
<p>推荐人：橘子<br />推荐滤镜：Adobe Camera Raw 4.0 <br />推荐理由：从3.6升级到4.0，新增了很多新功能，可以说比以前有了比较大的跃进<br />滤镜介绍：Adobe Camera Raw作为通用型RAW处理引擎是平面软件老大Photoshop的免费配置的插件，并且Adobe公司经常根据新发布的相机来更新版本，是众多形色主义会员的首选，从3.6升级到4.0，新增了很多新功能，可以说比以前有了比较大的跃进</p>
<p>对Raw格式的巨大改进，在Raw格式的处理中添加了类似shadow、highlight（暗部与高光），不过高光在英文测试版中叫做recovery了，目的在于恢复高光部分的细节。同时增加了Vibrance滑块，用于增加饱和度，提升不够饱和度的图片。Lightroom中一些功能也增加到了photoshop.</p>
<p>Adobe&nbsp; Bridge cs3、Adobe Photoshop cs3、Adobe Camera Raw 4.0成了完美组合，是注重品质的摄友们处理RAW不可缺少的利剑。</p>
<p>4-----------------------------------------------------------</p>
<p>推荐人：crazygoogle <br />推荐滤镜：DEPTH OF FIELD GENERATOR PRO v3.0 <br />推荐理由:这是我今年才接触的一款景深处理滤镜，也是我用过的最好的景深处理滤镜。作者是一个CG高手，我想这可能也是该滤镜出色的一个原因。<br />滤镜介绍：本滤镜由RichardRosenman和MartinVicanek共同合作开发。DEPTH OF FIELD GENERATOR PRO v3.0 通过 Z-Depth 通道信息来制作精确的景深效果，提供了光圈形状、大小、方向、曲线、缩减边缘、景深贴图编辑生成、高亮增益等多种控制功能。 <br />特点：<br />模拟现实中的复杂景深的镜头效果<br />支持更多文件格式：.bmp, .gif, .jpg, .jpeg, .png, .tif, .tiff, .tga<br />不同的景深地图模式<br />强大的焦点点调整和查看工具<br />众多的景深地图编辑工具<br />高光调整工具<br />完全支持关键帧<br />真实世界中的球状色差<br />自定义的光圈贴图<br />水滴渲染引擎、可变噪点<br />先进的物理更正输出<br />等等。。。<br />滤镜网站：<a href="http://www.dofpro.com/">http://www.dofpro.com/</a><br />滤镜试用版下载：<a href="http://www.dofpro.com/software/dofpro30.zip">http://www.dofpro.com/software/dofpro30.zip</a></p>
<p>5-----------------------------------------------------------</p>
<p>推荐人：小如<br />推荐滤镜：Element Aurora 2.10 <br />推荐理由：Element Aurora 2.10是Digital公司出品的很棒的加背影滤镜,可以加天空、云、太阳、月亮、各种水面，加夜间灯光，星星等等.<br />滤镜介绍：Digital公司出品的加背影滤镜,可以加天空、云、太阳、月亮、各种水面，加夜间灯光，星星，而且各种参数都可调.并附有大量预设，可以模擬不同的自然景物，例如風雨、太陽、水面等等，而且很有立體感<br />滤镜主页：<a href="http://www.digi-element.com/aurora/index.htm">http://www.digi-element.com/aurora/index.htm</a><br />滤镜下载：<a href="http://www.digi-element.com/aurora/downloads.htm">http://www.digi-element.com/aurora/downloads.htm</a></p>
<p>6-----------------------------------------------------------</p>
<p>推荐人：阳光 <br />推荐滤镜：PixelCreation <br />推荐理由：能给你的照片加上很真实的云层及星空，效果很炫目<br />滤镜介绍：PixelCreation使用过的人都知道，PixelCreation做出效果很真实的云层效果，能模仿在各种天气下天空所产生的云层，使你的照片不在为了整体平淡而花经理去换背景，我最喜欢的就是它能作出很炫目的璀璨星空，使夜色不在单调，让你的照片更加炫目出彩<br />滤镜主页：<a href="http://www.twistingpixels.com/si">http://www.twistingpixels.com/si</a> ... _pixelcreation.html<br />Demo下载：<a href="http://www.twistingpixels.com/site_flash/download.html">http://www.twistingpixels.com/site_flash/download.html</a></p>
<p>7-----------------------------------------------------------</p>
<p>推荐人：午夜梦魇 <br />推荐滤镜：alien skin xenofex <br />推荐理由:Xenofex是Alien Skin Softwave公司的另一个精品滤镜，它延续了Alien Skin Softwave设计的一贯风格，操作简单、效果精彩，是图形图像设计的又一个好助手<br />滤镜介绍：Baked Earth（干裂效果），它能制作出干裂的土地效果。Constellation（星群效果），它能产生群星灿烂的效果。Crumple（褶皱效果），它能产生十分逼真的褶皱效果。Flag（旗子效果），它能制作出各种各样迎风飘舞的旗子和飘带效果。Distress（撕裂效果），能制作出一些自然剥落或撕裂文字的效果。Lightning（闪电效果），能产生无数变化的闪电效果。Little fluffy clouds（云朵效果），能生成各种云朵效果。Origami（毛玻璃效果），能生成一种毛玻璃看东西的效果。Rounded rectangle（圆角矩形效果），能产生各种不同形状的边框效果。Shatter（碎片效果），能生成一种镜子被打碎的效果。Puzzle（拼图效果），能生成一种拼图的效果。Shower door（雨景效果），能生成雨中看物体的效果。Stain（污点效果），能为图片增加污点效果。Television（电视效果），能生成一种老式电视的效果。Electrify（充电效果），能产生一种充电的效果。STMPER（压模效果）<br />滤镜下载：<a href="http://www.skycx.com/soft/download.asp?softid=159&amp;down=0">http://www.skycx.com/soft/download.asp?softid=159&amp;down=0</a></p>
<p>8---------------------------------------------------------</p>
<p>推荐人：ragingyears<br />推荐滤镜：alien skin exposure. v1.0.for.adobe.photoshop <br />推荐理由：多种胶片效果的模仿，如Fuji Velvia，Kodachrome等，看到很多人喜欢电影胶片色调，大家不妨试试在这个软件提供的效果之上进行通道调色，相信会有惊喜！<br />滤镜介绍：为数码照片提供胶片的曝光，还包括模仿胶片的颗粒感，并且可以控制胶片颗粒的分布。特色功能还有，冷暖色调调整、胶片负冲效果、柔光镜效果、锐化、对比度、黑白效果等，其中褪色留红效果是近来十分流行的低饱和类色调中最常见的一种。<br />滤镜主页：<a href="http://www.alienskin.com/exposure/index.htmlDemo">http://www.alienskin.com/exposure/index.htmlDemo</a><br />滤镜下载：<a href="http://www.swcool.com/web/Down/Photoshop/20060603/20,251,0.html">http://www.swcool.com/web/Down/Photoshop/20060603/20,251,0.html</a></p>
<p>9--------------------------------------------------------</p>
<p>推荐人：ilovememe<br />推荐滤镜：Mask Pro 4 Ver4.0.0.0 <br />推荐理由：有了Mask Pro 4 抠图这项工作从枯燥、单调变得轻松并容易<br />滤镜介绍：软件安装后在安装目录中有使用教程，Mask Pro 4.0 User Guide.pdf<br />&nbsp;&nbsp;&nbsp; Mask Pro 4中包含了几个新功能其中一个是对Wacom写画板压力敏感性的支持。在Wacom写画板上操作时不同的压力将得到不同硬度的边缘遮罩。在Mask Pro中使用Wacom制作遮罩从此变得十分容易！<br />滤镜主页：<a href="http://www.ononesoftware.com/detail.php?prodLine_id=4">http://www.ononesoftware.com/detail.php?prodLine_id=4</a><br />Demo下载：<a href="http://www.ononesoftware.com/dow">http://www.ononesoftware.com/dow</a> ... _id=7&amp;type=demo</p>
<p>10--------------------------------------------------------</p>
<p>推荐人：米虫<br />推荐滤镜：Picturecode Noise Ninja v2.1.3 <br />推荐理由：最好的降噪滤镜，功能强大，效果显著，我去年也是推这个的2.1.2版本，今年更新了<br />滤镜介绍：PictureCode的Noise Ninja，是一款专门针对数码图像减噪问题的专利技术软件。由于使用了高精度浮点计算和高位深的图像贮存技术，减噪效果显著，非常方便快捷的提高图像质量。可以说Noise Ninja是当前消噪软件中的佼佼者，其效果之明显，受到全球数千的专业摄影师和评测者的青睐。<br />官方网站：<a href="http://www.picturecode.com/">http://www.picturecode.com/</a><br />Demo下载：<a href="http://www.picturecode.com/download.htm">http://www.picturecode.com/download.htm</a></p>
<p>11-------------------------------------------------------</p>
<p>推荐人：PurpleOpium <br />推荐滤镜 ：3D Deep Paiter <br />推荐理由：玩转3D和平面的Deep Painter!<br />滤镜介绍：对于像mental ray这样的专业渲染插件。。。智商不够，望ray兴叹！对于类似于scene builder一类的简单插件。。。只恨效果不够。<br />没关系，有了deep paiter之后，三维平面从此不分家！既可以作为独立的渲染软件运行，也可以直接拿来做ps的插件。在ps里上色，在ps里直接继续做效果。<br />不玩三维的也别走啊！deep paiter另一个用处是拿来修改图片的性质。。。瞬间把你的照片改成油画，丙烯画，水粉画。。。操作简单界面友好~~~不用就错过拉~~~~<br />滤镜地址：htto://www.rightthemisphere.com<br />Demo下载:http://d12.mydown.com/200201/11836dpdemo10c.exe<br />版本1.0c<br />鸦片的个人感觉之水管：Image Spray的功能和paiter中的水管功能很像，以事先建立好的图片来作画，有一棵草就能长出整片草原！娃哈哈哈~~~兼容中文的哦！</p>
<p>12---------------------------------------------------------</p>
<p>推荐人：小龙制作 <br />推荐滤镜：Alien Skin Snap Art 1.0 <br />推荐理由：提供Photoshop使用的插件，<br />滤镜介绍：它可以透过单一步骤制作自然漂亮的媒体艺术品，提供在真正世界艺术风格的无限影像，包含油画、素描、硬笔、漫画等等。<br />滤镜主页：<a href="http://www.alienskin.com/">http://www.alienskin.com</a><br />Demo下载：<a href="http://www.alienskin.com/snapart/index.html">http://www.alienskin.com/snapart/index.html</a></p>
<p>13----------------------------------------------------------</p>
<p>推荐人：fflow <br />推荐滤镜：Altostorm.Rectilinear.Panorama.Pro.v1.2.1 <br />推荐理由：几乎是最好的几何失真后期校正滤镜<br />滤镜介绍：特别适合日下流行的全景拼接片或者超广角，效果就是最好的推荐理由！<br />滤镜主页：<a href="http://www.altostorm.com/">http://www.altostorm.com</a><br />Demo下载：<a href="http://www.altostorm.com/downloa">http://www.altostorm.com/downloa</a> ... ar_Panorama_Pro.exe</p>
<p>14------------------------------------------------------------</p>
<p>推荐人：笑拽<br />推荐滤镜：colorwasher <br />推荐理由：最准确的白平衡和色温校正软件，一流的调色软件。<br />滤镜介绍：<a href="http://www.swcool.com/bbs/viewth">http://www.swcool.com/bbs/viewth</a> ... &amp;extra=page%3D4<br />滤镜主页：<a href="http://thepluginsite.com/products/photowiz/colorwasher/">http://thepluginsite.com/products/photowiz/colorwasher/</a></p>
<p>15--------------------------------------------------------------</p>
<p>推荐人：wood <br />推荐滤镜：Extensis PhotoFrame pro v3.0 <br />推荐理由：自由度很高的边框滤镜<br />滤镜介绍：PhotoFrame对于照片的编修来说是个不错且实用的工具，可以将原本平平无奇的照片改头换面一番，不再是死板板的千篇一律。PhotoFrame就如同它的名字一般是专门用来为您的照片修边的，您可以哂肞hotoFrame中内建的一些边框效果来做出照片的特效，甚至您觉得不够的话还可以透过多个边框合成或者是自制的方式来实现您的创意喔!<br />◎透过对话窗的方式建立起您自己的照片边框效果<br />在PhotoFrame之中主要使采用对话窗的方式来建立边框效果的，您可以随意的将您所喜爱的边框加入，若您觉得不甚满意的话还可以将两个以上的边框重迭，这样也别有一番风味，另外PhotoFrame也不限制您的边框一定要是规规矩矩的长方形，您可以将您所选择的边框做旋转的动作，或者是将边框加以放大缩小，使您的图片看起来更具有变化性。<br />◎多种边框供您选择<br />在PhotoFrame之中已经有提供不少的边框供您使用，但是如果您觉得还是不够的话，在网络上还有提供更多的边框选择供您下载使用，不过，当然您要先注册为合法的PhotoFrame用户才能享有此权力。<br />◎特殊的边框效果<br />在PhotoFrame之中还有内建一些特殊的效果可以供您使用如阴影、光晕、立体化、贴图、柔焦、以及穿透等等，让您的边框特效可以更上一层楼。<br />想要让您的自制照片与众不同吗？PhotoFrame这个外挂滤镜是不错的选择!!!<br />滤镜主页：<a href="http://www.alienskin.com/">http://www.alienskin.com/</a><br />Demo下载：<a href="http://www.alienskin.com/">http://www.alienskin.com/</a></p>
<p>16-----------------------------------------------------</p>
<p>推荐人：阳光<br />推荐滤镜：Redfield Sketch Master v2.01 for Adobe Photoshop 素描大师 <br />推荐理由：Sketch Master 是一款 Adobe PhotoShop 的插件－素描大师，能将照片进行处理、制作为现实主义风格的手绘作品。<br />滤镜介绍：素描大师，能将照片进行处理、制作为现实主义风格的手绘作品。可模拟铅笔、墨水笔、彩色粉笔、炭笔和喷雾器等工具。<br />滤镜下载：<a href="http://www.swcool.com/bbs/viewth">http://www.swcool.com/bbs/viewth</a> ... ght=Sketch%2BMaster</p>
<p>17---------------------------------------------------------------------</p>
<p>推荐人：断风 <br />推荐滤镜：AlienSkin Eye Candy 5: Impact<br />推荐理由：字体效果最漂亮的滤镜之一<br />滤镜介绍：为一个带有10个滤镜并支持Adobe Photoshop和其它兼容主体软件的插件包，包括了合金、导角、玻璃按钮、透视图阴影等效果。这些滤镜是在Eye Candy 4000的基楚上，增加了3个新的滤镜，重写了7个滤镜而完成的，帮助那些图形设计、数字图像处理和网页内容创建者完成美妙的特效。<br />官方网站：<a href="http://www.alienskin.com/">http://www.alienskin.com/</a><br />Demo下载：<a href="http://www.alienskin.com/downloads/getmail1.asp">http://www.alienskin.com/downloads/getmail1.asp</a></p>
<p><br />18--------------------------------------------------------------</p>
<p>推荐人：米虫<br />推荐滤镜：Alien Skin Blow Up v1.0 <br />推荐理由：不错的无损放大插件<br />滤镜介绍：可以将图像放大1600%甚至3600%倍，而不会造成明显痕迹的photoshop插件，非常适合于影像格式印刷和大型户外广告等等使用。<br />滤镜主页：<a href="http://www.alienskin.com/">http://www.alienskin.com/</a><br />Demo下载：<a href="http://www.alienskin.com/downloads/">http://www.alienskin.com/downloads/</a></p>
<p>19----------------------------------------------------------------</p>
<p>推荐人：米虫 <br />推荐滤镜：AutoFX Mystical Tint Tone and Color 1.02 <br />推荐理由：经典的极品滤镜-梦工厂，擅长影调和色调，是摄影作品的硬性指标之一，虽然不是今年的新滤镜，但它对摄友的影响绝不会停止<br />滤镜介绍：数码照片艺术化处理的强大插件，看名字----神秘的渲染影调和色彩，这么牛的名字不是谁都敢乱用的。内置了38种渲染影调和色彩的艺术特效，每种都提供多种工具和参数任你随意控制的，任意造梦。<br />插件主页：<a href="http://www.autofx.com/">http://www.autofx.com</a><br />Demo下载：<a href="http://www.autofx.com/demo_center.asp">http://www.autofx.com/demo_center.asp</a></p>
<p>20------------------------------------------------------------------</p>
<p>推荐人：earyhua <br />推荐滤镜:KnockOut 2.0 <br />推荐理由：Corel公司出品的经典抠图工具Knockout，目前最新版本为2.0。Knockout 2.0一经推出，便备受好评，<br />滤镜介绍：因为它解决了令人头疼的抠图难题，使枯燥乏味的抠图变为轻松简单的过程。Knockout 2.0不但能够满足常见的抠图需要，而且还可以对烟雾、阴影和凌乱的毛发进行精细抠图，就算是透明的物体也可以轻松抠出。即便你是Photoshop新手，也能够轻松抠出复杂的图形，而且轮廓自然、准确，完全可以满足你的需要。<br />滤镜主页：<a href="http://www.corelsc.com/">http://www.corelsc.com</a> <br />Demo下载：<a href="http://www.xydi.com/Soft/plan/200412/5.html">http://www.xydi.com/Soft/plan/200412/5.html</a></p>
<p><br />21-------------------------------------------------------------------</p>
<p>推荐人：beyondvd <br />推荐滤镜：AutoFX Mystical Lighting v1.0 <br />推荐理由：Mystical Lighting 能够令你对图象应用极为真实的光线和投射阴影效果。利用这个软件，你能提高图片在光影这两方面的品质并达到美化的效果。Mystical Lighting 包含了16种视觉效果，超过400种预设来满足你的需要，只要利用得当，就可以产生无穷多样的效果。<br />滤镜介绍：Mystical Lighting 还拥有很多极强的优点，例如图层，无限的撤销设置，多样的视觉预设，蒙版设置，精悍的特效设置，种种的这些，都令你能探索和生成非常有趣的特效，并能轻松地得到类似工作室般的高质。<br />官方网址：<a href="http://www.autofx.com/">http://www.autofx.com</a><br />Demo下载：<a href="http://www.autofx.com/demos/Mystical/Mystical_Demo_Setup.exe">http://www.autofx.com/demos/Mystical/Mystical_Demo_Setup.exe</a></p>
<p><br />22---------------------------------------------------------------------</p>
<p>推荐人：meilun<br />推荐滤镜:Flood-100(水滤镜) <br />推荐理由：它的倒影效果令人叫绝<br />滤镜介绍：Flood-100，一个做水平线及水面波纹的绝佳滤镜。特别是它的倒影效果令人叫绝。<br />滤镜主页：<a href="http://www.flamingpear.com/">http://www.flamingpear.com/</a><br />Demo下载：<a href="http://www.flamingpear.com/download.html">http://www.flamingpear.com/download.html</a></p>
<p>23-----------------------------------------------------------------------</p>
<p>推荐人：swcool <br />推荐滤镜：Bibble Labs Bibble v4.95 插件版 <br />推荐理由：Bibble Labs Bibble v4.95 可以独立使用，也可以作为PS的插件使用，作为插件使用可以调整后直接转入PS处理。<br />滤镜介绍：RAW(将数码相机内部没有进行任何处理的图像数据、即CCD等摄影元件直接得到的电信号进行数字化处理）格式转换和图像处理流程软件。能快速和容易地转换、处理、输出高质量的单反数码相机照片。特点：修正效果立即可见的live功能；编辑保持功能能自动保存你的设置；用户可配置的工具栏；用户可配置的视图；整合强大的缩略图浏览功能；批处理、打印、用户自定义热键；高级重命名功能；photoshop插件；支持多线程处理等。新版支持了以下型号的数码相机：Nikon D200，Olympus Evolt E-500, SP310, SP350 &amp; SP500UZ Pentax *ist DS2 Sony DSC-R1 。</p>
<p>Bibble pro&nbsp; 是由著名的数码影像处理软件公司Bibble Labs 推出的一款功能强大的RAW格式文件转换软件，该图形软件主要是专门处理数码相机的原始文件，也就是我们所说的RAW文件，<br />滤镜主页：<a href="http://bibblelabs.com/products/bibble/bibble4.html">http://bibblelabs.com/products/bibble/bibble4.html</a><br />Demo下载：<a href="http://bibblelabs.com/products/bibble/bibble4.html">http://bibblelabs.com/products/bibble/bibble4.html</a></p>
<p>24------------------------------------------------------------------------</p>
<p>推荐人：断风<br />推荐滤镜：Flaming Pear solarCell v1.53 <br />推荐理由：恒星是重要的素材，精细的表面不容易手工制作，有滤镜的帮助将大大减轻工作强度<br />滤镜介绍：著名的Flaming Pear出品的制作太阳和恒星的特效插件，你可以通过控制太阳外貌的每一个部分来设计你自己的太阳，或滚动骰子产生来随机的效果。从稳重的白矮星到红色的超新星，你可以设计你自己的恒星天象。你可以控制日冤的摇曵、刺状的衍射、太阳表面的细节、日晕及彩虹般的效果，SolarCell可以让你制作出色彩艳丽及更加真实的恒星。<br />官方网站：<a href="http://www.flamingpear.com/solarcell.html">http://www.flamingpear.com/solarcell.html</a></p>
<p>25---------------------------------------------------------------------</p>
<p>推荐人：xiaoyaphoto <br />推荐滤镜：Kodak Eastman Digital Gem AirBrush Pro for Photoshop <br />推荐理由：Kodak Eastman Digital Gem AirBrush Pro for Photoshop是我目前还在使用的一款滤镜，<br />滤镜介绍：操作简单．兼容性强，配合Photoshop基本可以满足大多数的需要了<br />Demo下载：<a href="http://www.jz5u.com/Codelist/Catalog173/4530.html">http://www.jz5u.com/Codelist/Catalog173/4530.html</a></p>
<p>26--------------------------------------------------------------------</p>
<p>推荐人：alluphy<br />推荐滤镜：Imagenomic noiseware professional plug-in v4.0.1 build 4110<br />推荐理由：极负盛名的降噪工具，PS插件版，在PS CS2测试通过，集成动作脚本。noiseware虽然没有profile可供下载，但是其特色是自学习功能，开始需要自己手动调整，在调整的过程中会根据exif信息来学习，最终自动生成用户自己的profile，调整的片子多了以后，再打开新的片子，会根据exif从学习的结果里面搜索，自动匹配最佳的效果，从这个角度来说，noiseware的profile更能体现使用者的个性，而noiseninja则是千篇一律的profile。<br />另外noiseware的一大特色是参数包围功能，就像曝光包围一样，把各种参数上下浮动的效果全部列出来，方便用户选择最佳参数。</p>
<p>滤镜介绍：noiseware用于恢复图片质量，通过消除图像噪点和讨厌的人为因素，如高iso设置或低亮度环境。它提供了许多已经设置好的配置，让你解决大多数普通噪点问题，而不需要进一步的配置；另外，你可以更改配置或指定你自己的自定义的配置或使用自学习功能自动创建噪点配置文件。noiseware支持批量处理。用来磨皮超爽初次使用的体会，有不当之处，请勿见怪：1、noiseware比neatimage处理细节更完善；2、降噪之后图片更清晰；3、处理速度比neatimage快一倍以上；4、操作比neatimage更方便，软件更智能，作为初学者和懒人来说，不必像neatimage那样要做画框选取什么的，直接可以像使用锐化滤镜一样，一步到位<br />滤镜主页：<a href="http://www.imagenomic.com/">http://www.imagenomic.com/</a></p>
<p>Demo下载：<a href="http://www.imagenomic.com/setup/">http://www.imagenomic.com/setup/</a> ... PluginSetup4110.exe</p>
<p>27-------------------------------------------------------------------</p>
<p>推荐人：遇snake<br />推荐滤镜 Topaz Vivacity <br />推荐理由：可以很方便的做出卡通的效果<br />滤镜介绍：一个控制锐化和模糊和滤镜，适当的使用可以出现意想不到的效果<br />滤镜主页：<a href="http://www.topazlabs.com/">http://www.topazlabs.com/</a><br />Demo下载：<a href="http://www.topazlabs.com/topazlabs/04download/">http://www.topazlabs.com/topazlabs/04download/</a></p>
<p>28----------------------------------------------------------------<br />推荐人：ninuo99<br />推荐滤镜：DCE Tools for Photoshop Plugin 1.0&nbsp; <br />推荐理由：DCE Tools for Photoshop Plugin是Mediachance公司出的一套photoshop的插件，<br />滤镜介绍：包括CCD噪点修复、人像皮肤修缮（通常所说的人像磨皮）、智能色彩还原、曝光补偿、镜头畸变修正、透视修正，以及全局自动修缮7个插件，全局自动修缮能尽量减少调图过程中细节的丢失<br />滤镜主页：<a href="http://www.mediachance.com/dce/index.html">http://www.mediachance.com/dce/index.html</a><br />Demo下载：<a href="http://www.newhua.com/soft/33894.htm">http://www.newhua.com/soft/33894.htm</a></p>
<p>29----------------------------------------------------------------<br />推荐人：swcool<br />推荐滤镜：nik Sharpener Pro 2.0 <br />推荐理由：图片锐度是摄影后期需要调整的一个重要参数，此滤镜强大的功能出色的效果使得以往头疼的后期锐化成为一种快乐。一句话：各位色友有福了！<br />滤镜介绍：nik Sharpener Pro 2.0 有自己独特的处理锐化的思路。可以在设定图片的高宽、特定的出片介质、以及不同的打印设备等情况下对图片进行锐化；增加的新功能提供了对特定区域进行锐化的选择；可以控制锐化程度；另外可以对raw格式文件进行锐化。所有的这些都可以在8位或者16位通道中进行加工处理。<br />滤镜主页：<a href="http://www.nikmultimedia.com/">http://www.nikmultimedia.com</a><br />滤镜介绍：<a href="http://www.swcool.com/bbs/viewth">http://www.swcool.com/bbs/viewth</a> ... &amp;extra=page%3D1<br />滤镜手册：<a href="http://download.nikmultimedia.co/">http://download.nikmultimedia.co</a> ... P_2.0_UserGuide.pdf<br />Demo下载：<a href="http://www.nikmultimedia.com/dow">http://www.nikmultimedia.com/dow</a> ... hp?get=sharpenerpro</p>
<p>30----------------------------------------------------------------<br />推荐人：图钉<br />推荐滤镜：Sharptype 3.0 <br />推荐理由：定位独特<br />滤镜介绍：专为Photoshop开发的清晰字体滤镜Sharptype，用来解决Photoshop对于矢量字体输出不清晰的弊端。该滤镜使用了一种新的图形引擎，这是设计者专门开发的跨平台图形系统，能够在windows、linux或者其他的操作系统上运行，得到甚至超过苹果机的显示效果。设计者称他为Shadowgraph，中文&ldquo;皮影戏&rdquo;，是一种中国传统的戏曲艺术。该系统将Photoshop的图形处理，Flash的绘图，Mac的人机界面都融入进来，汇集了众多软件和操作系统的优点。<br />作为一款优秀的文字处理工具，Sharptype提供了最清晰的矢量平滑字体输出，支持所有编码方式，多种渲染模式，任意的粗体、斜体。字体的预览和内嵌的字符映射表，还可以搜索除了Windows/Fonts目录外其他目录的字体文件。<br />滤镜主页：<a href="http://www.sharp-type.com/">http://www.sharp-type.com/</a><br />滤镜下载：<a href="http://www.sharp-type.com/download.htm">http://www.sharp-type.com/download.htm</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/188315#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Apr 2008 10:44:28 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/188315</link>
        <guid>http://jatula.javaeye.com/blog/188315</guid>
      </item>
      <item>
        <title>网页弹出窗口代码</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/188314" style="color:red;">http://jatula.javaeye.com/blog/188314</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>【1、最基本的弹出窗口代码】　　</p>
<p>&lt;SCRIPT LANGUAGE="javascript"&gt;　<br />&lt;!-- <br />window.open ("page.html") <br />--&gt;　<br />&lt;/SCRIPT&gt;　<br />因为着是一段javascripts代码，所以它们应该放在&lt;SCRIPT LANGUAGE="javascript"&gt;标签和&lt;/script&gt;之间。&lt;!-- 和 --&gt;是对一些版本低的浏览器起作用，在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。　<br />window.open ("page.html") 用于控制弹出新的窗口page.html，如果page.html不与主窗口在同一路径下，前面应写明路径，绝对路径(http://)和相对路径(../)均可。用单引号和双引号都可以，只是不要混用。　<br />这一段代码可以加入HTML的任意位置，&lt;head&gt;和&lt;/head&gt;之间可以，&lt;body&gt;间&lt;/body&gt;也可以，越前越早执行，尤其是页面代码长，又想使页面早点弹出就尽量往前放。　<br />window.open('http://www.zhanzuo.com','_self','width=500,heigh=500,left=0,top=0,toolbar=1,location=1,directories==1,status=1,menubar=1,scrollbars=1,resizable=1')</p>
<p>【2、经过设置后的弹出窗口】　</p>
<p>下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。　<br />我们来定制这个弹出的窗口的外观，尺寸大小，弹出的位置以适应该页面的具体情况。　<br />&lt;SCRIPT LANGUAGE="javascript"&gt;　<br />&lt;!-- <br />window.open ("page.html", "newwindow", "height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no") <br />//写成一行 <br />--&gt;　<br />&lt;/SCRIPT&gt;　<br />参数解释：　<br />&lt;SCRIPT LANGUAGE="javascript"&gt; js脚本开始；　<br />window.open 弹出新窗口的命令；　<br />"page.html" 弹出窗口的文件名；　<br />"newwindow" 弹出窗口的名字（不是文件名），非必须，可用空""代替；　<br />height=100 窗口高度；　<br />width=400 窗口宽度；　<br />top=0 窗口距离屏幕上方的象素值；　<br />left=0 窗口距离屏幕左侧的象素值；　<br />toolbar=no 是否显示工具栏，yes为显示；　<br />menubar，scrollbars 表示菜单栏和滚动栏。　<br />resizable=no 是否允许改变窗口大小，yes为允许；　<br />location=no 是否显示地址栏，yes为允许；　<br />status=no 是否显示状态栏内的信息（通常是文件已经打开），yes为允许；　<br />&lt;/SCRIPT&gt; js脚本结束　</p>
<p><br />【3、用函数控制弹出窗口】　</p>
<p>下面是一个完整的代码。　<br />&lt;html&gt;　<br />&lt;head&gt;　<br />&lt;script LANGUAGE="JavaScript"&gt;　<br />&lt;!-- <br />function openwin() { window.open ("page.html", "newwindow", "height=100, width=400, toolbar= <br />no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <br />//写成一行 <br />} <br />//--&gt;　<br />&lt;/script&gt;　<br />&lt;/head&gt;　<br />&lt;body onload="openwin()"&gt;　<br />...任意的页面内容...　<br />&lt;/body&gt;　<br />&lt;/html&gt;　<br />这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前<br />没有任何用途。　<br />怎么调用呢？　<br />方法一：&lt;body onload="openwin()"&gt; 浏览器读页面时弹出窗口；　<br />方法二：&lt;body onunload="openwin()"&gt; 浏览器离开页面时弹出窗口；　<br />方法三：用一个连接调用：　<br />&lt;a href="#" onclick="openwin()"&gt;打开一个窗口　<br />注意：使用的&ldquo;#&rdquo;是虚连接。　<br />方法四：用一个按钮调用：　<br />&lt;input type="button" onclick="openwin()" value="打开窗口"&gt;　</p>
<p>【4、同时弹出2个窗口】　</p>
<p>对源代码稍微改动一下：　<br />&lt;script LANGUAGE="JavaScript"&gt;　<br />&lt;!-- <br />function openwin() <br />{ window.open ("page.html", "newwindow", "height=100, width=100, top=0,left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <br />//写成一行 <br />window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <br />//写成一行 <br />} <br />//--&gt;　<br />&lt;/script&gt;　<br />为避免弹出的2个窗口覆盖，用top和left控制一下弹出的位置不要相互覆盖即可。最后用上面说过的四种方法调用即可。　</p>
<p>注意：2个窗口的name(newwindows和newwindow2)不要相同，或者干脆全部为空。OK？　</p>
<p>【5、主窗口打开文件1.htm，同时弹出小窗口page.html】　</p>
<p>如下代码加入主窗口&lt;head&gt;区：　<br />&lt;script language="javascript"&gt;　<br />&lt;!-- <br />function openwin() <br />{window.open("page.html","","width=200,height=200") <br />} <br />//--&gt;　<br />&lt;/script&gt;　<br />加入&lt;body&gt;区：　<br />&lt;a href="/1.htm" onclick="openwin()"&gt;open即可。　</p>
<p>【6、弹出的窗口之定时关闭控制】　</p>
<p>下面我们再对弹出的窗口进行一些控制，效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中，可不是主页面中，否则...)，让它10秒后自动关闭是不是更酷了？　</p>
<p>首先，将如下代码加入page.html文件的&lt;head&gt;区：　<br />&lt;script language="JavaScript"&gt;　<br />function closeit()　<br />{setTimeout("self.close()",10000) //毫秒}　<br />&lt;/script&gt;　<br />然后，再用&lt;body onload="closeit()"&gt; 这一句话代替page.html中原有的&lt;BODY&gt;这一句就可以了。(这一句话千万不要忘记写啊！这一句的作用是调用关闭窗口的代码，10秒钟后就自行关闭该窗口。)　</p>
<p>【7、在弹出窗口中加上一个关闭按钮】　</p>
<p>&lt;FORM&gt;　<br />&lt;INPUT TYPE="BUTTON" VALUE="关闭" onClick="window.close()"&gt;　<br />&lt;/FORM&gt;　<br />呵呵，现在更加完美了！　</p>
<p>【8、内包含的弹出窗口-一个页面两个窗口】　</p>
<p>上面的例子都包含两个窗口，一个是主窗口，另一个是弹出的小窗口。　</p>
<p>通过下面的例子，你可以在一个页面内完成上面的效果。　<br />&lt;html&gt;　<br />&lt;head&gt;　<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;　<br />function openwin()　<br />{OpenWindow=window.open("", "newwin", "height=250, width=250,<br />toolbar=no,scrollbars=</p>
<p>"+scroll+",menubar=no");　<br />//写成一行　<br />OpenWindow.document.write("&lt;TITLE&gt;例子&lt;/TITLE&gt;")　<br />OpenWindow.document.write("&lt;BODY BGCOLOR=#ffffff&gt;")　<br />OpenWindow.document.write("&lt;h1&gt;Hello!&lt;/h1&gt;")　<br />OpenWindow.document.write("New window opened!") <br />OpenWindow.document.write("&lt;/BODY&gt;")　<br />OpenWindow.document.write("&lt;/HTML&gt;")　<br />OpenWindow.document.close()}　<br />&lt;/SCRIPT&gt;　<br />&lt;/head&gt;　<br />&lt;body&gt;　<br />&lt;a href="#" onclick="openwin()"&gt;打开一个窗口　<br />&lt;input type="button" onclick="openwin()" value="打开窗口"&gt;　<br />&lt;/body&gt;　<br />&lt;/html&gt;　<br />看看 OpenWindow.document.write()里面的代码不就是标准的HTML吗？只要按照格式写更多的行即可。千万注意多一个标签或少一个标签就会出现错误。记得用OpenWindow.document.close()结束啊。　</p>
<p>【9、终极应用--弹出的窗口之Cookie控制】　</p>
<p>回想一下，上面的弹出窗口虽然酷，但是有一点小毛病(沉浸在喜悦之中，一定没有发现吧？)比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页)，那么每次刷新这个页面，窗口都会弹出一次，是不是非常烦人？:-(有解决的办法吗？Yes! ;-) Follow me.　</p>
<p>我们使用cookie来控制一下就可以了。　</p>
<p>首先，将如下代码加入主页面HTML的&lt;HEAD&gt;区：　<br />&lt;script&gt;　<br />function openwin()　<br />{window.open("page.html","","width=200,height=200")}　<br />function get_cookie(Name)　<br />{var search = Name + "="　<br />var returnvalue = "";　<br />if (document.cookie.length &gt; 0) {　<br />offset = document.cookie.indexOf(search)　<br />if (offset != -1) {　<br />offset += search.length　<br />end = document.cookie.indexOf(";", offset);　<br />if (end == -1)　<br />end = document.cookie.length;　<br />returnvalue="/unescape(document.cookie.substring(offset,end))　<br />}　<br />}　<br />return" returnvalue;　<br />}　<br />function loadpopup(){　<br />if (get_cookie("popped")==""){　<br />openwin()　<br />document.cookie="popped=yes"　<br />}　<br />}　<br />&lt;/script&gt;　<br />然后，用&lt;body onload="loadpopup()"&gt;（注意不是openwin而是loadpop啊！）替换主页面中原有的&lt;BODY&gt;这一句即可。你可以试着刷新一下这个页面或重新进入该页面，窗口再也不会弹出了。真正的Pop-Only-Once！　</p>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/188314#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Apr 2008 10:43:00 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/188314</link>
        <guid>http://jatula.javaeye.com/blog/188314</guid>
      </item>
      <item>
        <title>JAVA上加密算法的实现用例</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/188055" style="color:red;">http://jatula.javaeye.com/blog/188055</a>&nbsp;
          发表时间: 2008年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1>JAVA上加密算法的实现用例</h1>
<p id="subtitle">MD5/SHA1，DSA，DESede/DES，Diffie-Hellman的使用</p>
<p>级别： 初级</p>
<p><a href="http://jatula.javaeye.com/admin/blogs/#author"><span style="color: #5c81a7;">王辉</span></a> (<a href="mailto:ddxxkk@21cn.com?subject=JAVA上加密算法的实现用例&amp;cc=ddxxkk@21cn.com"><span style="color: #5c81a7;">ddxxkk@21cn.com</span></a>),</p>
<p>2001 年 7 月 04 日</p>
<blockquote>
<p>通常,使用的加密算法 比较简便高效,密钥简短，加解密速度快，破译极其困难。本文介绍了 MD5/SHA1，DSA，DESede/DES，Diffie-Hellman的使用。</p>
<p><a name="1"><span class="atitle">第1章基础知识</span></a></p>
<p>&nbsp;</p>
<p><a name="N10044"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">1.1. 单钥密码体制</span></strong></span></a></p>
<p>单钥密码体制是一种传统的加密算法，是指信息的发送方和接收方共同使用同一把密钥进行加解密。</p>
<p>通常,使用的加密算法比较简便高效,密钥简短，加解密速度快，破译极其困难。但是加密的安全性依靠密钥保管的安全性,在公开的计算机网络上安全地传送和保管密钥是一个严峻的问题，并且如果在多用户的情况下密钥的保管安全性也是一个问题。</p>
<p>单钥密码体制的代表是美国的DES</p>
<p><a name="N10053"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">1.2. 消息摘要</span></strong></span></a></p>
<p>一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算，产生一个唯一指印（对于SHA1是产生一个20字节的二进制数组）。</p>
<p>消息摘要有两个基本属性：</p>
<ul>
<li>两个不同的报文难以生成相同的摘要 </li>
<li>难以对指定的摘要生成一个报文，而由该报文反推算出该指定的摘要 </li>
</ul>
<p>代表：美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5 </p>
<p><a name="N1006B"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">1.3. Diffie-Hellman密钥一致协议</span></strong></span></a></p>
<p>密钥一致协议是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想。</p>
<p>先决条件,允许两名用户在公开媒体上交换信息以生成"一致"的,可以共享的密钥</p>
<p>代表：指数密钥一致协议(Exponential Key Agreement Protocol)</p>
<p><a name="N1007A"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">1.4. 非对称算法与公钥体系</span></strong></span></a></p>
<p>1976年，Dittie和Hellman为解决密钥管理问题，在他们的奠基性的工作"密码学的新方向"一文中，提出一种密钥交换协议，允许在不安全的媒体上通过通讯双方交换信息，安全地传送秘密密钥。在此新思想的基础上，很快出现了非对称密钥密码体制，即公钥密码体制。在公钥体制中，加密密钥不同于解密密钥，加密密钥公之于众，谁都可以使用；解密密钥只有解密人自己知道。它们分别称为公开密钥（Public key）和秘密密钥（Private key）。</p>
<p>迄今为止的所有公钥密码体系中，RSA系统是最著名、最多使用的一种。RSA公开密钥密码系统是由R.Rivest、A.Shamir和L.Adleman俊教授于1977年提出的。RSA的取名就是来自于这三位发明者的姓的第一个字母</p>
<p><a name="N10086"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">1.5. 数字签名</span></strong></span></a></p>
<p>所谓数字签名就是信息发送者用其私钥对从所传报文中提取出的特征数据（或称数字指纹）进行RSA算法操作，以保证发信人无法抵赖曾发过该信息（即不可抵赖性），同时也确保信息报文在经签名后末被篡改（即完整性）。当信息接收者收到报文后，就可以用发送者的公钥对数字签名进行验证。　</p>
<p>在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数（HASH函数）生成的，对这些HASH函数的特殊要求是：</p>
<ol>
<li>接受的输入报文数据没有长度限制； </li>
<li>对任何输入报文数据生成固定长度的摘要（数字指纹）输出 </li>
<li>从报文能方便地算出摘要； </li>
<li>难以对指定的摘要生成一个报文，而由该报文反推算出该指定的摘要； </li>
<li>两个不同的报文难以生成相同的摘要 </li>
</ol>
<p>代表：DSA</p>
<p><a name="2"><span class="atitle">第2章在JAVA中的实现</span></a></p>
<p>&nbsp;</p>
<p><a name="N100AF"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">2.1. 相关</span></strong></span></a></p>
<p>Diffie-Hellman密钥一致协议和DES程序需要JCE工具库的支持,可以到 <a href="http://java.sun.com/security/index.html"><span style="color: #5c81a7;">http://java.sun.com/security/index.html</span></a> 下载JCE,并进行安装。简易安装把 jce1.2.1\lib 下的所有内容复制到 %java_home%\lib\ext下,如果没有ext目录自行建立,再把jce1_2_1.jar和sunjce_provider.jar添加到CLASSPATH内,更详细说明请看相应用户手册 </p>
<p><a name="N100BC"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">2.2. 消息摘要MD5和SHA的使用</span></strong></span></a></p>
<p>使用方法:</p>
<p>首先用生成一个MessageDigest类,确定计算方法</p>
<p>java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");</p>
<p>添加要进行计算摘要的信息</p>
<p>alga.update(myinfo.getBytes());</p>
<p>计算出摘要</p>
<p>byte[] digesta=alga.digest();</p>
<p>发送给其他人你的信息和摘要</p>
<p>其他人用相同的方法初始化,添加信息,最后进行比较摘要是否相同</p>
<p>algb.isEqual(digesta,algb.digest())</p>
<p>相关AIP</p>
<p>java.security.MessageDigest 类</p>
<p>static getInstance(String algorithm)</p>
<p>返回一个MessageDigest对象,它实现指定的算法</p>
<p>参数:算法名,如 SHA-1 或MD5</p>
<p>void update (byte input)</p>
<p>void update (byte[] input)</p>
<p>void update(byte[] input, int offset, int len)</p>
<p>添加要进行计算摘要的信息</p>
<p>byte[] digest()</p>
<p>完成计算,返回计算得到的摘要(对于MD5是16位,SHA是20位)</p>
<p>void reset()</p>
<p>复位</p>
<p>static boolean isEqual(byte[] digesta, byte[] digestb)</p>
<p>比效两个摘要是否相同</p>
<p>代码：</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">import java.security.*;
public class myDigest {
  public static void main(String[] args)  {
    myDigest my=new myDigest();
    my.testDigest();
  }
  public void testDigest()
  {
   try {
     String myinfo="我的测试信息";
    //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");
      java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
      alga.update(myinfo.getBytes());
      byte[] digesta=alga.digest();
      System.out.println("本信息摘要是:"+byte2hex(digesta));
      //通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
      java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
      algb.update(myinfo.getBytes());
      if (algb.isEqual(digesta,algb.digest())) {
         System.out.println("信息检查正常");
       }
       else
        {
          System.out.println("摘要不相同");
         }
   }
   catch (java.security.NoSuchAlgorithmException ex) {
     System.out.println("非法摘要算法");
   }
  }
  public String byte2hex(byte[] b) //二行制转字符串
    {
     String hs="";
     String stmp="";
     for (int n=0;n&lt;b.length;n++)
      {
       stmp=(java.lang.Integer.toHexString(b[n] &amp; 0XFF));
       if (stmp.length()==1) hs=hs+"0"+stmp;
       else hs=hs+stmp;
       if (n&lt;b.length-1)  hs=hs+":";
      }
     return hs.toUpperCase();
    }
}</pre>
</td>
</tr>
</tbody>
</table>
</p>
<p><a name="N10114"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">2.3. 数字签名DSA</span></strong></span></a></p>
<p><strong></strong></p>
<ol>
<li>对于一个用户来讲首先要生成他的密钥对,并且分别保存
<p>生成一个KeyPairGenerator实例</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">   java.security.KeyPairGenerator  keygen=java.security.KeyPairGenerator.getInstance("DSA");
    如果设定随机产生器就用如相代码初始化
     SecureRandom secrand=new SecureRandom();
     secrand.setSeed("tttt".getBytes()); //初始化随机产生器
     keygen.initialize(512,secrand);     //初始化密钥生成器
    否则
     keygen.initialize(512);
    生成密钥公钥pubkey和私钥prikey
      KeyPair keys=keygen.generateKeyPair(); //生成密钥组
      PublicKey pubkey=keys.getPublic();
      PrivateKey prikey=keys.getPrivate();
    分别保存在myprikey.dat和mypubkey.dat中,以便下次不在生成
    (生成密钥对的时间比较长
     java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat"));
     out.writeObject(prikey);
     out.close();
     out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat"));
     out.writeObject(pubkey);
     out.close();
</pre>
</td>
</tr>
</tbody>
</table>
<br /><br /></li>
<li>用他私人密钥(prikey)对他所确认的信息(info)进行数字签名产生一个签名数组
<p>从文件中读入私人密钥(prikey)</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">   java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));
    PrivateKey myprikey=(PrivateKey)in.readObject();
    in.close();
    初始一个Signature对象,并用私钥对信息签名
     java.security.Signature signet=java.security.Signature.getInstance("DSA");
     signet.initSign(myprikey);
     signet.update(myinfo.getBytes());
     byte[] signed=signet.sign();
    把信息和签名保存在一个文件中(myinfo.dat)
      java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat"));
      out.writeObject(myinfo);
      out.writeObject(signed);
      out.close();
    把他的公钥的信息及签名发给其它用户
</pre>
</td>
</tr>
</tbody>
</table>
<br /><br /></li>
<li>其他用户用他的公共密钥(pubkey)和签名(signed)和信息(info)进行验证是否由他签名的信息
<p>读入公钥 <br /><code>java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat")); <br />PublicKey pubkey=(PublicKey)in.readObject(); <br />in.close(); </code></p>
<p>读入签名和信息 <br /><code>in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat")); <br />String info=(String)in.readObject(); <br />byte[] signed=(byte[])in.readObject(); <br />in.close(); </code></p>
<p>初始一个Signature对象,并用公钥和签名进行验证 <br /><code>java.security.Signature signetcheck=java.security.Signature.getInstance("DSA"); <br />signetcheck.initVerify(pubkey); <br />signetcheck.update(info.getBytes()); <br />if (signetcheck.verify(signed)) { System.out.println("签名正常");} </code></p>
<p>对于密钥的保存本文是用对象流的方式保存和传送的,也可可以用编码的方式保存.注意要 <br /><code>import java.security.spec.* <br />import java.security.* </code></p>
<p>具休说明如下</p>
<ul>
<li>public key是用X.509编码的,例码如下: 
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">  byte[] bobEncodedPubKey=mypublic.getEncoded(); //生成编码
   //传送二进制编码
   //以下代码转换编码为相应key对象
   X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);
   KeyFactory keyFactory = KeyFactory.getInstance("DSA");
   PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);
</pre>
</td>
</tr>
</tbody>
</table>
<br /><br /></li>
<li>对于Private key是用PKCS#8编码,例码如下: 
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode"> byte[] bPKCS=myprikey.getEncoded();
  //传送二进制编码
  //以下代码转换编码为相应key对象
  PKCS8EncodedKeySpec priPKCS8=new PKCS8EncodedKeySpec(bPKCS);
  KeyFactory keyf=KeyFactory.getInstance("DSA");
  PrivateKey otherprikey=keyf.generatePrivate(priPKCS8);
</pre>
</td>
</tr>
</tbody>
</table>
<br /></li>
</ul>
<br /></li>
<li>常用API
<p>java.security.KeyPairGenerator 密钥生成器类 <br />public static KeyPairGenerator getInstance(String algorithm) throws NoSuchAlgorithmException <br />以指定的算法返回一个KeyPairGenerator 对象 <br />参数: algorithm 算法名.如:"DSA","RSA" </p>
<p>public void initialize(int keysize) </p>
<p>以指定的长度初始化KeyPairGenerator对象,如果没有初始化系统以1024长度默认设置 </p>
<p>参数:keysize 算法位长.其范围必须在 512 到 1024 之间，且必须为 64 的倍数</p>
<p>public void initialize(int keysize, SecureRandom random) <br />以指定的长度初始化和随机发生器初始化KeyPairGenerator对象 <br />参数:keysize 算法位长.其范围必须在 512 到 1024 之间，且必须为 64 的倍数 <br />random 一个随机位的来源(对于initialize(int keysize)使用了默认随机器 </p>
<p>public abstract KeyPair generateKeyPair() <br />产生新密钥对 </p>
<p>java.security.KeyPair 密钥对类 <br />public PrivateKey getPrivate() <br />返回私钥 </p>
<p>public PublicKey getPublic() <br />返回公钥 </p>
<p>java.security.Signature 签名类 <br />public static Signature getInstance(String algorithm) throws NoSuchAlgorithmException <br />返回一个指定算法的Signature对象 <br />参数 algorithm 如:"DSA" </p>
<p>public final void initSign(PrivateKey privateKey) <br />throws InvalidKeyException <br />用指定的私钥初始化 <br />参数:privateKey 所进行签名时用的私钥 </p>
<p>public final void update(byte data) <br />throws SignatureException <br />public final void update(byte[] data) <br />throws SignatureException <br />public final void update(byte[] data, int off, int len) <br />throws SignatureException <br />添加要签名的信息 </p>
<p>public final byte[] sign() <br />throws SignatureException <br />返回签名的数组,前提是initSign和update </p>
<p>public final void initVerify(PublicKey publicKey) <br />throws InvalidKeyException <br />用指定的公钥初始化 <br />参数:publicKey 验证时用的公钥 </p>
<p>public final boolean verify(byte[] signature) <br />throws SignatureException <br />验证签名是否有效,前提是已经initVerify初始化 <br />参数: signature 签名数组 </p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode"> */
 import java.security.*;
 import java.security.spec.*;
public class testdsa {
  public static void main(String[] args) throws java.security.NoSuchAlgorithmException,java.lang.Exception {
        testdsa my=new testdsa();
        my.run();
  }
  public void run()
  {
  //数字签名生成密钥
  //第一步生成密钥对,如果已经生成过,本过程就可以跳过,对用户来讲myprikey.dat要保存在本地
  //而mypubkey.dat给发布给其它用户
   if ((new java.io.File("myprikey.dat")).exists()==false) {
       if (generatekey()==false) {
           System.out.println("生成密钥对败");
           return;
          };
        }
//第二步,此用户
//从文件中读入私钥,对一个字符串进行签名后保存在一个文件(myinfo.dat)中
//并且再把myinfo.dat发送出去
//为了方便数字签名也放进了myifno.dat文件中,当然也可分别发送
  try {
  java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));
  PrivateKey myprikey=(PrivateKey)in.readObject();
  in.close();
 // java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509);
 //java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpec
  String myinfo="这是我的信息";    //要签名的信息
  //用私钥对信息生成数字签名
  java.security.Signature signet=java.security.Signature.getInstance("DSA");
  signet.initSign(myprikey);
  signet.update(myinfo.getBytes());
  byte[] signed=signet.sign();  //对信息的数字签名
  System.out.println("signed(签名内容)="+byte2hex(signed));
 //把信息和数字签名保存在一个文件中
  java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat"));
  out.writeObject(myinfo);
  out.writeObject(signed);
  out.close();
  System.out.println("签名并生成文件成功");
  }
  catch (java.lang.Exception e) {
    e.printStackTrace();
    System.out.println("签名并生成文件失败");
  };
  //第三步
  //其他人通过公共方式得到此户的公钥和文件
  //其他人用此户的公钥,对文件进行检查,如果成功说明是此用户发布的信息.
  //
  try {
   java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));
   PublicKey pubkey=(PublicKey)in.readObject();
   in.close();
   System.out.println(pubkey.getFormat());
   in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat"));
   String info=(String)in.readObject();
   byte[] signed=(byte[])in.readObject();
   in.close();
  java.security.Signature signetcheck=java.security.Signature.getInstance("DSA");
  signetcheck.initVerify(pubkey);
  signetcheck.update(info.getBytes());
  if (signetcheck.verify(signed)) {
  System.out.println("info="+info);
   System.out.println("签名正常");
  }
  else  System.out.println("非签名正常");
  }
  catch (java.lang.Exception e) {e.printStackTrace();};
  }
  //生成一对文件myprikey.dat和mypubkey.dat---私钥和公钥,
  //公钥要用户发送(文件,网络等方法)给其它用户,私钥保存在本地
  public boolean generatekey()
  {
    try {
  java.security.KeyPairGenerator  keygen=java.security.KeyPairGenerator.getInstance("DSA");
 // SecureRandom secrand=new SecureRandom();
 // secrand.setSeed("tttt".getBytes()); //初始化随机产生器
 // keygen.initialize(576,secrand);     //初始化密钥生成器
  keygen.initialize(512);
  KeyPair keys=keygen.genKeyPair();
//  KeyPair keys=keygen.generateKeyPair(); //生成密钥组
  PublicKey pubkey=keys.getPublic();
  PrivateKey prikey=keys.getPrivate();
  java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat"));
  out.writeObject(prikey);
  out.close();
  System.out.println("写入对象 prikeys ok");
  out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat"));
   out.writeObject(pubkey);
   out.close();
   System.out.println("写入对象 pubkeys ok");
   System.out.println("生成密钥对成功");
   return true;
  }
  catch (java.lang.Exception e) {
   e.printStackTrace();
   System.out.println("生成密钥对失败");
   return false;
   };
  }
  public String byte2hex(byte[] b)
    {
     String hs="";
     String stmp="";
     for (int n=0;n&lt;b.length;n++)
      {
       stmp=(java.lang.Integer.toHexString(b[n] &amp; 0XFF));
       if (stmp.length()==1) hs=hs+"0"+stmp;
       else hs=hs+stmp;
       if (n&lt;b.length-1)  hs=hs+":";
      }
     return hs.toUpperCase();
    }
}</pre>
</td>
</tr>
</tbody>
</table>
<br /><br /></li>
</ol>
<p><a name="N101F7"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">2.4. DESede/DES对称算法</span></strong></span></a></p>
<p>首先生成密钥,并保存(这里并没的保存的代码,可参考DSA中的方法)</p>
<p>KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);</p>
<p>SecretKey deskey = keygen.generateKey();</p>
<p>用密钥加密明文(myinfo),生成密文(cipherByte)</p>
<p>Cipher c1 = Cipher.getInstance(Algorithm);</p>
<p>c1.init(Cipher.ENCRYPT_MODE,deskey);</p>
<p>byte[] cipherByte=c1.doFinal(myinfo.getBytes());</p>
<p>传送密文和密钥,本文没有相应代码可参考DSA</p>
<p>.............</p>
<p>用密钥解密密文</p>
<p>c1 = Cipher.getInstance(Algorithm);</p>
<p>c1.init(Cipher.DECRYPT_MODE,deskey);</p>
<p>byte[] clearByte=c1.doFinal(cipherByte);</p>
<p>相对来说对称密钥的使用是很简单的,对于JCE来讲支技DES,DESede,Blowfish三种加密术</p>
<p>对于密钥的保存各传送可使用对象流或者用二进制编码,相关参考代码如下</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">   SecretKey deskey = keygen.generateKey();
   byte[] desEncode=deskey.getEncoded();
   javax.crypto.spec.SecretKeySpec destmp=new javax.crypto.spec.SecretKeySpec(desEncode,Algorithm);
   SecretKey mydeskey=destmp;</pre>
</td>
</tr>
</tbody>
</table>
</p>
<p>相关API</p>
<p>KeyGenerator 在DSA中已经说明,在添加JCE后在instance进可以如下参数</p>
<p>DES,DESede,Blowfish,HmacMD5,HmacSHA1</p>
<p>javax.crypto.Cipher 加/解密器</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">public static final Cipher getInstance(java.lang.String transformation)
                                throws java.security.NoSuchAlgorithmException,
                                       NoSuchPaddingException</pre>
</td>
</tr>
</tbody>
</table>
</p>
<p>返回一个指定方法的Cipher对象</p>
<p>参数:transformation 方法名(可用 DES,DESede,Blowfish)</p>
<p>public final void init(int opmode, java.security.Key key) <br />throws java.security.InvalidKeyException </p>
<p>用指定的密钥和模式初始化Cipher对象</p>
<p>参数:opmode 方式(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)</p>
<p>key 密钥</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">public final byte[] doFinal(byte[] input)
                     throws java.lang.IllegalStateException,
                            IllegalBlockSizeException,
                            BadPaddingException
</pre>
</td>
</tr>
</tbody>
</table>
</p>
<p>对input内的串,进行编码处理,返回处理后二进制串,是返回解密文还是加解文由init时的opmode决定</p>
<p>注意:本方法的执行前如果有update,是对updat和本次input全部处理,否则是本inout的内容</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">/*
安全程序 DESede/DES测试
*/
import java.security.*;
import javax.crypto.*;
public class testdes {
public static void main(String[] args){
    testdes my=new testdes();
    my.run();
  }
public  void run() {
//添加新安全算法,如果用JCE就要把它添加进去
 Security.addProvider(new com.sun.crypto.provider.SunJCE());
String Algorithm="DES"; //定义 加密算法,可用 DES,DESede,Blowfish
String myinfo="要加密的信息";
   try {
   //生成密钥
   KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);
   SecretKey deskey = keygen.generateKey();
   //加密
   System.out.println("加密前的二进串:"+byte2hex(myinfo.getBytes()));
   System.out.println("加密前的信息:"+myinfo);
   Cipher c1 = Cipher.getInstance(Algorithm);
   c1.init(Cipher.ENCRYPT_MODE,deskey);
   byte[] cipherByte=c1.doFinal(myinfo.getBytes());
    System.out.println("加密后的二进串:"+byte2hex(cipherByte));
   //解密
   c1 = Cipher.getInstance(Algorithm);
   c1.init(Cipher.DECRYPT_MODE,deskey);
   byte[] clearByte=c1.doFinal(cipherByte);
   System.out.println("解密后的二进串:"+byte2hex(clearByte));
   System.out.println("解密后的信息:"+(new String(clearByte)));
  }
   catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();}
   catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();}
   catch (java.lang.Exception e3) {e3.printStackTrace();}
  }
 public String byte2hex(byte[] b) //二行制转字符串
    {
     String hs="";
     String stmp="";
     for (int n=0;n&lt;b.length;n++)
      {
       stmp=(java.lang.Integer.toHexString(b[n] &amp; 0XFF));
       if (stmp.length()==1) hs=hs+"0"+stmp;
       else hs=hs+stmp;
       if (n&lt;b.length-1)  hs=hs+":";
      }
     return hs.toUpperCase();
    }
}</pre>
</td>
</tr>
</tbody>
</table>
<br /></p>
<p><a name="N10262"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">2.5. Diffie-Hellman密钥一致协议</span></strong></span></a></p>
<p>公开密钥密码体制的奠基人Diffie和Hellman所提出的 "指数密钥一致协议"(Exponential Key Agreement Protocol),该协议不要求别的安全性先决条件,允许两名用户在公开媒体上交换信息以生成"一致"的,可以共享的密钥。在JCE的中实现用户alice生成DH类型的密钥对,如果长度用1024生成的时间请,推荐第一次生成后保存DHParameterSpec,以便下次使用直接初始化.使其速度加快</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">System.out.println("ALICE: 产生 DH 对 ...");
KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance("DH");
 aliceKpairGen.initialize(512);
KeyPair aliceKpair = aliceKpairGen.generateKeyPair();</pre>
</td>
</tr>
</tbody>
</table>
</p>
<p>alice生成公钥发送组bob</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded();</pre>
</td>
</tr>
</tbody>
</table>
</p>
<p>bob从alice发送来的公钥中读出DH密钥对的初始参数生成bob的DH密钥对</p>
<p>注意这一步一定要做,要保证每个用户用相同的初始参数生成的</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">   DHParameterSpec dhParamSpec = ((DHPublicKey)alicePubKey).getParams();
    KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance("DH");
    bobKpairGen.initialize(dhParamSpec);
    KeyPair bobKpair = bobKpairGen.generateKeyPair();</pre>
</td>
</tr>
</tbody>
</table>
</p>
<p>bob根据alice的公钥生成本地的DES密钥</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">   KeyAgreement bobKeyAgree = KeyAgreement.getInstance("DH");
    bobKeyAgree.init(bobKpair.getPrivate());
    bobKeyAgree.doPhase(alicePubKey, true);
    SecretKey bobDesKey = bobKeyAgree.generateSecret("DES");</pre>
</td>
</tr>
</tbody>
</table>
</p>
<p>bob已经生成了他的DES密钥,他现把他的公钥发给alice,</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">      byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();</pre>
</td>
</tr>
</tbody>
</table>
</p>
<p>alice根据bob的公钥生成本地的DES密钥</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">       ,,,,,,解码
    KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("DH");
    aliceKeyAgree.init(aliceKpair.getPrivate());
    aliceKeyAgree.doPhase(bobPubKey, true);
    SecretKey aliceDesKey = aliceKeyAgree.generateSecret("DES");</pre>
</td>
</tr>
</tbody>
</table>
</p>
<p>bob和alice能过这个过程就生成了相同的DES密钥,在这种基础就可进行安全能信</p>
<p><strong>常用API</strong> </p>
<p>java.security.KeyPairGenerator 密钥生成器类 <br />public static KeyPairGenerator getInstance(String algorithm) <br />throws NoSuchAlgorithmException <br />以指定的算法返回一个KeyPairGenerator 对象 <br />参数: algorithm 算法名.如:原来是DSA,现在添加了 DiffieHellman(DH) </p>
<p>public void initialize(int keysize) <br />以指定的长度初始化KeyPairGenerator对象,如果没有初始化系统以1024长度默认设置 <br />参数:keysize 算法位长.其范围必须在 512 到 1024 之间，且必须为 64 的倍数 <br />注意:如果用1024生长的时间很长,最好生成一次后就保存,下次就不用生成了 </p>
<p>public void initialize(AlgorithmParameterSpec params) <br />throws InvalidAlgorithmParameterException <br />以指定参数初始化 </p>
<p>javax.crypto.interfaces.DHPublicKey <br />public DHParameterSpec getParams() <br />返回 <br />java.security.KeyFactory </p>
<p>public static KeyFactory getInstance(String algorithm) <br />throws NoSuchAlgorithmException <br />以指定的算法返回一个KeyFactory <br />参数: algorithm 算法名:DSH,DH </p>
<p>public final PublicKey generatePublic(KeySpec keySpec) <br />throws InvalidKeySpecException <br />根据指定的key说明,返回一个PublicKey对象 </p>
<p>java.security.spec.X509EncodedKeySpec <br />public X509EncodedKeySpec(byte[] encodedKey) <br />根据指定的二进制编码的字串生成一个key的说明 <br />参数:encodedKey 二进制编码的字串(一般能过PublicKey.getEncoded()生成) <br />javax.crypto.KeyAgreement 密码一至类 </p>
<p>public static final KeyAgreement getInstance(java.lang.String algorithm) <br />throws java.security.NoSuchAlgorithmException <br />返回一个指定算法的KeyAgreement对象 <br />参数:algorithm 算法名,现在只能是DiffieHellman(DH) </p>
<p>public final void init(java.security.Key key) <br />throws java.security.InvalidKeyException <br />用指定的私钥初始化 <br />参数:key 一个私钥 </p>
<p>public final java.security.Key doPhase(java.security.Key key, <br />boolean lastPhase) <br />throws java.security.InvalidKeyException, <br />java.lang.IllegalStateException <br />用指定的公钥进行定位,lastPhase确定这是否是最后一个公钥,对于两个用户的 <br />情况下就可以多次定次,最后确定 <br />参数:key 公钥 <br />lastPhase 是否最后公钥 </p>
<p>public final SecretKey generateSecret(java.lang.String algorithm) <br />throws java.lang.IllegalStateException, <br />java.security.NoSuchAlgorithmException, <br />java.security.InvalidKeyException <br />根据指定的算法生成密钥 <br />参数:algorithm 加密算法(可用 DES,DESede,Blowfish) </p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">*/
import java.io.*;
import java.math.BigInteger;
import java.security.*;
import java.security.spec.*;
import java.security.interfaces.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
import com.sun.crypto.provider.SunJCE;
public class testDHKey {
    public static void main(String argv[]) {
    try {
        testDHKey my= new testDHKey();
        my.run();
    } catch (Exception e) {
        System.err.println(e);
    }
    }
    private void run() throws Exception {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
    System.out.println("ALICE: 产生 DH 对 ...");
    KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance("DH");
        aliceKpairGen.initialize(512);
    KeyPair aliceKpair = aliceKpairGen.generateKeyPair(); //生成时间长
        // 张三(Alice)生成公共密钥 alicePubKeyEnc 并发送给李四(Bob) ,
        //比如用文件方式,socket.....
    byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded();
       //bob接收到alice的编码后的公钥,将其解码
    KeyFactory bobKeyFac = KeyFactory.getInstance("DH");
    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec  (alicePubKeyEnc);
    PublicKey alicePubKey = bobKeyFac.generatePublic(x509KeySpec);
        System.out.println("alice公钥bob解码成功");
     // bob必须用相同的参数初始化的他的DH KEY对,所以要从Alice发给他的公开密钥,
         //中读出参数,再用这个参数初始化他的 DH key对
         //从alicePubKye中取alice初始化时用的参数
    DHParameterSpec dhParamSpec = ((DHPublicKey)alicePubKey).getParams();
    KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance("DH");
    bobKpairGen.initialize(dhParamSpec);
    KeyPair bobKpair = bobKpairGen.generateKeyPair();
        System.out.println("BOB: 生成 DH key 对成功");
    KeyAgreement bobKeyAgree = KeyAgreement.getInstance("DH");
    bobKeyAgree.init(bobKpair.getPrivate());
        System.out.println("BOB: 初始化本地key成功");
        //李四(bob) 生成本地的密钥 bobDesKey
    bobKeyAgree.doPhase(alicePubKey, true);
    SecretKey bobDesKey = bobKeyAgree.generateSecret("DES");
    System.out.println("BOB: 用alice的公钥定位本地key,生成本地DES密钥成功");
        // Bob生成公共密钥 bobPubKeyEnc 并发送给Alice,
        //比如用文件方式,socket.....,使其生成本地密钥
    byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();
        System.out.println("BOB向ALICE发送公钥");
         // alice接收到 bobPubKeyEnc后生成bobPubKey
         // 再进行定位,使aliceKeyAgree定位在bobPubKey
    KeyFactory aliceKeyFac = KeyFactory.getInstance("DH");
    x509KeySpec = new X509EncodedKeySpec(bobPubKeyEnc);
    PublicKey bobPubKey = aliceKeyFac.generatePublic(x509KeySpec);
       System.out.println("ALICE接收BOB公钥并解码成功");
;
    KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("DH");
    aliceKeyAgree.init(aliceKpair.getPrivate());
        System.out.println("ALICE: 初始化本地key成功");
    aliceKeyAgree.doPhase(bobPubKey, true);
        // 张三(alice) 生成本地的密钥 aliceDesKey
    SecretKey aliceDesKey = aliceKeyAgree.generateSecret("DES");
        System.out.println("ALICE: 用bob的公钥定位本地key,并生成本地DES密钥");
        if (aliceDesKey.equals(bobDesKey)) System.out.println("张三和李四的密钥相同");
       //现在张三和李四的本地的deskey是相同的所以,完全可以进行发送加密,接收后解密,达到
       //安全通道的的目的
        /*
         * bob用bobDesKey密钥加密信息
         */
    Cipher bobCipher = Cipher.getInstance("DES");
    bobCipher.init(Cipher.ENCRYPT_MODE, bobDesKey);
        String bobinfo= "这是李四的机密信息";
        System.out.println("李四加密前原文:"+bobinfo);
    byte[] cleartext =bobinfo.getBytes();
    byte[] ciphertext = bobCipher.doFinal(cleartext);
        /*
         * alice用aliceDesKey密钥解密
         */
    Cipher aliceCipher = Cipher.getInstance("DES");
    aliceCipher.init(Cipher.DECRYPT_MODE, aliceDesKey);
    byte[] recovered = aliceCipher.doFinal(ciphertext);
        System.out.println("alice解密bob的信息:"+(new String(recovered)));
    if (!java.util.Arrays.equals(cleartext, recovered))
        throw new Exception("解密后与原文信息不同");
    System.out.println("解密后相同");
    }
}</pre>
</td>
</tr>
</tbody>
</table>
<br /></p>
<p><a name="3"><span class="atitle">第3章小结</span></a></p>
<p>在加密术中生成密钥对时，密钥对的当然是越长越好，但费时也越多，请从中从实际出发选取合适的长度，大部分例码中的密钥是每次运行就从新生成，在实际的情况中是生成后在一段时间保存在文件中，再次运行直接从文件中读入，从而加快速度。当然定时更新和加强密钥保管的安全性也是必须的。</p>
</blockquote>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/188055#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Apr 2008 14:47:32 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/188055</link>
        <guid>http://jatula.javaeye.com/blog/188055</guid>
      </item>
      <item>
        <title>native2ascII</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/187896" style="color:red;">http://jatula.javaeye.com/blog/187896</a>&nbsp;
          发表时间: 2008年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>輔助转换</p>
<p>native2ascII -encoding UTF-8 lang_zh_old.properties lang_zh.properties </p>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/187896#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Apr 2008 09:44:42 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/187896</link>
        <guid>http://jatula.javaeye.com/blog/187896</guid>
      </item>
      <item>
        <title>jdk1.5中的队列Queue </title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/187597" style="color:red;">http://jatula.javaeye.com/blog/187597</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; jdk1.5后加入了新的集合类Queue，在这之前如果想使用一个队列的数据结构，大多数是用List来模拟出来的，加入的时候用add()<br />弹出的时候自己手动remove前边的对象。但Queue本身就是个队列，不需要再多这些步骤。下边是个简单的用法，对比stack的演示代码:</p>
<pre name="code" class="java">import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;


public class TestQueue {
    public static void main(String[] args) {
        //队列是先进先出
        Queue&lt;String&gt; q = new LinkedList&lt;String&gt;();
        //这里offer和add类似
 
  q.offer("a");
        q.offer("b");
        q.offer("c");
        System.out.println(q);
        //队列头部弹出
        q.poll();
        System.out.println(q);
        //栈你是后进先出
        Stack&lt;String&gt; s = new Stack&lt;String&gt;();
        s.add("a");
        s.add("b");
        //这里push等同add
        s.push("c");
        System.out.println(s);
        //栈顶弹出
        s.pop();
        System.out.println(s);
        //只是看一下栈顶的值，并不移除
        s.peek();
        System.out.println(s);
    }
}
 
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/187597#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Apr 2008 16:13:35 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/187597</link>
        <guid>http://jatula.javaeye.com/blog/187597</guid>
      </item>
      <item>
        <title>什么是RTP协议?</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/187559" style="color:red;">http://jatula.javaeye.com/blog/187559</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>
<p>实时传输协议（RTP）是一个Internet协议标准，它描述了程序管理多媒体数据实时传输的方式。最初在Internet工程任务组（IETF）的请求注解（RFC）1869中对RTP协议进行了描述，RTP由IETF的音视频传输工作组设计，它支持多个地域上分布的参与者的视频会议。RTP普遍应用于Internet的电话应用中。RTP本身并不保证多媒体数据的实时传输（因为这取决于网络特性），但是，当数据尽最大努力到达后它将提供必要的方法来管理这些数据。<br /><br />　　RTP与控制协议（RTCP）配合工作，RTCP使得大的组播网络能够监视数据传输。监视能使接收器侦测到任何的包丢失，还可以补偿任何的延迟抖动。两个协议都独立于下面的传输层和网络层协议。RTP头中的信息将告诉接收器如何重建数据，并描述了比特流失如何打包的。通常，RTP工作于用户数据报协议（UDP）之上，但它也能使用其他的传输协议。会话发起协议（SIP）和H.232都使用RTP。</p>
</strong></p>
          <br/>
          <span style="color:red;">
            <a href="http://jatula.javaeye.com/blog/187559#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Apr 2008 15:13:56 +0800</pubDate>
        <link>http://jatula.javaeye.com/blog/187559</link>
        <guid>http://jatula.javaeye.com/blog/187559</guid>
      </item>
      <item>
        <title>LINUX的目录树</title>
        <author>Jatula</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jatula.javaeye.com">Jatula</a>&nbsp;
          链接：<a href="http://jatula.javaeye.com/blog/187492" style="color:red;">http://jatula.javaeye.com/blog/187492</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>目录树可以分为小的部分，每个部分可以在自己的磁盘或分区上。主要部分是根、/usr&nbsp;、/var&nbsp;和&nbsp;/home&nbsp;文件系统。每个部分有不同的目的。 <br /><br />每台机器都有根文件系统，它包含系统引导和使其他文件系统得以mount所必要的文件，根文件系统应该有单用户状态所必须的足够的内容。还应该包括修复损坏系统、恢复备份等的工具。&nbsp; <br /><br />/usr&nbsp;文件系统包含所有命令、库、man页和其他一般操作中所需的不改变的文件。&nbsp;/usr&nbsp;不应该有一般使用中要修改的文件。这样允许此文件系统中的文件通过网络共享，这样可以更有效，因为这样节省了磁盘空间(/usr&nbsp;很容易是数百兆)，且易于管理(当升级应用时，只有主/usr&nbsp;需要改变，而无须改变每台机器)&nbsp;即使此文件系统在本地盘上，也可以只读mount，以减少系统崩溃时文件系统的损坏。&nbsp; <br /><br />/var&nbsp;文件系统包含会改变的文件，比如spool目录(mail、news、打印机等用的)，&nbsp;log文件、formatted&nbsp;manual&nbsp;pages和暂存文件。传统上/var&nbsp;的所有东西曾在&nbsp;/usr&nbsp;下的某个地方，但这样/usr&nbsp;就不可能只读安装了。&nbsp; <br /><br />/home&nbsp;文件系统包含用户家目录，即系统上的所有实际数据。一个大的/home&nbsp;可能要分为若干文件系统，需要在/home&nbsp;下加一级名字，如/home/students&nbsp;、/home/staff&nbsp;等。&nbsp; <br /><br />虽然上面将不同的部分称为文件系统，但它们不必是真的分离的文件系统。如果系统是小的单用户系统，而用户希望简单化，可以很容易地放在一个文件系统中。根据磁盘容量和不同目的所需分配的空间，目录树也可以分到不同的文件系统中。重要的是使用标准的名字，即使/var&nbsp;和/usr&nbsp;在同一分区上，名字/usr/lib/libc.a&nbsp;和/var/adm/messages&nbsp;必须能工作，例如将/var&nbsp;下的文件移动到/usr/var&nbsp;，并将/var&nbsp;作为/usr/var&nbsp;的符号连接。&nbsp; <br /><br />Unix文件结构根据目的来分组文件，即所有的命令在一个地方，所有的数据在另一个地方，所有的文档又在一个地方，等等。另一个方法是根据属于的程序分组文件，即所有Emacs文件在一个目录中，所有TeX文件在另一个中，等等。后一种方法的问题是文件难于共享(程序目录经常同时包含静态可共享的和动态不可共享的文件)，有时难于查找&nbsp;(例如man页在极大数量的地方，使man程序查找它们极其困难)。&nbsp; <br /><br />根文件系统 <br />根文件系统一般应该比较小，因为包括严格的文件和一个小的不经常改变的文件系统不容易损坏。损坏的根文件系统一般意味着除非用特定的方法(例如从软盘)系统无法引导。&nbsp; <br /><br />根目录一般不含任何文件，除了可能的标准的系统引导映象，通常叫/vmlinuz&nbsp;。所有其他文件在根文件系统的子目录中。&nbsp; <br /><br />/bin&nbsp;&nbsp; <br />引导启动所需的命令或普通用户可能用的命令(可能在