﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-hyq0077</title><link>http://www.blogjava.net/hyq0077/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 13:27:34 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 13:27:34 GMT</pubDate><ttl>60</ttl><item><title>apache、resin泛域名、多域名设置</title><link>http://www.blogjava.net/hyq0077/archive/2007/06/14/124307.html</link><dc:creator>hyq</dc:creator><author>hyq</author><pubDate>Thu, 14 Jun 2007 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/hyq0077/archive/2007/06/14/124307.html</guid><wfw:comment>http://www.blogjava.net/hyq0077/comments/124307.html</wfw:comment><comments>http://www.blogjava.net/hyq0077/archive/2007/06/14/124307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyq0077/comments/commentRss/124307.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyq0077/services/trackbacks/124307.html</trackback:ping><description><![CDATA[<p>版本：httpd-2.2.4、resin-3.0.19<br>泛域名：<br><br>Apache:</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">VirtualHost&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">80</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DocumentRoot&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">pengpeng</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">xspace</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ServerName&nbsp;x.</span><span style="COLOR: #000000">243</span><span style="COLOR: #000000">.com<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ServerAlias&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">.x.</span><span style="COLOR: #000000">243</span><span style="COLOR: #000000">.com<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">VirtualHost</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">VirtualHost&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">80</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DocumentRoot&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">pengpeng</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">xhome</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ServerName&nbsp;home.</span><span style="COLOR: #000000">243</span><span style="COLOR: #000000">.com<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ServerAlias&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">.home.</span><span style="COLOR: #000000">243</span><span style="COLOR: #000000">.com<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">VirtualHost</span><span style="COLOR: #000000">&gt;</span></div>
<br>Resin:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">host&nbsp;id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">home.243.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;root</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">directory</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">host</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">alias</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">regexp</span><span style="COLOR: #000000">&gt;^</span><span style="COLOR: #000000">([</span><span style="COLOR: #000000">^/</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">).home.</span><span style="COLOR: #000000">243</span><span style="COLOR: #000000">.com</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">host</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">alias</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">regexp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">redeploy</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mode</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">manual</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">redeploy</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mode</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">web</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">app&nbsp;id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;document</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">directory</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/usr/local/pengpeng/xhome/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">host</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">host&nbsp;id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x.243.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;root</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">directory</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">host</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">alias</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">regexp</span><span style="COLOR: #000000">&gt;^</span><span style="COLOR: #000000">([</span><span style="COLOR: #000000">^/</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">).x.</span><span style="COLOR: #000000">243</span><span style="COLOR: #000000">.com</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">host</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">alias</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">regexp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">redeploy</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mode</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">manual</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">redeploy</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mode</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">web</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">app&nbsp;id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;document</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">directory</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/usr/local/pengpeng/xspace/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">host</span><span style="COLOR: #000000">&gt;</span></div>
<br><br>多域名：<br>&nbsp;<br>apache:<br>&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">VirtualHost&nbsp;</span><span style="COLOR: #ff0000">*:80</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DocumentRoot&nbsp;/usr/local/pengpeng/channel/<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ServerName&nbsp;blog.pengpeng.com<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteEngine&nbsp;On<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;来自"Host:"头的ServerName&nbsp;，可能大小写混杂<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RewriteMap&nbsp;lowercase&nbsp;int:tolower<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;检查hostname正确与否，之后才能使RewriteRule起作用<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteCond&nbsp;${lowercase:%{HTTP_HOST}}&nbsp;^blog.pengpeng.com(.*)$<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteCond&nbsp;%{REQUEST_URI}&nbsp;!^/(.+\.do)$<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteRule&nbsp;&nbsp;&nbsp;&nbsp;^/index.jsp$&nbsp;&nbsp;&nbsp;/blog/index.jsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[PT]<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">VirtualHost&nbsp;*:80</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">VirtualHost&nbsp;</span><span style="COLOR: #ff0000">*:80</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DocumentRoot&nbsp;/usr/local/pengpeng/channel/<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ServerName&nbsp;show.pengpeng.com<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteEngine&nbsp;On<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;来自"Host:"头的ServerName&nbsp;，可能大小写混杂<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RewriteMap&nbsp;lowercase&nbsp;int:tolower<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;检查hostname正确与否，之后才能使RewriteRule起作用<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteCond&nbsp;${lowercase:%{HTTP_HOST}}&nbsp;^show.pengpeng.com(.*)$<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteCond&nbsp;%{REQUEST_URI}&nbsp;!^/(.+\.do)$<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteRule&nbsp;&nbsp;&nbsp;&nbsp;^/index.jsp$&nbsp;&nbsp;&nbsp;/show/index.jsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[PT]<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">VirtualHost&nbsp;*:80</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">VirtualHost&nbsp;</span><span style="COLOR: #ff0000">*:80</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DocumentRoot&nbsp;/usr/local/pengpeng/channel/<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ServerName&nbsp;photo.pengpeng.com<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteEngine&nbsp;On<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;来自"Host:"头的ServerName&nbsp;，可能大小写混杂<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RewriteMap&nbsp;lowercase&nbsp;int:tolower<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;检查hostname正确与否，之后才能使RewriteRule起作用<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteCond&nbsp;${lowercase:%{HTTP_HOST}}&nbsp;^photo.pengpeng.com(.*)$<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteCond&nbsp;%{REQUEST_URI}&nbsp;!^/(.+\.do)$<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RewriteRule&nbsp;&nbsp;&nbsp;&nbsp;^/index.jsp$&nbsp;&nbsp;&nbsp;/photo/index.jsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[PT]<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">VirtualHost&nbsp;*:80</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>Resin:<br>&nbsp;<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">host&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="channel.pengpeng.com"</span><span style="COLOR: #ff0000">&nbsp;root-directory</span><span style="COLOR: #0000ff">="."</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">host-alias</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">blog.pengpeng.com</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">host-alias</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">host-alias</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">show.pengpeng.com</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">host-alias</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">host-alias</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">photo.pengpeng.com</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">host-alias</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="/"</span><span style="COLOR: #ff0000">&nbsp;document-directory</span><span style="COLOR: #0000ff">="/usr/local/pengpeng/channel/"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">host</span><span style="COLOR: #0000ff">&gt;</span></div>
<br><br>参考：<a href="http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/index.html">http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/index.html</a><br>
<img src ="http://www.blogjava.net/hyq0077/aggbug/124307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyq0077/" target="_blank">hyq</a> 2007-06-14 14:06 <a href="http://www.blogjava.net/hyq0077/archive/2007/06/14/124307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型网站部署之建议</title><link>http://www.blogjava.net/hyq0077/archive/2007/06/05/deploy.html</link><dc:creator>hyq</dc:creator><author>hyq</author><pubDate>Tue, 05 Jun 2007 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/hyq0077/archive/2007/06/05/deploy.html</guid><wfw:comment>http://www.blogjava.net/hyq0077/comments/122187.html</wfw:comment><comments>http://www.blogjava.net/hyq0077/archive/2007/06/05/deploy.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyq0077/comments/commentRss/122187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyq0077/services/trackbacks/122187.html</trackback:ping><description><![CDATA[1、避免应用服务器的cluster部署<br>2、多应用服务器并行服务<br>3、跨应用交互尽量用JMS<br>4、类schedule部署于同一服务器<br>5、设置专门的静态资源服务器，采用lighttpd作为服务<br>6、用F5作负载均衡<br>7、采用CDN 
<img src ="http://www.blogjava.net/hyq0077/aggbug/122187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyq0077/" target="_blank">hyq</a> 2007-06-05 17:32 <a href="http://www.blogjava.net/hyq0077/archive/2007/06/05/deploy.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK6的新特性（转）</title><link>http://www.blogjava.net/hyq0077/articles/121120.html</link><dc:creator>hyq</dc:creator><author>hyq</author><pubDate>Thu, 31 May 2007 04:29:00 GMT</pubDate><guid>http://www.blogjava.net/hyq0077/articles/121120.html</guid><wfw:comment>http://www.blogjava.net/hyq0077/comments/121120.html</wfw:comment><comments>http://www.blogjava.net/hyq0077/articles/121120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyq0077/comments/commentRss/121120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyq0077/services/trackbacks/121120.html</trackback:ping><description><![CDATA[<p><a name=top>&nbsp;</a> <br><span style="COLOR: red">一、</span><a href="#t1"><span style="COLOR: red">Web服务元数据</span></a><span style="COLOR: red"> <br>二、</span><a href="#t2"><span style="COLOR: red">脚本语言支持</span></a><span style="COLOR: red"> <br>三、</span><a href="#t3"><span style="COLOR: red">嵌入式数据库</span></a><span style="COLOR: red"> <br>四、</span><a href="#t4"><span style="COLOR: red">在Java SE6(Mustang)中使用Desktop API</span></a><span style="COLOR: red"> <br>五、</span><a href="#t5"><span style="COLOR: red">使用Compiler API</span></a><span style="COLOR: red"> <br>六、</span><a href="#t6"><span style="COLOR: red">轻量级Http Server </span></a><br><span style="COLOR: red">七、</span><a href="#t7"><span style="COLOR: red">用Console开发控制台程序</span></a> </p>
<p><br><br>一、<a name=t1>Web服务元数据</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#top">top</a> <br><br>.Net的Web Services元数据<br>早在.Net&nbsp; Framework 1.0中,微软就用元数据功能(.net的attribute特性)来标注要暴露成Web Service的方法,下面是用C#演示的利用.net的元数据功能暴露Web Service方法的代码片断.<br>public class TestWS{<br>&nbsp;&nbsp;&nbsp; [WebMethod]<br>&nbsp;&nbsp;&nbsp; public String sayHi(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Hi!";<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public int add(int d1,int d2){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return d1+d2;<br>&nbsp;&nbsp;&nbsp; }<br>}<br>上面的[WebMethod]是加在方法sayHi上面的元数据,用来告诉Web Services引擎(一般是ASP.NET Runtime), 我这个方法需要暴露为一个Web Service,你需要帮我生成相应的WSDL描述及相关支持文件.而另一个方法add没有加这个元数据,所以Web Services引擎就不会为该方法生成WSDL及相关支持文件</p>
<p>Java的Web Services元数据<br>Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆将名字也重构为Java EE, Java EE(当前版本为5.0)将元数据纳入很多规范当中,这其中就包括Web Services的相关规范, 加入元数据之后的Web Services服务器端编程模型就跟上面看到的C#片断差不多了, 这显然比以前的JAX-RPC编程模型简单(当然, Axis的编程模型也很简单).这里要谈的Web服务元数据(JSR 181)只是Java Web 服务规范中的一个,它跟Common Annotations, JAXB2, StAX, SAAJ和JAX-WS等共同构成Java EE 5的Web Services技术堆栈.</p>
<p>JSR-181的元数据清单<br>下面介绍JSR-181里面各个元数据的相关参数及用途<br>Annotation Retention Target Description <br>&nbsp;WebService&nbsp; Runtime Type <br>&nbsp;标注要暴露为Web Services的类或接口 <br>&nbsp;WebParam&nbsp; Runtime Parameter 自定义服务方法参数到WSDL的映射 <br>&nbsp;WebResult&nbsp; Runtime Method 自定义服务方法返回值到WSDL的映射 <br>&nbsp;WebMethod&nbsp; Runtime Method 自定义单个服务方法到WSDL的映射 <br>&nbsp;Oneway&nbsp; Runtime Method 必须与@WebMethod连用,表明被标注方法只有输入没有输出,这就要求被标注方法不能有返回值,也不能声明checked exception<br>&nbsp;<br>&nbsp;HandlerChain&nbsp; Runtime Type,Method,Field 将Web服务与外部Handler chain关联起来 <br>&nbsp;SOAPBinding&nbsp; Runtime Type,Method 自定义SOAPBinding </p>
<p>JSR-181元数据使用示例</p>
<p>package WebServices;</p>
<p>import java.io.File;<br>import java.io.IOException;<br>import javax.jws.Oneway;<br>import javax.jws.WebMethod;<br>import javax.jws.WebParam;<br>import javax.jws.WebResult;<br>import javax.jws.WebService;<br>import javax.xml.ws.Endpoint;</p>
<p>/**<br>&nbsp;* @author chinajash<br>&nbsp;*/<br>@WebService(targetNamespace="<a href="http://blog.csdn.net/chinajash%22,serviceName=%22HelloService">http://blog.csdn.net/chinajash",serviceName="HelloService</a>")<br>public class WSProvider {<br>&nbsp;&nbsp;&nbsp; @WebResult(name="Greetings")//自定义该方法返回值在WSDL中相关的描述&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; @WebMethod<br>&nbsp;&nbsp;&nbsp; public String sayHi(@WebParam(name="MyName") String name){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Hi,"+name; <a>//@WebParam</a>是自定义参数name在WSDL中相关的描述<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; @Oneway //表明该服务方法是单向的,既没有返回值,也不应该声明检查异常<br>&nbsp;&nbsp;&nbsp; @WebMethod(action="printSystemTime",operationName="printSystemTime")//自定义该方法在WSDL中相关的描述<br>&nbsp;&nbsp;&nbsp; public void printTime(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(System.currentTimeMillis());<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread wsPublisher = new Thread(new WSPublisher());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wsPublisher.start();<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; private static class WSPublisher implements Runnable{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发布WSProvider到<a href="http://localhost:8888/chinajash/WSProvider">http://localhost:8888/chinajash/WSProvider</a>这个地址,之前必须调用wsgen命令<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //生成服务类WSProvider的支持类,命令如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //wsgen -cp . WebServices.WSProvider<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endpoint.publish("<a href="http://localhost:8888/chinajash/WSProvider%22,new">http://localhost:8888/chinajash/WSProvider",new</a> WSProvider());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>如果想看到Web Services Engine生成的WSDL文件是否遵守上面的元数据, 我们没有必要将上面的WSProvider部署到支持JSR-181的应用服务器或Servlet形式的Web Services Engine,现在JDK6已经提供了一个很简单的机制可以用来测试和发布Web Services,下面讲讲如何在JDK6环境下发布Web Services和查看生成的WSDL<br>1.将&lt;JDK_HOME&gt;/bin加入path环境变量<br>2.在命令行下切换当前目录到WSProvider的class文件所在的目录,运行下面命令<br>wsgen -cp . WebServices.WSProvider<br>在这个例子中会生成以下3个类的源代码文件及class文件<br>SayHi<br>SayHiResponse<br>PrintTime<br>3.执行如下代码发布WSProvider到<a href="http://localhost:8888/chinajash/WSProvider">http://localhost:8888/chinajash/WSProvider</a>,在这里可以执行WSProvider类的main方法就可以<br>Endpoint.publish("<a href="http://localhost:8888/chinajash/WSProvider%22,new">http://localhost:8888/chinajash/WSProvider",new</a> WSProvider());<br>4.在浏览器输入<a href="http://localhost:8888/chinajash/WSProvider?wsdl">http://localhost:8888/chinajash/WSProvider?wsdl</a>就可以看到生成的WSDL文件，为了节省篇幅,这里就不把生成的WSDL文件贴上了，大家可以自己动手试试.<br><br><br>--------------------------------------------------------------------------------------------------------<br><br>二、<a name=t2>脚本语言支持</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#top">top</a> <br><br>JDK6增加了对脚本语言的支持(JSR 223)，原理上是将脚本语言编译成bytecode，这样脚本语言也能享用Java平台的诸多优势，包括可移植性，安全等，另外，由于现在是编译成bytecode后再执行，所以比原来边解释边执行效率要高很多。加入对脚本语言的支持后，对Java语言也提供了以下好处。<br>1、许多脚本语言都有动态特性，比如，你不需要用一个变量之前先声明它，你可以用一个变量存放完全不同类型的对象，你不需要做强制类型转换，因为转换都是自动的。现在Java语言也可以通过对脚本语言的支持间接获得这种灵活性。<br>2、 可以用脚本语言快速开发产品原型，因为现在可以Edit-Run，而无需Edit-Compile-Run，当然，因为Java有非常好的IDE支持，我 们完全可以在IDE里面编辑源文件，然后点击运行(隐含编译)，以此达到快速开发原型的目的，所以这点好处基本上可以忽略。<br>3、通过引入脚本语言可以轻松实现Java应用程序的扩展和自定义，我们可以把原来分布在在Java应用程序中的配置逻辑，数学表达式和业务规则提取出来，转用JavaScript来处理。</p>
<p>Sun的JDK6实现包含了一个基于Mozilla Rhino的 脚本语言引擎，支持JavaScript，这并不是说明JDK6只支持JavaScript，任何第三方都可以自己实现一个JSR-223兼容的脚本引擎 使得JDK6支持别的脚本语言，比如，你想让JDK6支持Ruby，那你可以自己按照JSR 223的规范实现一个Ruby的脚本引擎类，具体一点，你需要实现javax.script.ScriptEngine(简单起见，可以继承javax.script.AbstractScriptEngine)和javax.script.ScriptEngineFactory两个接口。当然，在你实现自己的脚本语言引擎之前，先到scripting.dev.java.net project 这里看看是不是有人已经帮你做了工作，这样你就可以直接拿来用就行。</p>
<p>Scripting API</p>
<p>Scripting API是用于在Java里面编写脚本语言程序的API， 在Javax.script中可以找到Scripting API，我们就是用这个API来编写JavaScript程序，这个包里面有一个ScriptEngineManager类，它是使用Scripting API的入口，ScriptEngineManager可以通过jar服务发现(service discovery)机制寻找合适的脚本引擎类(ScriptEngine)，使用Scripting API的最简单方式只需下面三步<br>1、创建一个ScriptEngineManager对象<br>2、通过ScriptEngineManager获得ScriptEngine对象<br>3、用ScriptEngine的eval方法执行脚本</p>
<p>下面是一个Hello World程序</p>
<p>/** * @author chinajash */public class HelloScript {public static void main(String[] args) throws Exception {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScriptEngineManager factory = new ScriptEngineManager();//step 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScriptEngine engine = factory.getEngineByName("JavaScript");//Step 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; engine.eval("print('Hello, Scripting')");//Step 3&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; }运行上面程序，控制台会输出Hello, Scripting上面这个简单的Scripting程序演示了如何在Java里面运行脚本语言，除此之外，我们还可以利用Scripting API实现以下功能1、暴露Java对象为脚本语言的全局变量2、在Java中调用脚本语言的方法3、脚本语言可以实现Java的接口4、脚本语言可以像Java一样使用JDK平台下的类下面的类演示了以上4种功能package Scripting;import java.io.File;import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;import javax.script.ScriptException;/** * @author chinajash */public class ScriptingAPITester {&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScriptEngineManager manager = new ScriptEngineManager();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScriptEngine engine = manager.getEngineByName("JavaScript");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testScriptVariables(engine);//演示如何暴露Java对象为脚本语言的全局变量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testInvokeScriptMethod(engine);//演示如何在Java中调用脚本语言的方法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testScriptInterface(engine);//演示脚本语言如何实现Java的接口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testUsingJDKClasses(engine);//演示脚本语言如何使用JDK平台下的类&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void testScriptVariables(ScriptEngine engine) throws ScriptException{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File file = new File("test.txt");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; engine.put("f", file);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; engine.eval("println('Total Space:'+f.getTotalSpace())");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void testInvokeScriptMethod(ScriptEngine engine) throws Exception{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String script = "function hello(name) { return 'Hello,' + name;}";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; engine.eval(script);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Invocable inv = (Invocable) engine;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String res = (String)inv.invokeFunction("hello", "Scripting" );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("res:"+res);&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void testScriptInterface(ScriptEngine engine) throws ScriptException{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String script = "var obj = new Object(); obj.run = function() { println('run method called'); }";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; engine.eval(script);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object obj = engine.get("obj");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Invocable inv = (Invocable) engine;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Runnable r = inv.getInterface(obj,Runnable.class);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread th = new Thread(r);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; th.start();&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void testUsingJDKClasses(ScriptEngine engine) throws Exception{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Packages是脚本语言里的一个全局变量,专用于访问JDK的package&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String js = "function doSwing(t){var f=new Packages.javax.swing.JFrame(t);f.setSize(400,300);f.setVisible(true);}";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; engine.eval(js);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Invocable inv = (Invocable) engine;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inv.invokeFunction("doSwing", "Scripting Swing" );&nbsp;&nbsp;&nbsp; }}Scripting Tool</p>
<p><br>SUN提供的JDK6中有一个命令行工具??jrunscript，你可以在&lt;JDK6_Home&gt;/bin下面找到这个工具，jrunscript是一个脚本语言的解释程序，它独立于脚本语言，但默认是用JavaScript，我们可以用jrunscript来测试自己写的脚本语言是否正确，下面是一个在命令行运行jrunscript的简单例子<br>jrunscript<br>js&gt;println("Hello,JrunScript");<br>Hello,JrunScript<br>js&gt;9*8<br>72.0<br>js&gt;<br><br>--------------------------------------------------------------------------------------------------------<br><br>三、<a name=t3>嵌入式数据库Derby<a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#top">top</a> <br><br><br>Derby并不是一个新的数据库产品,它是由IBM捐献给Apache的DB项目的一个纯Java数据库,JDK6.0里面带的这个Derby的版本是10.2.1.7,支持存储过程和触发器;有两种运行模式,一种是作为嵌入式数据库,另一种是作为网络数据库,前者的数据库服务器和客户端都在同一个JVM里面运行,后者允许数据库服务器端和客户端不在同一个JVM里面,而且允许这两者在不同的物理机器上.值得注意的是JDK6里面的这个Derby支持JDK6的新特性JDBC 4.0规范(JSR 221),现在我们如果要练习JDBC的用法,没有必要单独装一个数据库产品了,直接用Derby就行.安装完JDK6.0后,Derby会被安装到&lt;JDK6_HOME&gt;/db下面,在&lt;JDK6_HOME&gt;/db/demo/programs下面还有一些示例程序,演示了如何启动,连接Derby数据库以及JDBC API的使用.下面分两种情况演示一下如何用代码操作Derby数据库,一种是嵌入式数据库,一种是网络数据库.</p>
<p>一.嵌入式数据库</p>
<p>&nbsp;/**<br>&nbsp;* @author chinajash<br>&nbsp;*/<br>public class EmbeddedDerbyTester {<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String driver = "org.apache.derby.jdbc.EmbeddedDriver";//在derby.jar里面<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String dbName="EmbeddedDB";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String dbURL = "jdbc:derby:"+dbName+";create=true";//create=true表示当数据库不存在时就创建它<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName(driver);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection conn = DriverManager.getConnection(dbURL);//启动嵌入式数据库<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement st = conn.createStatement();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.execute("create table foo (FOOID INT NOT NULL,FOONAME VARCHAR(30) NOT NULL)");//创建foo表<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.executeUpdate("insert into foo(FOOID,FOONAME) values (1,'chinajash')");//插入一条数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = st.executeQuery("select * from foo");//读取刚插入的数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int id = rs.getInt(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = rs.getString(2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("id="+id+";name="+name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch(Exception e){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>运行上面程序后,会在当前目录生成名为EmbeddedDB的文件夹,既是EmbeddedDB数据库的数据文件存放的地方,控制台将输出</p>
<p>id=1;name=chinajash</p>
<p>二.网络数据库</p>
<p>/**<br>&nbsp;* @author chinajash<br>&nbsp;*/<br>public class NetworkServerDerbyTester {<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String driver = "org.apache.derby.jdbc.ClientDriver";//在derbyclient.jar里面<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String dbName="NetworkDB";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String connectionURL = "jdbc:derby://localhost:1527/" + dbName + ";create=true";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建Derby网络服务器,默认端口是1527,也可以通过运行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Derby_Home&gt;\frameworks\NetworkServer\bin\startNetworkServer.bat<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来创建并启动Derby网络服务器,如果是Unix,用startNetworkServer.ksh<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NetworkServerControl derbyServer = new NetworkServerControl();//NetworkServerControl类在derbynet.jar里面<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter pw = new PrintWriter(System.out);//用系统输出作为Derby数据库的输出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; derbyServer.start(pw);//启动Derby服务器<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName(driver);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DriverManager.getConnection(connectionURL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //do something<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; derbyServer.shutdown();//关闭Derby服务器<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>&nbsp;运行上面程序后,会在当前目录生成名为NetworkDB的文件夹</p>
<p>关于Derby的详细情况,请参考<a href="http://db.apache.org/derby">http://db.apache.org/derby</a></p>
<br>----------------------------------------------------------------------------------------------------<br><br>四、<a name=t4>在Java SE6(Mustang)中使用Desktop API</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#top">top</a> <br><br>伴随着默认的图形用户界面(GUI)的外观，打印和性能，Java平台在缩小平台差异和整合本地程序与Java程序的道路上已经走了很长一段路。
<p>Java平台标准版(Java SE)第6版，代号为Mustang(野马)，继续用新增的系统托盘功能，对JTable更好的打印支持和现在的Desktop API</p>
<p>(java.awt.Desktop)来填补这个空隙。本文描述了新的Desktop API，它们允许Java程序来和主机平台与特定文件类型相关联的默认应用程序进</p>
<p>行交互。为了更有效地描述这些API，本文也展示了一个简单的应用程序DesktopDemo。<br>Desktop 概述<br>这个新功能是由java.awt.Desktop类提供的。这个API取自桌面综合组件(JDIC)项目。这个项目的目标是&#8220;使以Java技术为基础的应用程序成为</p>
<p>桌面的一级公民&#8221;，实现无缝整合。特别的，新的Desktop API允许Java应用程序实现以下功能：<br>1.通过一个指定的统一资源定位符(URI)启动主机系统的默认浏览器<br>2.启动主机系统的默认邮件客户端<br>3.启动应用程序来打开，编辑或打印和这些应用程序相关联的文件</p>
<p>Desktop API使用主机操作系统的文件关联来启动和特定文件类型相关联的应用程序。例如，如果OpenDocument text(.odt)文件扩展名与</p>
<p>OpenOffice Writer应用程序相关联，你的Java应用程序就能够根据这个关联启动OpenOffice Writer来打开，编辑或者甚至输出.odt文件。依</p>
<p>靠你的主机系统，不同的应用程序可能会和不同的动作相关联。</p>
<p>运行DesktopDemo应用程序<br>DesktopDemo是使用Mustang的Desktop API的一个简单应用程序。这个程序有一个展示了完整API的主窗口，允许你做三件事：<br>1.通过一个指定的URI启动默认的浏览器<br>2.通过一个邮件接收者启动默认的邮件客户端<br>3.启动相关联的应用程序来打开，编辑或打印一个文件</p>
<p>图1显示了用户界面(UI)</p>
<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/turkeycock/177614/o_DesktopDemoUI.gif">
<p>你可以通过下载源程序和JAR文件来运行这个应用程序，把控制台转到工程的dist目录，在Mustang JDK环境下用以下的命令来运行：<br>&nbsp;&nbsp; java -jar DesktopDemo.jar</p>
<p>判定对Desktop API的支持<br>在启动浏览器，邮件客户端或者任何应用程序之前，DesktopDemo必须判定你的平台是否支持Desktop API。首先，DesktopDemo会禁用所有的文</p>
<p>本域和按钮。它会在判定你的平台支持它们以后再激活它们。<br>在展示了用户界面以后，应用程序的构造函数很快地用如下所示的代码禁用了这个应用程序的组件。<br>&nbsp;&nbsp;&nbsp; public DesktopDemo() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Initiate all GUI components.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initComponents();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Disable buttons that launch browser and email client. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Disable buttons that open, edit, and print files.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disableActions();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * Disable all graphical components until we know<br>&nbsp;&nbsp;&nbsp;&nbsp; * whether their functionality is supported.<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void disableActions() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtBrowserURI.setEnabled(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btnLaunchBrowser.setEnabled(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtMailTo.setEnabled(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btnLaunchEmail.setEnabled(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rbEdit.setEnabled(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rbOpen.setEnabled(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rbPrint.setEnabled(false);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtFile.setEnabled(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btnLaunchApplication.setEnabled(false);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ...</p>
<p>&nbsp;&nbsp;&nbsp; public javax.swing.JTextField txtBrowserURI;<br>&nbsp;&nbsp;&nbsp; public javax.swing.JButton btnLaunchBrowser;<br>&nbsp;&nbsp;&nbsp; public javax.swing.JTextField txtMailTo;<br>&nbsp;&nbsp;&nbsp; public javax.swing.JButton btnLaunchEmail;<br>&nbsp;&nbsp;&nbsp; public javax.swing.JRadioButton rbEdit;<br>&nbsp;&nbsp;&nbsp; public javax.swing.JRadioButton rbOpen;<br>&nbsp;&nbsp;&nbsp; public javax.swing.JRadioButton rbPrint;<br>&nbsp;&nbsp;&nbsp; public javax.swing.JTextField txtFile;<br>&nbsp;&nbsp;&nbsp; public javax.swing.JButton btnLaunchApplication;</p>
<p>用Desktop.isDesktopSupported()方法判定Desktop API是否可用。在Solaris操作系统和Linux平台上，这个API依赖于Gnome库。如果这些库不</p>
<p>可用，这个方法会返回false。在判定了系统支持Desktop API，也就是isDesktopSupported()方法返回true时，应用程序就会使用一个静态</p>
<p>(static)方法getDesktop()重新获得一个Desktop实例。<br>&nbsp;&nbsp;&nbsp; Desktop desktop = null;<br>&nbsp;&nbsp;&nbsp; // Before more Desktop API is used, first check <br>&nbsp;&nbsp;&nbsp; // whether the API is supported by this particular <br>&nbsp;&nbsp;&nbsp; // virtual machine (VM) on this particular host.<br>&nbsp;&nbsp;&nbsp; if (Desktop.isDesktopSupported()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desktop = Desktop.getDesktop();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...</p>
<p>如果你的应用程序没有在调用getDesktop()方法之前用isDesktopSupported()方法检查系统对API的支持，那就必须准备捕捉</p>
<p>UnsupportedOperationException异常，该异常会在你的应用程序请求一个Desktop实例而平台不支持的时候抛出。另外，如果你的应用程序在</p>
<p>一个没有键盘，鼠标或者监听器的环境(一个&#8220;无领导者&#8221;的环境)中运行，getdesktop()方法会抛出一个java.awt.HeadlessException异常。</p>
<p>一旦重新获得，Desktop实例允许你的应用程序浏览，发邮件，打开、编辑甚至打印文件或者URI，只要重新获得的Desktop实例支持这些动作。</p>
<p>每个这种动作被称为一个action，而每一个Desktop.Action枚举实例代表一个action：<br>BROWSE：代表一个通过主机浏览器执行的浏览动作<br>MAIL：代表一个通过默认邮件客户端执行的发邮件动作<br>OPEN：代表一个通过相关联的应用程序打开一种特定文件类型的打开动作<br>EDIT：代表一个通过相关联的应用程序编辑一种特定文件类型的编辑动作<br>PRINT：代表一个通过相关联的应用程序打印一种特定文件类型的打印动作</p>
<p>在调用这些动作之前，应用程序应该判定Desktop实例是否支持它们。这和判定Desktop实例是否可用是不同的。Desktop.isDesktopSupported</p>
<p>()方法告诉我们能否创建一个实例。一旦获得了一个Desktop对象，你可以查询这个实例来找出支持哪些特定的动作。如果Desktop对象不支持</p>
<p>特定的动作，或者Desktop API本身不被支持，DesktopDemo会简单地禁用受影响的那些图形组件。如图2所展示的，在禁用状态下这些组件不能</p>
<p>被用来调用Desktop功能。</p>
<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/turkeycock/177614/o_DesktopUnsupported.gif">
<p><br>使用一个新的Desktop实例，下面的代码检查了每个Desktop.Action的支持情况并且激活了适当的图形组件：<br>&nbsp;&nbsp;&nbsp; public DesktopDemo() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Before more Desktop API is used, first check <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // whether the API is supported by this particular <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // VM on this particular host.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Desktop.isDesktopSupported()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desktop = Desktop.getDesktop();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Now enable buttons for actions that are supported.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableSupportedActions();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * Enable actions that are supported on this host.<br>&nbsp;&nbsp;&nbsp;&nbsp; * The actions are the following: open browser, <br>&nbsp;&nbsp;&nbsp;&nbsp; * open email client, and open, edit, and print<br>&nbsp;&nbsp;&nbsp;&nbsp; * files using their associated application.<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void enableSupportedActions() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (desktop.isSupported(Desktop.Action.BROWSE)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtBrowserURI.setEnabled(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btnLaunchBrowser.setEnabled(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (desktop.isSupported(Desktop.Action.MAIL)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtMailTo.setEnabled(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btnLaunchEmail.setEnabled(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (desktop.isSupported(Desktop.Action.OPEN)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rbOpen.setEnabled(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (desktop.isSupported(Desktop.Action.EDIT)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rbEdit.setEnabled(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (desktop.isSupported(Desktop.Action.PRINT)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rbPrint.setEnabled(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rbEdit.isEnabled() || rbOpen.isEnabled() || rbPrint.isEnabled()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtFile.setEnabled(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btnLaunchApplication.setEnabled(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p>一旦应用程序判定了可支持的动作，它会激活适当的图形组件。如果所有组件都被激活，用户界面应该如图3所示：</p>
<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/turkeycock/177614/o_DesktopDemoUI.gif">
<p><br>打开浏览器<br>调用下面的实例方法会打开主机的默认浏览器：<br>&nbsp;&nbsp;&nbsp; public void browse(URI uri) throws IOException<br>因为DesktopDemo的用户界面组件只有在Desktop.Action被支持的情况下才会被激活，所以这个简单的示例程序不需要在调用browse()方法之前</p>
<p>再次检查支持情况。然而，在实际应用程序中，在每个调用之前检查支持情况可能会使程序更加健壮：<br>&nbsp;&nbsp;&nbsp; if (desktop.isSupported(Desktop.Action.BROWSE)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // launch browser<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; }</p>
<p>DesktopDemo为每个按钮添加了java.awt.event.ActionListener。当被激活时，Launch Browser按钮会通过它的ActionListener调用如下方法</p>
<p>：<br>&nbsp;&nbsp;&nbsp; private void onLaunchBrowser(java.awt.event.ActionEvent evt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URI uri = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uri = new URI(txtBrowserURI.getText());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desktop.browse(uri);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(IOException ioe) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioe.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(URISyntaxException use) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; use.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; }</p>
<p>browse()方法会抛出多种异常，包括当URI为空时抛出的NullPointerException，当BROWSE动作不被支持时抛出的</p>
<p>UnsupportedOperationException，当默认浏览器或者应用程序无法找到或者启动时抛出的IOException，以及当安全管理器拒绝调用时抛出的</p>
<p>SecurityException。</p>
<p>如果进展顺利，监听器会从图4中所示的相关联的文本域中重新获得文本，创建一个URI，然后调用browse()方法。上面的代码启动了你系统上</p>
<p>默认的浏览器来加载URI，如图5所示。</p>
<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/turkeycock/177614/o_DesktopLaunchBrowser.gif"> <img alt="" src="http://blog.csdn.net/images/blog_csdn_net/turkeycock/177614/o_DesktopBrowser.gif">
<p><br>发送邮件<br>如果动作被支持的话，应用程序能够启动主机的默认邮件客户端，通过调用Desktop的实例方法：<br>&nbsp;&nbsp;&nbsp; public void mail(URI uri) throws IOException</p>
<p>DesktopDemo有一个Launch Mail按钮的ActionListener。在这种情况下，监听器调用如下方法：<br>&nbsp;&nbsp;&nbsp; private void onLaunchMail(java.awt.event.ActionEvent evt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String mailTo = txtMailTo.getText();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URI uriMailTo = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (mailTo.length() &gt; 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uriMailTo = new URI("mailto", mailTo, null);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desktop.mail(uriMailTo);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desktop.mail();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(IOException ioe) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioe.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(URISyntaxException use) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; use.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; }</p>
<p>onLaunchMail()方法重新获得和文本域相关的邮件接收者，如果接收者存在就使用mailto模式参数创建URI，然后调用mail()方法。mail()方法</p>
<p>已经被重载，因此你可以通过使用或者不使用代表mailto接收者的URI来调用它(见图6)。</p>
<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/turkeycock/177614/o_DesktopLaunchEmail.gif">
<p>你可以不仅仅使用一个简单邮件接收者来创建URI。mailto模式也支持CC，BCC，SUBJECT和BODY字段。例如，下面的文本可以被用来创建一个</p>
<p>mailto URI。<br>&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#117;&#107;&#101;&#64;&#115;&#117;&#110;&#46;&#99;&#111;&#109;&#63;&#83;&#85;&#66;&#74;&#69;&#67;&#84;&#61;&#72;&#97;&#112;&#112;&#121;"><u><font color=#0000ff>mailto:duke@sun.com?SUBJECT=Happy</font></u></a> New Year!&amp;BODY=Happy New Year, Duke!<br>图7显示了结果：</p>
<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/turkeycock/177614/o_DesktopEmailClient.gif">
<p><br>当然，你也可以不使用参数调用mail()方法。在这种情况下，你的邮件客户端将会启动一个新的没有指定接收者、主题或者主体的邮件窗口。</p>
<p>打开，编辑和打印一个文件<br>Java应用程序可以分别使用Desktop对象的open()、edit()、print()方法通过和文件相关联的应用程序打开、编辑和打印文件。(见图8)而且，</p>
<p>DesktopDemo只有在Desktop实例支持的情况下允许这些动作，因此在这个应用程序的设定中，没有必要再检查这些支持情况。</p>
<img alt="" src="http://blog.csdn.net/images/blog_csdn_net/turkeycock/177614/o_DesktopLaunchApp.gif">
<p><br>每个DesktopDemo的单选按钮也都有它们自己的ActionListener。在这种情况下，每个监听器设置一个实例变量的值来代表最近选择的按钮相关</p>
<p>联的Desktop.Action：<br>&nbsp;&nbsp;&nbsp; Desktop.Action action;</p>
<p>&nbsp;&nbsp;&nbsp; private void onPrintAction(java.awt.event.ActionEvent evt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; action = Desktop.Action.PRINT;<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; private void onEditAction(java.awt.event.ActionEvent evt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; action = Desktop.Action.EDIT;<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; private void onOpenAction(java.awt.event.ActionEvent evt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; action = Desktop.Action.OPEN;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>当你按下Launch Default Application按钮时，它触发它自己的监听器，调用如下方法：<br>&nbsp;&nbsp;&nbsp; private void onLaunchDefaultApplication(java.awt.event.ActionEvent evt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = txtFile.getText();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File file = new File(fileName);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(action) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case OPEN:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desktop.open(file);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case EDIT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desktop.edit(file);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case PRINT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desktop.print(file);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (IOException ioe) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioe.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; }</p>
<p>这个方法判定哪个Desktop.Action被选择并且调用适当的Desktop的实例方法，open()，edit()或者print()。每个方法要求一个File参数用来</p>
<p>执行被请求的动作。</p>
<p>有趣的是，在相同的文件类型上的不同动作可能会被注册为不同的应用程序。例如，Firefox浏览器可能会执行OPEN操作，Emacs执行EDIT操作</p>
<p>，另一种不同的应用程序执行PRINT操作。你的主机桌面的关联用来决定应该调用哪个应用程序。这种操作桌面文件关联的能力对目前存在的</p>
<p>Mustang中的Desktop API来说还不可能，这样这些关联就只能通过与平台相关的工具来创建或改变了。</p>
<p>摘要<br>桌面整合是一个重要的Mustang主题。Mustang支持这个主题的一种方法是通过java.awt.Desktop API。这个API允许Java应用程序启动主机的默</p>
<p>认的浏览器和邮件客户端。另外，Java应用程序能够启动和文件相关的应用程序来打开、编辑和打印文件。尽管Java应用程序不能操作、创建</p>
<p>或者改变文件关联，Desktop API允许Java应用程序启动默认的相关联的应用程序。这篇文章提供了一个示范这些API的示例程序，你可以从站</p>
<p>点上下载这个程序。</p>
<p>注意：任何Java SE平台规范的增加或改进由JSR 270专家组回顾和正式批准。</p>
<p>原文地址：<a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/mustang/desktop_api/"><u><font color=#810081>http://java.sun.com/developer/technicalArticles/J2SE/Desktop/mustang/desktop_api/</font></u></a><br><br>-----------------------------------------------------------------------------------------<br><br>五、<a name=t5>使用Compiler API</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#top">top</a> <br><br>现在我们可以用JDK6 的Compiler API(JSR 199)去动态编译Java源文件，Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码，有点动态语言的特征。这个特性对于某些需要用到动态编译的应用程序相当有用， 比如JSP Web Server，当我们手动修改JSP后，是不希望需要重启Web Server才可以看到效果的，这时候我们就可以用Compiler API来实现动态编译JSP文件，当然，现在的JSP Web Server也是支持JSP热部署的，现在的JSP Web Server通过在运行期间通过Runtime.exec或ProcessBuilder来调用javac来编译代码，这种方式需要我们产生另一个进程去做编译工作，不够优雅而且容易使代码依赖与特定的操作系统；Compiler API通过一套易用的标准的API提供了更加丰富的方式去做动态编译,而且是跨平台的。 下面代码演示了Compiler API的使用</p>
<p>public class CompilerAPITester {<br>&nbsp;&nbsp;&nbsp; private static String JAVA_SOURCE_FILE = "DynamicObject.java";<br>&nbsp;&nbsp;&nbsp; private static String JAVA_CLASS_FILE = "DynamicObject.class";<br>&nbsp;&nbsp;&nbsp; private static String JAVA_CLASS_NAME = "DynamicObject";<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; generateJavaClass();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将产生的类文件拷贝到程序的ClassPath下面,下面这一行代码是特定于Windows＋IntelliJ IDEA 6.0项目,不具有移植性<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Runtime.getRuntime().exec("cmd /c copy "+JAVA_CLASS_FILE+" classes\\production\\JDK6Features");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterable&lt;? extends JavaFileObject&gt; sourcefiles = fileManager.getJavaFileObjects(JAVA_SOURCE_FILE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compiler.getTask(null, fileManager, null, null, null, sourcefiles).call();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileManager.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName(JAVA_CLASS_NAME).newInstance();//创建动态编译得到的DynamicObject类的实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void generateJavaClass(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileWriter fw = new FileWriter(JAVA_SOURCE_FILE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedWriter bw = new BufferedWriter(fw);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bw.write("public class "+JAVA_CLASS_NAME+"{");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bw.newLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bw.write("public "+JAVA_CLASS_NAME+"(){System.out.println(\"In the constructor of DynamicObject\");}}");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bw.flush();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bw.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>程序运行后，会产生DynamicObject.java和DynamicObject.class两个文件，并在控制台输出</p>
<p>In the constructor of DynamicObject<br><br>--------------------------------------------------------------------------------<br><br>六、<a name=t6>轻量级Http Server </a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#top">top</a> <br><br>JDK6提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持Http和Https协议,提供了HTTP1.1的部分实现，没有被实现的那部分可以通过扩展已有的Http Server API来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给HttpHandler实现类的回调方法.下面代码演示了怎样创建自己的Http Server</p>
<p>/**<br>&nbsp;* Created by IntelliJ IDEA.<br>&nbsp;* User: Chinajash<br>&nbsp;* Date: Dec 30, 2006<br>&nbsp;*/<br>public class HTTPServerAPITester {<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServer hs = HttpServer.create(new InetSocketAddress(8888),0);//设置HttpServer的端口为8888<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hs.createContext("/chinajash", new MyHandler());//用MyHandler类内处理到/chinajash的请求<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hs.setExecutor(null); // creates a default executor<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hs.start();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>class MyHandler implements HttpHandler {<br>&nbsp;&nbsp; public void handle(HttpExchange t) throws IOException {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is = t.getRequestBody();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String response = "&lt;h3&gt;Happy New Year 2007!--Chinajash&lt;/h3&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.sendResponseHeaders(200, response.length());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStream os = t.getResponseBody();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.write(response.getBytes());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.close();<br>&nbsp;&nbsp; }<br>}</p>
<p>运行程序后,在浏览器内输入<a href="http://localhost:8888/chinajash">http://localhost:8888/chinajash</a>,浏览器输出</p>
<p>Happy New Year 2007!--Chinajash<br><br>-------------------------------------------------------------------------------------------<br><br>七、<a name=t7>用Console开发控制台程序</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#top">top</a> <br><br>JDK6中提供了java.io.Console类专用来访问基于字符的控制台设备. 你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳. 但我们不总是能得到可用的Console, 一个JVM是否有可用的Console依赖于底层平台和JVM如何被调用. 如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实例. 下面代码演示了Console类的用法:</p>
<p>/**<br>&nbsp;* @author chinajash<br>&nbsp;*/<br>public class ConsoleTest {<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console console = System.console();//获得Console实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(console!=null){//判断console是否可用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String user = new String(console.readLine("Enter user:")); //读取整行字符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String pwd = new String(console.readPassword("Enter passowrd:")); //读取密码,密码输入时不会显示<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.printf("User is:"+user+"\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.printf("Password is:"+pwd+"\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Console is unavailable");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>如果在NetBean5.5里面运行上面程序,会输出</p>
<p>Console is unavailable</p>
<p>表示Console不可获得,那是因为JVM不是在命令行中被调用的或者输入输出被重定向了. 但是如果我们在命令行中运行上面程序(java ConsoleTest),程序能够获得Console实例,并执行如下:</p>
<p>Enter user:chinajash<br>Enter passowrd:<br>User is:chinajash<br>Password is:chinajash</p>
<p>在这里可以看到输入密码时,控制台时不显示这些密码字符的,但是程序可以得到输入的密码字符串,这与Linux下面输入密码的情况是一样的</p>
<p><br>&nbsp;</p>
<img src ="http://www.blogjava.net/hyq0077/aggbug/121120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyq0077/" target="_blank">hyq</a> 2007-05-31 12:29 <a href="http://www.blogjava.net/hyq0077/articles/121120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>What's New in Java SE 6（转）</title><link>http://www.blogjava.net/hyq0077/articles/jdk6.html</link><dc:creator>hyq</dc:creator><author>hyq</author><pubDate>Thu, 31 May 2007 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/hyq0077/articles/jdk6.html</guid><wfw:comment>http://www.blogjava.net/hyq0077/comments/121113.html</wfw:comment><comments>http://www.blogjava.net/hyq0077/articles/jdk6.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyq0077/comments/commentRss/121113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyq0077/services/trackbacks/121113.html</trackback:ping><description><![CDATA[<a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/beta2.html">http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/beta2.html</a><br>
<ol><strong>
    <li>Web Services</strong><br>All developers get first-class support for writing XML web service client applications. No messing with the plumbing: You can expose your APIs as .NET interoperable web services with a <a href="http://blogs.sun.com/roller/page/dannycoward/20060227"><u><font color=#0000ff>simple annotation</font></u></a>. Not your style? Want to handle the XML directly? Knock yourself out: Java SE 6 adds new parsing and XML to Java object-mapping APIs, previously only available in <a href="http://java.sun.com/javaee/index.jsp"><u><font color=#0000ff>Java EE</font></u></a> platform implementations or the <a href="http://java.sun.com/webservices/jwsdp/index.jsp"><u><font color=#0000ff>Java Web Services Pack</font></u></a>.<br><br><strong>
    <li>Scripting</strong><br>You can now mix in <a href="http://java.sun.com/javascript/"><u><font color=#0000ff>JavaScript</font></u></a> technology source code, useful for prototyping. Also useful when you have teams with a variety of skill sets. More advanced developers can plug in their own scripting engines and mix their favorite scripting language in with Java code as they see fit.<br>
    <p><big>P</big>erhaps <big>Y</big>ou <big>T</big>houg<big>h</big>t y<big>o</big>u could<big>n</big>'t program with a scripting language and Java togethe<big>r</big>. Which will yo<big>u</big> <big>b</big>e tr<big>y</big>ing ? </p>
    <li><strong>Database</strong><br>For a great out-of-the-box development experience with database applications, the Java SE 6 development kit &#8211; though not the Java Runtime Environment (JRE) &#8211; co-bundles the all-Java JDBC database, <a href="http://developers.sun.com/prodtech/javadb/"><u><font color=#0000ff>Java DB</font></u></a> based on <a href="http://db.apache.org/derby/" target=_blank><u><font color=#0000ff>Apache Derby</font></u></a>. No more need to find and configure your own JDBC database when developing a database application! Developers will also get the updated JDBC 4.0, a well-used API with many <a href="http://weblogs.java.net/blog/lancea/" target=_blank><u><font color=#0000ff>important improvements</font></u></a>, such as special support for XML as an SQL datatype and better integration of Binary Large OBjects (BLOBs) and Character Large OBjects (CLOBs) into the APIs. <br><br><strong>
    <li>More Desktop APIs</strong><br>Much has been said about this <a href="http://weblogs.java.net/blog/chet/archive/2006/02/these_are_some.html" target=_blank><u><font color=#0000ff>spoonful of sugar</font></u></a> (to go with the Desktop team's <a href="http://weblogs.java.net/blog/zixle/archive/2006/03/free_chocolate.html" target=_blank><u><font color=#0000ff>cake</font></u></a>), so we will only skim a little. GUI developers get a large number of new tricks to play like the ever popular yet newly incorporated SwingWorker utility to help you with threading in GUI apps, <code>JTable</code> sorting and filtering, and a new facility for quick splash screens to quiet impatient users. <br><br><strong>
    <li>Monitoring and Management</strong><br>The really big deal here is that you don't need do anything special to the startup to be able to attach on demand with any of the <a href="http://blogs.sun.com/roller/page/dannycoward/20060310" target=_blank><u><font color=#0000ff>monitoring and management tools</font></u></a> in the Java SE platform. Java SE 6 adds yet more diagnostic information, and we co-bundled the infamous memory-heap analysis tool <a href="http://java.sun.com/javase/6/docs/tooldocs/share/jhat.html"><u><font color=#0000ff>Jhat</font></u></a> for forensic explorations of those core dumps.<br><br><!-- BEGIN ENHANCED QUOTE COMPONENT-->
    <table class=grey3 cellSpacing=0 cellPadding=4 width=180 align=right border=0>
        <tbody>
            <tr>
                <td class=white>
                <div class=sp2>&nbsp;</div>
                </td>
                <td width="100%">
                <div class=pad8>"For those of you deafened by your screaming inner geek, roll up your sleeves and give it a try." <br><span class=sp8>&nbsp;</span>
                <table class=white cellSpacing=0 cellPadding=0 width="100%" border=0>
                    <tbody>
                        <tr>
                            <td><img height=4 alt=" " src="http://java.sun.com/im/a.gif" width=1 border=0></td>
                        </tr>
                    </tbody>
                </table>
                <div class=sp8>&nbsp;</div>
                <span class=smaller><strong>Danny Coward</strong><br>Java SE Platform Lead</span></div>
                </td>
            </tr>
        </tbody>
    </table>
    <span class=sp10>&nbsp;</span><br><!-- END ENHANCED QUOTE COMPONENT --><strong>
    <li>Compiler Access</strong><br>Really aimed at people who create tools for Java development and for frameworks like JavaServer Pages (JSP) or Personal Home Page construction kit (PHP) engines that need to generate a bunch of classes on demand, the compiler API opens up programmatic access to <code>javac</code> for in-process compilation of dynamically generated Java code. The compiler API is not directly intended for the everyday developer, but for those of you deafened by your screaming inner geek, <a href="http://blogs.sun.com/ahe?entry=somebody_noticed_jsr_199"><u><font color=#0000ff>roll up your sleeves</font></u></a> and give it a try. And the rest of us will happily benefit from the <a href="http://www.netbeans.org/community/releases/50/index.html" target=_blank><u><font color=#0000ff>tools</font></u></a> and the improved Java frameworks that use this. <br><br><strong>
    <li>Pluggable Annotations</strong><br>It is becoming a running joke in Java technology circles, at least some that contain us, that for every <a href="http://blogs.sun.com/roller/page/gbracha?entry=annotations_toward_pluggable_types"><u><font color=#0000ff>wished-for feature</font></u></a> missing in Java technology, there's a budding <a href="http://wiki.java.net/bin/view/Javapedia/Annotations" target=_blank><u><font color=#0000ff>annotation</font></u></a> that will solve the problem. Joke no more, because Java tool and framework vendors can put a different smile on your face, defining their own annotations and have core support for plugging in and executing the processors that do the heavy lifting that can make custom annotations so cool. <br><br><strong>
    <li>Desktop Deployment</strong><br>Those of you deploying applications to the desktop will soon discover that it's a tale of a large number of <a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/"><u><font color=#0000ff>smaller changes</font></u></a> that add up to a big difference to existing applications: better platform look-and-feel in Swing technology, LCD text rendering, and snappier GUI performance overall. Java applications can integrate better with the native platform with things like new access to the platform's System Tray and Start menu. At long last, Java SE 6 unifies the Java Plug-in technology and Java WebStart engines, which just makes sense. Installation of the Java WebStart application got a much needed <a href="http://weblogs.java.net/blog/stanleyh/archive/2005/04/deployment_good_1.html" target=_blank><u><font color=#0000ff>makeover</font></u></a>. <br><br><strong>
    <li>Security</strong><br>You can have all the security features you like in the platform — and this release adds a few more, like the <a href="http://java.sun.com/webservices/docs/2.0/xmldsig/api/"><u><font color=#0000ff>XML-Digital Signature (XML-DSIG) APIs</font></u></a> for creating and manipulating digital signatures — but if you don't have well supported security administrators, your security may be at risk. So Java SE 6 has simplified the job of its security administrators by providing various new ways to access platform-native security services, such as native Public Key Infrastructure (PKI) and cryptographic services on Microsoft Windows for secure authentication and communication, Java Generic Security Services (Java GSS) and Kerberos services for authentication, and access to LDAP servers for authenticating users. <br><br><strong>
    <li>The -lities: Quality, Compatibility, Stability</strong><br>You probably knew that Sun has done regular feature releases of the Java SE platform over the last 10 years. So we certainly feel like we've built up some expertise in this area, such as the ever growing 80,000 test cases and several million lines of code testing <a href="http://blog.sun.com/roller/page/pcurran/20060201"><u><font color=#0000ff>conformance</font></u></a> (being just one aspect of our testing activity). You probably noticed that, unlike the last release, people have been downloading binary <a href="http://download.java.net/jdk6/binaries/" target=_blank><u><font color=#0000ff>snapshots</font></u></a> for the last 20 (not just 6) months. And what's more, they've been filing bugs. So, before we even got to <a href="http://java.sun.com/javase/6/"><u><font color=#0000ff>beta</font></u></a>, we'd fixed a number of quality and regression issues. Doesn't that add up to a better product? Oh, and by the way, <a href="http://java.sun.com/javase/technologies/performance.jsp"><u><font color=#0000ff>performance</font></u></a> is looking better than J2SE 5.0. </li>
</ol>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、Web Services. 优先支持编写 XML web service 客户端程序。你可以用过简单的annotaion将你的API发布成.NET交互的web services. Mustang 添加了新的解析和 XML 在 Java object-mapping APIs中, 之前只在Java EE平台实现或者Java Web Services Pack中提供.<br>　　2、Scripting. 现在你可以在Java源代码中混入JavaScript了，这对开发原型很有有用，你也可以插入自己的脚本引擎。&nbsp; </p>
<p>　　3、Database. Mustang 将联合绑定 Java DB (Apache Derby). JDBC 4.0 增加了许多特性例如支持XML作为SQL数据类型，更好的集成Binary Large OBjects (BLOBs) 和 Character Large OBjects (CLOBs)&nbsp;. </p>
<p>　　4、More Desktop APIs. GUI 开发者可以有更多的技巧来使用 SwingWorker utility ，以帮助GUI应用中的多线程。, JTable 分类和过滤，以及添加splash闪屏。 </p>
<p>　　5、Monitoring and Management. Mustang 添加更多的诊断信息，绑定了不是很知名的 memory-heap 分析工具Jhat 来查看内核导出。 </p>
<p>　　6、Compiler Access.&nbsp; compiler API提供编程访问javac，可以实现进程内编译，动态产生Java代码。&nbsp; </p>
<p>　　7、Pluggable Annotation. Java tool和framework 提供商可以定义自己的 annotations&nbsp;，并且内核支持自定义annotation的插件和执行处理器&nbsp; </p>
<p>　　8、Desktop Deployment. Swing拥有更好的 look-and-feel&nbsp;, LCD 文本呈现, 整体GUI性能的提升。Java应用程序可以和本地平台更好的集成，例如访问平台的系统托盘和开始菜单。Mustang将Java插件技术和Java Web Start引擎统一了起来。 </p>
<p>　　9、Security. XML-数字签名(XML-DSIG) APIs 用于创建和操纵数字签名); 新的方法来访问本地平台的安全服务，例如本地Microsoft Windows for secure authentication and communicationnative 的Public Key Infrastructure (PKI)&nbsp;和 cryptographic services， Java Generic Security Services (Java GSS)&nbsp;和 Kerberos services for authentication,&nbsp;以及访问 LDAP servers 来认证用户. </p>
<p>　　10、The -ilities: 质量，兼容性，稳定性。 80,000 test cases&nbsp;和数百万行测试代码(只是测试活动中的一个方面). Mustang 的快照发布已经被下载15个月了，每一步中的Bug都被修复了，表现比J2SE 5还要好。</p>
<img src ="http://www.blogjava.net/hyq0077/aggbug/121113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyq0077/" target="_blank">hyq</a> 2007-05-31 11:47 <a href="http://www.blogjava.net/hyq0077/articles/jdk6.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>