<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>启蒙网</title>
    <description></description>
    <link>http://laies.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>JProfiler使用入门（一）——准备工作 </title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/168964" style="color:red;">http://laies.javaeye.com/blog/168964</a>&nbsp;
          发表时间: 2008年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JProfiler是一个全功能的Java剖析工具（profiler），主要用于检查和跟踪系统（限于Java开发的）的性能。<br /><br /> <br /><br />JProfiler可以通过时时的监控系统的内存使用情况，随时监视垃圾回收，线程运行状况等手段，从而很好的监视JVM运行情况及其性能。它把CPU、线程和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合功能。<br /><br /><br /><br /><br />      本文旨在通过简单的例子带领大家进入JProfiler的世界。我也是刚刚学习哦，大家要是有鸡蛋的话留着吃就好了，现在鸡蛋好贵的^o^  <br /><br />1、建立JBoss测试用例<br /><br />打开JProfiler显示QuickStart对话框，选择An application server,locally or remotely，<br /> <br />2、选择服务器<br /><br />点击Next进入“服务器选择”对话框，选择JBoss 4.x，如下图<br /><br /> <br />3、选择启动脚本<br /><br />点击Next进入“启动脚本选择”对话框，输入JBoss启动脚本(run.bat)的路径，<br /><br />4、选择JVM的厂商、版本和模式<br /><br />点击Next进入“JVM选择”对话框，我们选择Sun公司的hotspot 1.4.2，<br /><br /> <br />5、输入JProfiler的端口号<br /><br />点击Next进入“JProfiler端口输入”对话框，我们保持默认不变，<br /> <br /><br /> 6、选择JBoss是否在连接到JProfiler后再启动JBoss<br /><br />点击Next进入“JBoss是否在连接到JProfiler后再启动”页面，这里我们保持默认选择，即在JBoss连接到JProfiler后再启动JBoss<br /><br /> <br /><br /> 7、确认配置<br /><br />点击Next进入“确认配置”对话框，确认配置是否正确，如下图，如果不正确点击Back到相应对话框进行修改。<br /><br />  <br /><br />8、配置完成<br /><br />点击Next进入“完成配置”对话框，点击finish完成配置，并启动JBoss服务器，控制台界面
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/168964#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Mar 2008 10:11:38 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/168964</link>
        <guid>http://laies.javaeye.com/blog/168964</guid>
      </item>
      <item>
        <title>获取Java类中的变量名的字串</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/157076" style="color:red;">http://laies.javaeye.com/blog/157076</a>&nbsp;
          发表时间: 2008年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在类中定义了一个属性abc，如何获取这个变量的abc的名字串呢？也就是说怎么知道abc这个变量的名字是abc，这个问题比较的好玩。 <br /><br />这个是偶以前在一开发中遇到的一个比较有趣的问题，找了半天的资料加下偶辛勤的思考，终于找到的解决方法。用反射～～～ <br /><br />java提供了很强大的反射机制，可以说比动态语言还动态。但是这个东东平时的应用不是很多的说。 <br /><br />现提供一个可以动态获取对象中的变量的变量名称的方法： <br /><br />public class MyTools { <br />public static void setAllComponentsName(Object f) { <br />// 获取f对象对应类中的所有属性域 <br />Field[] fields = f.getClass().getDeclaredFields(); <br />for(int i = 0 , len = fields.length; i &lt; len; i++) { <br />// 对于每个属性，获取属性名 <br />String varName = fields[i].getName(); <br />try { <br />// 获取原来的访问控制权限 <br />boolean accessFlag = fields[i].isAccessible(); <br />// 修改访问控制权限 <br />fields[i].setAccessible(true); <br />// 获取在对象f中属性fields[i]对应的对象中的变量 <br />Object o = fields[i].get(f); <br />System.out.println("传入的对象中包含一个如下的变量：" + varName + " = " + o); <br />// 恢复访问控制权限 <br />fields[i].setAccessible(accessFlag); <br />} catch (IllegalArgumentException ex) { <br />ex.printStackTrace(); <br />} catch (IllegalAccessException ex) { <br />ex.printStackTrace(); <br />} <br />} <br />} <br /><br />public static void main(String[] args) <br />{ <br />// 测试代码用来获取一个JLabel中声名的所有的属性名和其属性变量 <br />setAllComponentsName(new JLabel("测试")); <br />} <br />} <br /><br />fields[i].setAccessible(true);这句主要是因为私有的变量在对象外是无法访问的，通过这个设置就可以改变私有变量的访问权，还真的有点恐怖，当偶把这个解决方法告诉Boss的时候，Boss差点吐血，私有的都能访问了，还有什么安全可言？ <br /><br />不过了，有安全就有特权，所以由于能很好的解决问题还是被采纳了，嘻嘻～～～ <br /><br />Object o = fields[i].get(f);这句的作用就是取得传入对象f中类的属性fields[i]对应的真实的属性变量，说的有点别扭，比如有一个类A中有一个int abc的属性，并且我们有两个A类的对象a1，a2，那么当我们用fields[i].get(a1)的时候得到的将是对象a1中的具体的abc属性，而我们用fields[i].get(a2)的时候得到的将是对象a2中的具体的abc属性。 <br /><br />最后是用一个main方法测试了一个JLabel对象，打印出了JLabel中声名的所有的变量名，并输出了其对应的变量的值。结果如下： <br /><br />传入的对象中包含一个如下的变量：uiClassID = LabelUI <br />传入的对象中包含一个如下的变量：mnemonic = 0 <br />传入的对象中包含一个如下的变量：mnemonicIndex = -1 <br />传入的对象中包含一个如下的变量：text = 测试 <br />传入的对象中包含一个如下的变量：defaultIcon = null <br />传入的对象中包含一个如下的变量：disabledIcon = null <br />传入的对象中包含一个如下的变量：disabledIconSet = false <br />传入的对象中包含一个如下的变量：verticalAlignment = 0 <br />传入的对象中包含一个如下的变量：horizontalAlignment = 10 <br />传入的对象中包含一个如下的变量：verticalTextPosition = 0 <br />传入的对象中包含一个如下的变量：horizontalTextPosition = 11 <br />传入的对象中包含一个如下的变量：iconTextGap = 4 <br />传入的对象中包含一个如下的变量：labelFor = null <br />传入的对象中包含一个如下的变量：LABELED_BY_PROPERTY = labeledBy
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/157076#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 Jan 2008 20:09:37 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/157076</link>
        <guid>http://laies.javaeye.com/blog/157076</guid>
      </item>
      <item>
        <title>throw与throws区别</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/157075" style="color:red;">http://laies.javaeye.com/blog/157075</a>&nbsp;
          发表时间: 2008年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这两者虽然看起来只有一个s的区别，但是作用完全不一样 <br />/////java处理异常方式/////////////////////////////// <br />在java代码中如果发生异常的话，jvm会抛出异常对象，导致程序代码中断，这个时候jvm在做的操作就是：创建异常对象，然后抛出，比如： <br /><br />int i= 1； <br />int j = 0； <br />int res = 0； <br />res = i/j；//除0错误 <br />System.out.println(res); <br /><br />这5句代码运行到第四句会中断，因为jvm抛出了异常 <br /><br />////throw的作用///////////////////////////////////////// <br />手动抛出异常 <br /><br />但是有时候有些错误在jvm看来不是错误，比如说 <br />int age = 0; <br />age = -100; <br />System.out.println(age); <br />很正常的整形变量赋值，但是在我们眼中看来就不正常，谁的年龄会是负的呢。 <br />所以我们需要自己手动引发异常，这就是throw的作用 <br />int age = 0; <br />age = -100; <br />if(age&lt;0) <br />{ <br />Exception e = new Exception("throw exception");//创建异常对象 <br />throw e;//抛出异常 <br />} <br />System.out.println(age); <br /><br />////throws的作用/////////////////////////////////// <br />声明方法可能回避的异常 <br /><br />有异常被抛出了，就要做处理，所以java中有try-catch <br />可是有时候一个方法中产生了异常，但是不知道该怎么处理它，那么就放着不管，当有异常抛出时会中断该方法，而异常被抛到这个方法的调用者那里。这个有点像下属处理不了的问题就交到上司手里一样，这种情况称为回避异常 <br />但是这使得调用这个方法就有了危险，因为谁也不知道这个方法什么时候会丢一个什么样的异常给调用者，所以在定义方法时，就需要在方法头部分使用throws来声明这个方法可能回避的异常 <br />void fun()throws IOException,SQLException <br />{ <br />... <br />} <br />这表示 fun方法可能会丢两个异常出来，那么在调用fun的时候就会做好准备，比如可以这样 <br />try <br />{ <br />fun(); <br />}catch(IOException e) <br />{ <br />}catch(SQLException e) <br />{ <br />}
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/157075#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 Jan 2008 20:08:51 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/157075</link>
        <guid>http://laies.javaeye.com/blog/157075</guid>
      </item>
      <item>
        <title>开启mysql远程连接功能</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/139885" style="color:red;">http://laies.javaeye.com/blog/139885</a>&nbsp;
          发表时间: 2007年11月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp; 1、进入mysql，创建一个新用户xuys：
<p>&nbsp;&nbsp;&nbsp; 格式：grant 权限 on 数据库名.表名 用户@登录主机 identified by &quot;用户密码&quot;;<br />
grant select,update,insert,delete on *.* to xuys@192.168.88.234 identified by &quot;xuys1234&quot;;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 查看结果，执行：<br />
&nbsp;&nbsp; use mysql;<br />
&nbsp;&nbsp; select host,user,password from user;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 可以看到在user表中已有刚才创建的xuys用户。host字段表示登录的主机，其值可以用IP，也可用</p>
<p>主机名，<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 将host字段的值改为%就表示在任何客户端机器上能以xuys用户登录到mysql服务器，建议在开发时</p>
<p>设为%。&nbsp;&nbsp; <br />
&nbsp;&nbsp; update user set host = &rsquo;%&rsquo; where user = &rsquo;xuys&rsquo;;</p>
<p>2、 ./mysqladmin -uroot -ppwd reload<br />
./mysqladmin -uroot -ppwd shutdown</p>
<p>3、./mysqld_safe --user=root &amp;</p>
<p>&nbsp;&nbsp;&nbsp; 记住：对授权表的任何修改都需要重新reload，即执行第3步。</p>
<p>&nbsp;&nbsp;&nbsp; 如果经过以上3个步骤还是无法从客户端连接，请执行以下操作，在mysql数据库的db表中插入一条记录</p>
<p>：<br />
use mysql;<br />
insert into db </p>
<p>values(&rsquo;192.168.88.234&rsquo;,&rsquo;%&rsquo;,&rsquo;xuys&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;,&rsquo;Y&rsquo;);<br />
update db set host = &rsquo;%&rsquo; where user = &rsquo;xuys&rsquo;;</p>
<p>&nbsp;&nbsp;&nbsp; 重复执行上面的第2、3步。<br />
<br />
用IDE工具更方便,在EMS MySQL中，可以添加一个可以远程访问的用户就可以了，添加时，主机填%就可以了，然后选择下面的权限列表，如图:<strong></strong><br />
<img src="http://www.ajax2.cn/blog/attachment/Mon_0703/2_BwOHi1yTb0zdNQx.jpg" border="0" onclick="if(this.width&gt;=200) window.open('http://www.ajax2.cn/blog/attachment/Mon_0703/2_BwOHi1yTb0zdNQx.jpg');" onload="if(this.width&gt;'200')this.width='200';if(this.height&gt;'300')this.height='300';" alt="" width="200" /><br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/139885#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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, 12 Nov 2007 11:28:45 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/139885</link>
        <guid>http://laies.javaeye.com/blog/139885</guid>
      </item>
      <item>
        <title>JAVA读写word文件</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/137376" style="color:red;">http://laies.javaeye.com/blog/137376</a>&nbsp;
          发表时间: 2007年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1。读取word文件有两种方法，用jacob包，可以修改生成word文件内容。如果只读取word里的文本内容的话，可以用poi读取word文件，先到<a href="http://www.ibiblio.org/maven2/org/textmining/tm-extractors/">http://www.ibiblio.org/maven2/org/textmining/tm-extractors/</a>下载tm-extractors-0.4.jar包</p>
<p>2。读取word里的文本内容的示列代码</p>
<p>&nbsp;&nbsp;&nbsp; import java.io.*; <br />
&nbsp;&nbsp;&nbsp; import org.textmining.text.extraction.WordExtractor;</p>
<p>&nbsp;&nbsp;&nbsp; public class TestPoi { <br />
&nbsp;&nbsp;&nbsp; public TestPoi() { <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) throws Exception <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp; FileInputStream in = new FileInputStream (&quot;D:/szqxjzhbase/doc/修改后/2001-2005年/重大致灾暴雨/20050819-20/技术总结/2005年8月20日一次大暴雨过程低空急流脉动与强降水关系分析 .doc&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; FileInputStream in = new FileInputStream (&quot;D:/szqxjzhbase/技术测试/新建 Microsoft Word 文档.doc&quot;);<br />
&nbsp;&nbsp;&nbsp; WordExtractor extractor = new WordExtractor(); <br />
&nbsp;&nbsp;&nbsp; System.out.println(in.available());<br />
&nbsp;&nbsp;&nbsp; String str = extractor.extractText(in); <br />
//&nbsp;&nbsp;&nbsp; System.out.println(&quot;the result length is&quot;+str.length()); <br />
&nbsp;&nbsp;&nbsp; System.out.println(str); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
</p>
<p>3。问题：有时候有图片读的时候会报个错，但在图片前面加个回车符号就好了，可能与这个包的内部机制有关</p>
<p><font color="#ff0000">写文件后续&hellip;&hellip;</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/137376#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 01 Nov 2007 16:21:45 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/137376</link>
        <guid>http://laies.javaeye.com/blog/137376</guid>
      </item>
      <item>
        <title>java生成exe打包工具exe4j</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/137373" style="color:red;">http://laies.javaeye.com/blog/137373</a>&nbsp;
          发表时间: 2007年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="left"><span style="FONT-SIZE: 9pt; COLOR: #333333"><span style="FONT-SIZE: 9pt; COLOR: #333333"><font size="3">exe4j.exe下载地址: </font><a href="http://download.ej-technologies.com/exe4j/exe4j_windows_4_0_1.exe" target="_blank"><font size="3">http://download.ej-technologies.com/exe4j/exe4j_windows_4_0_1.exe</font></a><br />
</span></span></p>
<p align="center"><span style="FONT-SIZE: 9pt; COLOR: #333333"><font size="3" color="#0000ff"></font></span></p>
<p align="center"><span style="FONT-SIZE: 9pt; COLOR: #333333"><font size="3">第一次安装时会出现下面的对话框：<br />
</font></span></p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s6.album.sina.com.cn/pic/4412ae2502000f7h" target="_blank"><font size="3"></font></a></center>
<p forimg="1" align="center"><img class="blogimg" title="点击在新窗口打开图片" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/25d506ede0788ad2b31cb110.jpg" border="0" alt="" /></p>
<p><br />
它要求系统有1.5版本以上的JDK，点Download在线下载，如果你的机器上有JDK，点Locate找到你机器上已安装的JDK目录下/bin/java.exe就可以进行安装了。<br />
下面就安装过程详细说明一下：<br />
第1步，默认即可。<br />
第2步，如果已经有制作好的jar文件，则下面一个&quot;JAR in EXE&quot;。<br />
对于打包jar文件，在eclipse中右击项目选导出即可，不会制作jar文件可以给我留言<br />
</p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s11.album.sina.com.cn/pic/4412ae2502000f8a" target="_blank"></a></center>
<p forimg="1" align="center"><img class="blogimg" title="点击在新窗口打开图片" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/cecc87ef44054a30acafd510.jpg" border="0" alt="" /></p>
<p><br />
第3步，上面是项目名称，可随便填写，下面一个写出你想要将打包后的exe文件输出的目录：<br />
</p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s12.album.sina.com.cn/pic/4412ae2502000f8b" target="_blank"></a></center>
<div forimg="1" align="center"><img class="blogimg" title="点击在新窗口打开图片" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/aa9afefbb61a6c244f4aea11.jpg" border="0" alt="" /></div>
<p><br />
第4步，由于我的演示程序是图形的，所以选第一个，如果你的程序是控制台的，则选择第二个，Executable name写你将要生成的exe文件的名字，Icon File可以选择生成文件的图标<br />
</p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s1.album.sina.com.cn/pic/4412ae2502000f8c" target="_blank"></a></center>
<div forimg="1" align="center"><img class="blogimg" title="点击在新窗口打开图片" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/63e39d58abb26d87800a1811.jpg" border="0" alt="" /></div>
<p><br />
第5步，首先，单击绿色的&quot;+&quot;号，在弹出的窗口中点Archive，然后找到起初已经做好的jar文件，&quot;OK&quot;后返回，在下面的Class Path里就出现jar文件路径后，再在上面Main Class栏内点击找到main所在的类，这一步即算完成：<br />
</p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s2.album.sina.com.cn/pic/4412ae2502000f8d" target="_blank"></a></center>
<div forimg="1" align="center"><img class="blogimg" title="点击在新窗口打开图片" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/25d506ede07e8ad2b31cb112.jpg" border="0" alt="" /></div>
<p><br />
第6步，你系统的JRE版本，上面填个1.3，下面填1.6：<br />
</p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s3.album.sina.com.cn/pic/4412ae2502000f8e" target="_blank"></a></center>
<div forimg="1" align="center"><img class="blogimg" title="点击在新窗口打开图片" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/348e3a097838ada92eddd412.jpg" border="0" alt="" /></div>
<p><br />
当然，这样配置的程序只能在安装有JRE的机器上执行，发布时总要考虑的问题就是用户是否有能力在自己机器上安装JRE，总不能发布一个程序还要用户自己安装个JRE吧，下面我就介绍如何将JDK环境变量动态打包到exe中，在这里单击advanced options，选择search sequence。如图：<br />
</p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s4.album.sina.com.cn/pic/4412ae2502000f7r" target="_blank"></a></center>
<div forimg="1" align="center"><img class="blogimg" title="点击在新窗口打开图片" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/29e9983f099aa5c47d1e7112.jpg" border="0" alt="" /></div>
<p><br />
首先把JRE复制到exe文件输出的目录里，我用的是c:\xaocker\，在弹出的窗口中，删除列表中所有项，然后单击绿+，选择directory并选择JRE的根目录(注意是拷贝后的目录)即可,如图：<br />
</p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s4.album.sina.com.cn/pic/4412ae2502000f8f" target="_blank"><img title="点击在新窗口打开图片" src="http://s4.album.sina.com.cn/pic/4412ae2502000f8f" border="0" alt="" /></a>
<div forimg="1" align="center"><img class="blogimg" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/cbfa4f3b4fa5c8ec15cecb1c.jpg" border="0" alt="" /></div>
</center>
<p><br />
单击ok后，再从图中单击advanced options，并选择preferred VM，在弹出的窗口中选择client hostspot VM，单击next按钮继续：<br />
</p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s6.album.sina.com.cn/pic/4412ae2502000f7t" target="_blank"></a></center>
<div forimg="1" align="center"><img class="blogimg" title="点击在新窗口打开图片" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/2e68ffdef992d05eccbf1a1c.jpg" border="0" alt="" /></div>
<p><br />
第7、8步是一些基本配置，默认即可，第9步编译，第10步你就可以点这个看到效果了：<br />
</p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s12.album.sina.com.cn/pic/4412ae2502000f7n" target="_blank"></a></center>
<div forimg="1" align="center"><img class="blogimg" title="点击在新窗口打开图片" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/a5cee80ffbebfaebab64571c.jpg" border="0" alt="" /></div>
<p><br />
exe4j未注册的版本会出现下面的对话框：<br />
</p>
<center><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s1.album.sina.com.cn/pic/4412ae2502000f7o" target="_blank"></a></center>
<div forimg="1" align="center"><img class="blogimg" title="点击在新窗口打开图片" small="0" src="http://hiphotos.baidu.com/%D2%B2%CE%AA/pic/item/a68f716da6ebb3fd4316941d.jpg" border="0" alt="" /></div>
<p><br />
点击确定之后就可以看到你程序的运行结果了！<br />
<br />
java.exe依照一套逻辑来寻找可以用的JRE，首先查找自己所在的目录下有没有JRE，其次查找自己的父目录下有没有JRE；最后才是查询Windows的注册表。<br />
<br />
现在我们的程序可以在任意的计算机上执行了，可是缺点是致命的，比方说我的程序才160K，可是不论走到哪里都要背着70多M的JRE，未免有点小题大做吧，其实作为我们的私有的JRE，好多内容都是可以抛弃的。Jre目录下的license都可以不要，bin下的执行文件只需要保留java.exe或者javaw.exe，lib下只要保留rt，jsse，jce，charsets几个库就可以了。除了i386和zi两个子目录外，其余的子目录都可以不要。Zi下只需要保留自己地区的子目录和其下的一些文件就可以。Lib下除了库之外的属性文件等等都要保留。这样清理一番，JRE仍然有接近50MB。还可以继续清理几个库文件里面不需要的内容，这需要仔细的整理，会很费功夫。最好能写出一个自动工具帮助我们整理它们。从Sun公司上下到的JMF里面附带的用Java写的媒体播放器就自带了JRE，只有几个MB。<br />
清理过后需要运行几遍我们的应用程序，以确保我们的JRE不缺少东西。<br />
<br />
OK，仔细清理之后，文件变小了不少，可以发布了&hellip;&hellip;</p>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/137373#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 01 Nov 2007 16:19:04 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/137373</link>
        <guid>http://laies.javaeye.com/blog/137373</guid>
      </item>
      <item>
        <title>Java的模板引擎Velocity</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/135506" style="color:red;">http://laies.javaeye.com/blog/135506</a>&nbsp;
          发表时间: 2007年10月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="TEXT-INDENT: 2em">不少人看过或了解过Velocity，名称字面翻译为：速度、速率、迅速，用在Web开发里，用过的人可能不多，大都基本知道和在使用Struts，到底Velocity和Struts是如何联系，怎么看待Velocity呢？让我们来尝试一下，了解Velocity的概念，通过在这里的介绍，强调在技术选择上的问题，让大家在选择项目开发时，可以考虑Velocity，另外也让大家了解它的思想，毕竟它提供了一个很好的思维方式，给大家换换筋骨，换一种思考的方式。 </p>
<p style="TEXT-INDENT: 2em">本文基于你对Java开发有一定基础，知道MVC，Struts等开发模式。 </p>
<p style="TEXT-INDENT: 2em">Velocity是一种Java模版引擎技术，该项目由Apache提出，由另外一种引擎技术Webmacro引深而来。那什么是官方的Velocity定义呢？Apache对它的定义是：一种基于Java的模板引擎，但允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。目前最新的版本是1.4，可以在<a href="http://jakarta.apache.org/velocity/index.html" target="_blank">http://jakarta.apache.org/velocity/index.html</a>查找更多信息。 </p>
<p style="TEXT-INDENT: 2em">其实说白了Velocity也就是MVC架构的一种实现，但它更多的是关注在Model和View之间，作为它们的桥梁。对于MVC的最流行架构Struts来说，相信大家都不陌生，很多开发人员已经大量在使用Struts架构，包括IBM的Websphere 5以上的管理平台版本，Struts技术很好的实践了MVC，它有效的减少Java代码在View（Jsp）中的出现，但在Model和View之间还是依靠Struts的Taglib技术来实现，试想如果前台开发的网页设计师对Struts乃至Taglib不熟（相信也挺难熟的，包括后期的维护人员也一样），将会对网页设计师和前台开发工程师的相互协作开发带来很大的难度，现实开发中也还是存在这样事实，网页设计师和前台开发之间的工作或多或少还是存在一定的耦合，怎样最大限度的解决这个难题呢？还是让我们来看看Velocity或者说这个概念吧。 </p>
<p style="TEXT-INDENT: 2em">先做一个最简单的Velocity开发例子，让大家看看Velocity是怎样工作的： </p>
<p style="TEXT-INDENT: 2em">1、创建1个文件，文件名为：hellovelocity.vm，即velocity模版（其实和html一样），内容： </p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">Welcome $name to Javayou.com! </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">today is $date.</font> </p>
<p style="TEXT-INDENT: 2em">2、创建1个java文件，HelloVelocity.java，内容： </p>
<p style="TEXT-INDENT: 2em">package com.javayou.velocity; </p>
<p style="TEXT-INDENT: 2em">import java.io.StringWriter; </p>
<p style="TEXT-INDENT: 2em">import java.util.*; </p>
<p style="TEXT-INDENT: 2em">import org.apache.velocity.app.VelocityEngine; </p>
<p style="TEXT-INDENT: 2em">import org.apache.velocity.Template; </p>
<p style="TEXT-INDENT: 2em">import org.apache.velocity.VelocityContext; </p>
<p style="TEXT-INDENT: 2em">/** </p>
<p style="TEXT-INDENT: 2em">* @author Liang.xf 2004-12-14 </p>
<p style="TEXT-INDENT: 2em">*/ </p>
<p style="TEXT-INDENT: 2em">public class HelloVelocity { </p>
<p style="TEXT-INDENT: 2em">public static void main(String[] args) throws Exception { </p>
<p style="TEXT-INDENT: 2em">//初始化并取得Velocity引擎 </p>
<p style="TEXT-INDENT: 2em">VelocityEngine ve = new VelocityEngine(); </p>
<p style="TEXT-INDENT: 2em">ve.init(); </p>
<p style="TEXT-INDENT: 2em">//取得velocity的模版 </p>
<p style="TEXT-INDENT: 2em">Template t = ve.getTemplate(&quot;hellovelocity.vm&quot;); </p>
<p style="TEXT-INDENT: 2em">//取得velocity的上下文context </p>
<p style="TEXT-INDENT: 2em">VelocityContext context = new VelocityContext(); </p>
<p style="TEXT-INDENT: 2em">//把数据填入上下文 </p>
<p style="TEXT-INDENT: 2em">context.put(&quot;name&quot;, &quot;Liang&quot;); </p>
<p style="TEXT-INDENT: 2em">context.put(&quot;date&quot;, (new Date()).toString()); </p>
<p style="TEXT-INDENT: 2em">//为后面的展示，提前输入List数值 </p>
<p style="TEXT-INDENT: 2em">List temp = new ArrayList(); </p>
<p style="TEXT-INDENT: 2em">temp.add(&quot;1&quot;); </p>
<p style="TEXT-INDENT: 2em">temp.add(&quot;2&quot;); </p>
<p style="TEXT-INDENT: 2em">context.put(&quot;list&quot;, temp); </p>
<p style="TEXT-INDENT: 2em">//输出流 </p>
<p style="TEXT-INDENT: 2em">StringWriter writer = new StringWriter(); </p>
<p style="TEXT-INDENT: 2em">//转换输出 </p>
<p style="TEXT-INDENT: 2em">t.merge(context, writer); </p>
<p style="TEXT-INDENT: 2em">System.out.println(writer.toString()); </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">3、在<a href="http://jakarta.apache.org/site/binindex.cgi" target="_blank">http://jakarta.apache.org/site/binindex.cgi</a>上下载Velocity 1.4 zip，解压后获取velocity-1.4.jar，用它来编译上面的类HelloVelocity.java。 </p>
<p style="TEXT-INDENT: 2em">4、把1上的hellovelocity.vm copy到运行的当前目录下，运行HelloVelocity还需要其他类包，可以从下载后的velocity1.4.zip来，\\velocity-1.4\\build\\lib，把commons-collections.jar、logkit-1.0.1.jar引入后运行java -cp .\\bin; -Djava.ext.dirs=.\\lib2 com.javayou.velocity.HelloVelocity，假设class编译到.\\bin目录，而我们所需的类包放到.\\lib2目录内，运行结构如下： </p>
<p style="TEXT-INDENT: 2em">Welcome Liang to Javayou.com! </p>
<p style="TEXT-INDENT: 2em">today is Tue Dec 14 19:26:37 CST 2004. </p>
<p style="TEXT-INDENT: 2em">以上是最简单的运行结果，怎么样，知道个大概吧，模版hellovelocity.vm里的2个定义变量$name和$date分别被context.put(&quot;name&quot;, &quot;Liang&quot;)和context.put(&quot;date&quot;, (new Date()).toString())所设的值替代了。 </p>
<p style="TEXT-INDENT: 2em">由此看来业务流程处理包括业务结果基本在model这层全部解决，而view这一层基本只用使用简单的VTL（Velocity Template Language）来展示。这样，Jsp岂不是不用了么？是的，这样的使用模式有点象早前的CGI方式：）由Velocity自动输出代码，并且Velocity在这方面的能力也很强，Turbine里就采用了Velocity来产生很多代码。 </p>
<p style="TEXT-INDENT: 2em">在Velocity中，变量的定义都是使用&ldquo;$&rdquo;开头的，$作为Velocity的标识符。字母、数字、中划和下划线都可以作为Velocity的定义变量。 </p>
<p style="TEXT-INDENT: 2em">此外我们还需要注意的是Velocity特色的变量定义，如：$student.No、$student.Address，它有2层含义：第1种是如果student是hashtable，则将从hashtable中提取key为No和Address的值，另外第2种就是它有可能是调用方法，即上面2个变量将被转换为student.getNo()和student.getAddress()。Velocity对在servlet中的java code返回的值有对象，还可以调用对象的方法，如$ student.getAddress()等等，在此就不一一举例和深入了。 </p>
<p style="TEXT-INDENT: 2em">上面的例子只是简单的举例，现在当然不少人已经不满足这样的例子了，实际的应用中我们还常常需要作些选择性展示和列举一些迭代数据，如List列表，当然Velocity（具体来说应该是VTL模版语言）也支持这项功能，此外还支持其他一些常用的展示，如模版内部的变量（如Jsp内的变量），还有强大一些的如创建宏以实现自动化，让我们继续接着往下看吧。 </p>
<p style="TEXT-INDENT: 2em">我们还是使用上面的例子，把模版hellovelocity.vm中的内容改为： </p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#set( $iAmVariable = &quot;good!&quot; ) </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">Welcome $name to Javayou.com! </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">today is $date. </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">$iAmVariable </font></p>
<p style="TEXT-INDENT: 2em">重新执行上面的运行命令，结果： </p>
<p style="TEXT-INDENT: 2em">Welcome Liang to Javayou.com! </p>
<p style="TEXT-INDENT: 2em">today is Tue Dec 14 22:44:39 CST 2004. </p>
<p style="TEXT-INDENT: 2em">good! </p>
<p style="TEXT-INDENT: 2em">可以看得模版中的变量定义为# set开头的语句，不是很难理解，执行后模版中的变量$iAmVariable都转换成定义的值：</p>
<p style="TEXT-INDENT: 2em">good! </p>
<p style="TEXT-INDENT: 2em">再来看看简单的选择，把模版hellovelocity.vm中的内容改为： </p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#set ($admin = &quot;admin&quot;) </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#set ($user = &quot;user&quot;) </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#if ($admin = = $user) </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">Welcome admin! </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#else </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">Welcome user! </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#end </font></p>
<p style="TEXT-INDENT: 2em">执行运行命令，结果： </p>
<p style="TEXT-INDENT: 2em">Welcome user! </p>
<p style="TEXT-INDENT: 2em">可以看到判断语句只是简单的#if ()、#else、#end，不是很复杂。 </p>
<p style="TEXT-INDENT: 2em"><span class="a14c" id="zoom"></span></p>
<p style="TEXT-INDENT: 2em">接着继续来看看迭代数据吧，把模版hellovelocity.vm中的内容改为： </p>
<p style="TEXT-INDENT: 2em">#foreach( $product in $list ) </p>
<p style="TEXT-INDENT: 2em">$product </p>
<p style="TEXT-INDENT: 2em">#end </p>
<p style="TEXT-INDENT: 2em">执行运行命令，结果： </p>
<li>1 </li>
<li>2
<p style="TEXT-INDENT: 2em">把在例子中预先保存在VelocityContext的List中的值列举了出来，是不是很方便啊？仅仅只是用了#foreach（$variable in xx） 而已，如果上面的List换成Hashtable，则可以用下面的语法： </p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#foreach($key in $hashVariable.keySet() )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></p>
</li>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">$key &lsquo;s value: $ hashVariable.get($key)</font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#end</font> </p>
<p style="TEXT-INDENT: 2em">一点不觉得这些脚本很复杂。 </p>
<p style="TEXT-INDENT: 2em">还有不少人还会问，如果是javabean怎么办？好的，我们增加一个bean： </p>
<p style="TEXT-INDENT: 2em">package com.javayou.velocity; </p>
<p style="TEXT-INDENT: 2em">/** </p>
<p style="TEXT-INDENT: 2em">* @author Liang.xf 2004-12-14 </p>
<p style="TEXT-INDENT: 2em">*/ </p>
<p style="TEXT-INDENT: 2em">public class Student { </p>
<p style="TEXT-INDENT: 2em">//注意class的属性是public的 </p>
<p style="TEXT-INDENT: 2em">public String no = &quot;&quot;; </p>
<p style="TEXT-INDENT: 2em">public String address = &quot;&quot;; </p>
<p style="TEXT-INDENT: 2em">public Student(String _no, String _address) { </p>
<p style="TEXT-INDENT: 2em">no = _no; </p>
<p style="TEXT-INDENT: 2em">address = _address; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">public String getAddress() { </p>
<p style="TEXT-INDENT: 2em">return address; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">public void setAddress(String address) { </p>
<p style="TEXT-INDENT: 2em">this.address = address; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">public String getNo() { </p>
<p style="TEXT-INDENT: 2em">return no; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">public void setNo(String no) { </p>
<p style="TEXT-INDENT: 2em">this.no = no; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">这个Student是实足的javabean，或者说是data bean，常见的用来装载数据的类，然后我们修改HelloVelocity.java，把： </p>
<p style="TEXT-INDENT: 2em">temp.add(&quot;1&quot;); </p>
<p style="TEXT-INDENT: 2em">temp.add(&quot;2&quot;); </p>
<p style="TEXT-INDENT: 2em">替换成： </p>
<p style="TEXT-INDENT: 2em">temp.add(new Student(&quot;123&quot;, &quot;Guangzhou&quot;)); </p>
<p style="TEXT-INDENT: 2em">temp.add(new Student(&quot;456&quot;, &quot;Zhuhai&quot;)); </p>
<p style="TEXT-INDENT: 2em">再把hellovelocity.vm的内容改为： </p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#foreach ($s in $students) </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">&lt;$velocityCount&gt; Address: $s.address </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#end</font> </p>
<p style="TEXT-INDENT: 2em">重新编译和执行运行命令，结果如下： </p>
<p style="TEXT-INDENT: 2em">&lt;1&gt; Address: Guangzhou </p>
<p style="TEXT-INDENT: 2em">&lt;2&gt; Address: Zhuhai </p>
<p style="TEXT-INDENT: 2em">这样把list中Student的数据打印了出来，大功告成！这里用了Velocity的内建变量$velocityCount，指的是默认的列举序号，从1开始，也可以改成0开始，但需要在Velocity.properties中更改，Velocity.properties位于velocity-1.4.jar包内的目录org\\apache\\velocity\\runtime\\defaults 下。 </p>
<p style="TEXT-INDENT: 2em">再复杂一些的迭代怎么处理呢？我们看看下面的模版例子就清楚了： </p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#foreach ($element in $list) </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">-- inner foreach -- </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#foreach ($element in $list) </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">This is $element. </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">$velocityCount </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#end </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">-- inner foreach -- </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">-- outer foreach -- </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">This is $element. </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">$velocityCount </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">-- outer foreach -- </font></p>
<p style="TEXT-INDENT: 2em"><font color="#ff0000">#end</font> </p>
<p style="TEXT-INDENT: 2em">看出来了吧，Velocity是支持标签嵌套的，这个可是很强大的功能，这里就不深入演示了，如果有兴趣，自己试试吧。 </p>
<p style="TEXT-INDENT: 2em">其实，稍为深入思考刚刚我们举的例子，就已经可以看出来，Velocity的用处在哪里？即Servlet + Velocity的模式，另外，还记得我们早期Jsp开发的模式Jsp+JavaBean吗？在这里，我们更改为Servlet+JavaBean+Velocity，想想，是不是已经替代了Jsp+JavaBean，并更彻底的把Java代码去除在Jsp（vm）外，如果光使用Struts（Servlet+Jsp），那么带来的代价是Java代码总或多或少出现在Jsp上，即使可以做到不出现Java代码，但做过复杂架构系统的开发者都知道，代价也是很昂贵的，并且在可维护性、和网页设计师的集成开发上存在一定的困难，所以我们在这里能感觉到，Servlet+JavaBean+Velocity的模式较好的实现了OOD的概念。而在效率上，大家也不用担心，此种结合方式比Servlet+Jsp的方式要高效一些。 </p>
<p style="TEXT-INDENT: 2em">愿意了解Velocity的人应该不少，但真正实用到项目的，也许不多（还是有些项目在使用，如Jute），毕竟和Jsp比起来，Jsp更标准、更广泛使用和有不少开发工具已经支持Jsp开发。但Velocity的功能不会仅仅局限在和Jsp竞争的局面，由上可看出它在自动代码输出方面功能很强，前面提到Turbine就是采用Velocity来生成很多代码，你也可以稍加改动就可以做成代码生成器，或其他模版生成上，都是很不错的想法。 </p>
<p style="TEXT-INDENT: 2em">好了，我们再来看看要深入Velocity来做项目，还需要注意的一些常见问题吧，首先是国际化的问题， </p>
<p style="TEXT-INDENT: 2em">Velocity本身支持模版的国际化编码转换，看看Velocity提供的方法： </p>
<p style="TEXT-INDENT: 2em">Public Template getTemplate (Stirng template, String encoding)， </p>
<p style="TEXT-INDENT: 2em">由此推测这样做其实不能彻底的做到国际化。 </p>
<p style="TEXT-INDENT: 2em">最简单的在Struts中国际化的概念，即在Jsp上使用国际化语言标签的方式来做到，而每种语言采用不同的语言标签库的方式，引申到这里，其实手工来做一样可以做到，只不过需要稍加手工处理而已。 </p>
<p style="TEXT-INDENT: 2em">好在已经有人处理了上面所说问题，做成了Velocity的tools: MessageTool，提供了变量text包含国际化标签，这样只需要简单的编写标签代码即可，如：$text.get(&lsquo;title&rsquo;)，更多具体的内容还可在<a href="http://jakarta.apache.org/velocity/tools/struts/MessageTool.html" target="_blank">http://jakarta.apache.org/velocity/tools/struts/MessageTool.html</a> 中了解。 </p>
<p style="TEXT-INDENT: 2em">好了，基于Velocity的介绍我们就说这么多，再说说其他引伸方面的内容吧。有人评论Velocity不是标准的MVC结构，没错，刚开始我们就说过Velocity只是Model和View之间的良好结合，只是个好的模版引擎，毕竟还没有形成MVC三者良好的结合。好在Apache又基于Struts和Velocity的结合，推出了VelocityStruts，这部分的陈述我们可以在后面的专题里再推出，这里简单介绍它的概念，它是在Struts的结构上，在业务逻辑处理的Action后，把业务流程转向基于Velocity的显示层，从而代替Jsp作为View层。以上我们也看到了所举的例子基本上只是基于原理和演示，没有和Web开发紧密结合起来，这方面内容我们在讲述VelocityStruts的内容时再来结合吧。</p>
<p style="TEXT-INDENT: 2em">&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/135506#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 25 Oct 2007 17:50:22 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/135506</link>
        <guid>http://laies.javaeye.com/blog/135506</guid>
      </item>
      <item>
        <title>java读取操作系统环境变量</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/134797" style="color:red;">http://laies.javaeye.com/blog/134797</a>&nbsp;
          发表时间: 2007年10月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">
<p><font face="Arial">package com.laies;</font></p>
<p><font face="Arial">import java.util.*;<br />
import java.io.*;</font></p>
<p><font face="Arial">/**<br />
&nbsp;* @author 梁越<br />
&nbsp;* @文件名：SysProb.java&lt;br&gt;<br />
&nbsp;* @描述： 取得当前系统变量的程序<br />
&nbsp;*/</font></p>
<p><font face="Arial">public class SysProb {<br />
&nbsp;// 返回当前系统变量的函数，结果放在一个Properties里边，这里只针对win2k以上的，其它系统可以自己改进<br />
&nbsp;public Properties getEnv() throws Exception {<br />
&nbsp;&nbsp;Properties prop = new Properties();<br />
&nbsp;&nbsp;String OS = System.getProperty(&quot;os.name&quot;).toLowerCase();<br />
&nbsp;&nbsp;Process p = null;<br />
&nbsp;&nbsp;if (OS.indexOf(&quot;windows&quot;) &gt; -1) {<br />
&nbsp;&nbsp;&nbsp;p = Runtime.getRuntime().exec(&quot;cmd /c set&quot;); // 其它的操作系统可以自行处理，<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;BufferedReader br = new BufferedReader(new InputStreamReader(p<br />
&nbsp;&nbsp;&nbsp;&nbsp;.getInputStream()));<br />
&nbsp;&nbsp;String line;<br />
&nbsp;&nbsp;while ((line = br.readLine()) != null) {<br />
&nbsp;&nbsp;&nbsp;int i = line.indexOf(&quot;=&quot;);<br />
&nbsp;&nbsp;&nbsp;if (i &gt; -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;String key = line.substring(0, i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;String value = line.substring(i + 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;prop.setProperty(key, value);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return prop;<br />
&nbsp;}</font></p>
<p><font face="Arial">&nbsp;// 具体用法<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;SysProb sp = new SysProb();<br />
&nbsp;&nbsp;&nbsp;Properties p = sp.getEnv();<br />
&nbsp;&nbsp;&nbsp;System.out.println(p.getProperty(&quot;TEMP&quot;)); // 注意大小写<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;System.out.println(e);<br />
&nbsp;&nbsp;}</font></p>
<p><font face="Arial">&nbsp;}<br />
}</font></p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/134797#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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, 23 Oct 2007 15:43:02 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/134797</link>
        <guid>http://laies.javaeye.com/blog/134797</guid>
      </item>
      <item>
        <title>JS实现动态时间</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/131882" style="color:red;">http://laies.javaeye.com/blog/131882</a>&nbsp;
          发表时间: 2007年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="1" color="#ff0000">JS代码如下：</font></p>
<font size="1" color="#ff0000">
<p><font face="Arial">&lt;script language=&quot;javascript&quot;&gt;<br />
function showTime()<br />
{<br />
var d=new Date();</font></p>
<p><font face="Arial">d_date.innerHTML=&quot;Date:&quot;;<br />
d_date.innerHTML=d_date.innerHTML+d.toLocaleDateString()+&quot; &quot;+d.toLocaleTimeString();<br />
var timer=window.setTimeout(&quot;showTime()&quot;,1000);<br />
}<br />
&lt;/script&gt;</font></p>
</font>
<p><font size="1" color="#ff0000">html代码如下：</font></p>
<p><font size="1" color="#ff0000"><font face="Arial">&lt;&nbsp; div &nbsp;id=&quot;d_date&quot; onclick=&quot;showTime()&quot;&gt;Date&lt;&nbsp; /div&gt;</font></font></p>
<p><font size="1" face="Arial"></font></p>
<div id="d_date" onclick="showTime()"></div>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/131882#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 15 Oct 2007 10:49:23 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/131882</link>
        <guid>http://laies.javaeye.com/blog/131882</guid>
      </item>
      <item>
        <title>JS读XML例子</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/131874" style="color:red;">http://laies.javaeye.com/blog/131874</a>&nbsp;
          发表时间: 2007年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="1" face="Arial"><font size="1" face="Arial">
<p>html 代码和xml代码在附件里！！！！</p>
</font></font>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/131874#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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>Mon, 15 Oct 2007 10:16:48 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/131874</link>
        <guid>http://laies.javaeye.com/blog/131874</guid>
      </item>
      <item>
        <title>javascript 创建excel文件</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/131872" style="color:red;">http://laies.javaeye.com/blog/131872</a>&nbsp;
          发表时间: 2007年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2" face="Arial">&nbsp;</font></p>
<p><font size="2" face="Arial">下面是js写的创建excel文件的例子：</font></p>
<p><font size="2" face="Arial">&lt;script language=&quot;javascript&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; var ExcelSheet;<br />
&nbsp;&nbsp;&nbsp; ExcelApp = new ActiveXObject(&quot;Excel.Application&quot;);<br />
&nbsp;&nbsp;&nbsp; ExcelSheet = new ActiveXObject(&quot;Excel.Sheet&quot;);<br />
&nbsp;&nbsp;&nbsp; //本代码启动创建对象的应用程序（在这种情况下，Microsoft Excel 工作表）。<br />
&nbsp;&nbsp;&nbsp; //一旦对象被创建，就可以用定义的对象变量在代码中引用它。&nbsp;<br />
&nbsp;&nbsp;&nbsp; //在下面的例子中，通过对象变量 ExcelSheet 访问新对象的属性和方法和其他 Excel 对象，<br />
&nbsp;&nbsp;&nbsp; //包括 Application 对象和 ActiveSheet.Cells 集合。&nbsp;<br />
&nbsp;&nbsp;&nbsp; // 使 Excel 通过 Application 对象可见。<br />
&nbsp;&nbsp;&nbsp; ExcelSheet.Application.Visible = true;<br />
&nbsp;&nbsp;&nbsp; // 将一些文本放置到表格的第一格中。<br />
&nbsp;&nbsp;&nbsp; ExcelSheet.ActiveSheet.Cells(1,1).Value = &quot;This is column A, row 1&quot;;<br />
&nbsp;&nbsp;&nbsp; // 保存表格。<br />
&nbsp;&nbsp;&nbsp; ExcelSheet.SaveAs(&quot;C:\\TEST.XLS&quot;);<br />
&nbsp;&nbsp;&nbsp; // 用 Application 对象用 Quit 方法关闭 Excel。<br />
&nbsp;&nbsp;&nbsp; ExcelSheet.Application.Quit();<br />
&lt;/script&gt;</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/131872#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 15 Oct 2007 10:12:28 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/131872</link>
        <guid>http://laies.javaeye.com/blog/131872</guid>
      </item>
      <item>
        <title>String和StringBuffer的区别</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/131867" style="color:red;">http://laies.javaeye.com/blog/131867</a>&nbsp;
          发表时间: 2007年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;<font size="2">&nbsp; 在我以前的了解中，String是一个final Class， StringBuffer不是。所以对于 String a = &quot;yacht&quot; ,String b = &quot;yacht1&quot; String c = a + b ; 存在一个对象拷贝构造和解析的消耗问题；对于一个StringBuffer来说，StringBuffer sb = new StringBuffer()；sb.append(&quot;yacht&quot;) ; sb.append(&quot;yacht1&quot;); 因为StringBuffer是一个可以实例化的类，而且它的内建机制是维护了一个capacity大小的字符数组，所以它的append操作不存在对象的消耗问题，所以我觉得如果存在String连接这种事情，StringBuffer来做会好很多。</font>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但事情并不是这么简单，看下面代码</font></p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"> String a = &quot;yacht1&quot; + &quot;yacht2&quot; + &quot;yacht3&quot; + &quot;yacht4&quot;;</font></font></p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">StringBuffer sb = new StringBuffer(); sb.append(&quot;yacht1&quot;) ; sb.append(&quot;yacht2&quot;); sb.append(&quot;yacht3&quot;) ; sb.append(&quot;yacht4&quot;);&nbsp;&nbsp;&nbsp; String a = sb.toString();</font></font></p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果按照我先前说的看法，红色的效率肯定比蓝色的低，但经过测试不是这样，为什么？这里，我们需要理解程序过程的两个时期，一个是编译时，一个是运行时，在编译时，编译器会对你的程序做出优化，所以红色的String a会被优化成yacht1yacht2yacht3yacht4，而蓝色的StringBuffer只会在运行时才处理。所以效率是不一样的。</font></p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果代码是这样的：</font></p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">String a ; for(int i = 0; i&lt; 100000;i++){ a += String.valueOf(i) ;} </font></font></p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">StringBuffer sb = new StringBuffer(); for(int i = 0; i&lt; 100000;i++){ sb.append(i) ;} String a = sb.toString(); </font></font></p>
<p><font color="#0000ff"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">如果是这种情况的话，红色的效率就大大不如蓝色，区别在哪里，就在于运行时和编译时的优化问题上！</font></font></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/131867#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Mon, 15 Oct 2007 10:02:12 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/131867</link>
        <guid>http://laies.javaeye.com/blog/131867</guid>
      </item>
      <item>
        <title>MalformedInputException</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/127488" style="color:red;">http://laies.javaeye.com/blog/127488</a>&nbsp;
          发表时间: 2007年09月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><br />
<font color="#ff0000">websphere 服务器发出的异常：</font></p>
<p>sun.io.MalformedInputException<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at sun.io.ByteToCharGB18030.convert(ByteToCharGB18030.java:178)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at sun.nio.cs.StreamDecoder$ConverterSD.convertInto(StreamDecoder.java:247)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at sun.nio.cs.StreamDecoder$ConverterSD.implRead(StreamDecoder.java:297)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:182)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.io.InputStreamReader.read(InputStreamReader.java:167)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.io.BufferedReader.fill(BufferedReader.java:136)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.io.BufferedReader.readLine(BufferedReader.java:299)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.io.BufferedReader.readLine(BufferedReader.java:362)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.xgll.transfer.request.RequestInterface.doFilter(RequestInterface.java:194)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.xgll.transfer.request.RequestInterface.doRequest(RequestInterface.java:136)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.xgll.transfer.request.RequestInterface.run(RequestInterface.java:98)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Thread.run(Thread.java:536)&nbsp;</p>
<p><font color="#ff0000">这个错误的原因：</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于sun.io.ByteToCharGB18030.convert(ByteToCharGB18030.java)在 websphere 平台读取文件时，文件内容含有非中文字符（例如日文等），会报此错误。这个问题产生的原因是IBM在JDK 1.4版本中为了追求对io通道的高效率改变了JDK 1.3中对io通道中异常处理的策略。IBM JDK 1.4中对于io通道的异常处理更加严格，因此系统中会报上面的错误。</p>
<p><font color="#ff0000">这个错误的解决方法：</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决这一问题的办法是不使用IBM JDK 1.4中默认的io通道，而使用nio通道。具体解决步骤： 1.打开管理控制台,找到并选择运行这个JSP的应用服务器；2.依次选择进程定义，java虚拟机，一般JVM自变量；3.添加-Dibm.stream.nio=true ；4.确定，保存；5.重新启动该服务器 我试过，ok了。</p>
<p>&nbsp;</p>
<p><font color="#ff0000">说明：以上配置问题解决，但本人出现了另一个错误，所有的框架页提示500 error 8192错误，后来发现是没有打补丁。</font></p>
<p><font color="#ff0000">小窍门：wbsphere的配置，可以在配置文件中直接修改，例如本话题的jvm参数配置，在<font face="Arial">IBM\WebSphere\AppServer\profiles\AppSrv01\config\cells\liangwgNode01Cell\nodes\liangwgNode01\servers\server.xml 文件中。</font></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/127488#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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, 27 Sep 2007 10:36:25 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/127488</link>
        <guid>http://laies.javaeye.com/blog/127488</guid>
      </item>
      <item>
        <title>什么是OEM，FOB，SKD，CKD？</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/127226" style="color:red;">http://laies.javaeye.com/blog/127226</a>&nbsp;
          发表时间: 2007年09月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 在国际贸易中，<font color="#0000ff">OEM，FOB，SKD，CKD</font>，其实都是应为单词串的缩写，具体来说：&nbsp;<br />
&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; <font color="#0000ff">OEM</font>是<font color="#0000ff">Original Equipment Manufacture</font>(原始设备制造商)的缩写，它是指一种&quot;代工生产&quot;方式，其含义是生产者不直接生产产品，而是利用自己掌握的&quot;关键的核心技术&quot;，负责设计和开发、控制销售&quot;渠道&quot;，具体的加工任务交给别的企业去做的方式。这种方式是在电子产业大量发展起来以后才在世界范围内逐步生成的一种普遍现象，微软、IBM等国际上的主要大企业均采用这种方式。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">FOB</font>就是<font color="#0000ff">FREE ON BOARD</font> 的缩写形式,意思是装运港船上交货,也称作离岸价.T/T是电汇,分为二大类,前T/T和后T/T,你说的那一种属于后T/T.前T/T 意思就是在发货前进口方收到出口方电汇,后T/T 就是出货后再收汇,后者风险较大.&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;<font color="#0000ff"> CKD(Completely Knock Down)</font>全散装件 <br />
CKD就是以全散件形式作为进口整车车型的一种专有名词术语，在当地生产的零部件以较低的关税和较低的工资，利用当地劳动力组装成整车，并以较低零售价出售。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;<font color="#0000ff"> SKD（Semi Knock Down）</font>半散装件 <br />
<br />
在国际贸易中，特别是在国际汽车贸易中，整车出口国的汽车公司把成品予以拆散，而以半成品或零部件的方式出口，再由进口厂商在所在国以自行装配方式完成整车成品并进行销售。</p>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/127226#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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, 26 Sep 2007 11:23:05 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/127226</link>
        <guid>http://laies.javaeye.com/blog/127226</guid>
      </item>
      <item>
        <title>语义搜索技术</title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/126527" style="color:red;">http://laies.javaeye.com/blog/126527</a>&nbsp;
          发表时间: 2007年09月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="楷体_GB2312">导语：《红鲱鱼》杂志近日发表分析文章称，越来越多的创业者和投资者对于下一代网络技术&mdash;&mdash;&ldquo;语义网&rdquo;(semantic web)寄予厚望，认为它可以帮助用户更加方便、快捷地查找信息，从而有望超越当前的网络搜索巨头谷歌。</font>
<p>　　<strong>什么是语义网</strong></p>
<p>　　语义网的基础是一种新型搜索技术，通过这一技术，用户只需使用日常语言输入问题，就可以获得想要的答案。下一代搜索引擎的开发者认为，他们的技术能&ldquo;理解&rdquo;用户所使用的语言，在这方面远远强于谷歌的技术。新型搜索引擎随后遍历一个覆盖所有互联网内容的数据库，以寻找匹配度最高的内容。通过这一方式，它们可以针对用户提出的问题，例如&ldquo;谁是全球最好的石油公司&rdquo;，或者&ldquo;女性最喜欢哪部电影&rdquo;，给出最准确的答案。</p>
<p>　　这就是很多语义搜索创业公司的目标，它们希望改变人们现有的网络搜索方式。不过，要实现这一目标，它们必须超越谷歌。通过一个强大、易用的搜索引擎，谷歌已经在美国网络搜索市场占据了50%以上的市场，成为了搜索技术领域的事实标准。这是一项艰巨的任务，但回报也足够丰厚，因为搜索结果已经同广告营收挂钩。</p>
<p>　　<strong>语义网自身优势</strong></p>
<p>　　微软新兴业务团队主管多恩&middot;道奇(Don Dodge)预计，一家公司只要在美国网络搜索市场占据1%的份额，其年度营收就将超过1亿美元，市值达到10亿美元。纽约创业公司Hakia已经推出了自己的语义搜索引擎，并在快速查找特定信息方面获得了积极的评价。Hakia还推出了一款浏览器插件，可以帮助用户在文档中定位包含搜索问题答案的特定部分。</p>
<p>　　Hakia总裁兼首席运营官米里克&middot;普拉昆克(Melek Pulatkonak)表示，谷歌等搜索引擎仅仅依据热度为搜索结果排名，而没有真正地理解每个页面的内容。与之相比，Hakia则做了大量的离线分析，摘录了每个页面的主要内容。Hakia还提供了一个&ldquo;聊天窗口&rdquo;，允许永恒以即时信息的方式提出问题。Hakia认为，这一方式更适合时尚的青少年用户。Hakia目前采用了Ask.com的广告系统，预计将于明年推出自己的广告平台。</p>
<p>　　尽管还未推出自己的搜索引擎，但位于旧金山的PowerSet已经成为了最为热门的创业公司之一。PowerSet已经从以斯&middot;戴森(Esther Dyson)和Founders Fund的等知名投资者那里获得资金，从谷歌挖来了多名重要工程师，并从施乐获得了高级语言技术授权。不过，要让计算机理解自然语言，并据此提供最准确的搜索结果，实在不是一件容易的过程。</p>
<p>　　<strong>语义网面临挑战</strong></p>
<p>　　怀疑者表示，平均来看，大多数用户输入的关键字只包含两个单词，这对于语义搜索引擎是一个巨大的挑战。网站可用性顾问雅格布&middot;尼尔森(Jakob Nielsen)表示：&ldquo;用户通常都很懒。对于一家网站来说，要求用户做的工作越少，获得成功的可能性越大。&rdquo;PowerSet首席执行官巴尼&middot;佩尔(Barney Pell)承认，语义搜索引擎必须说服用户改变搜索习惯。受谷歌等搜索引擎的影响，用户已经习惯于使用关键字。但是，关键字并不能真正地表达用户的想法，因此这一模式可以改变。</p>
<p>　　PowerSet上周推出了测试版搜索引擎PowerLabs，目前只支持&ldquo;邀请&rdquo;模式。当用户使用PowerLabs搜索维基百科时，它可以提供其中人物和事件的摘要。PowerLabs还会将自己的搜索结果与竞争对手相比较，以表明优劣。还有一些创业公司采用了更加注重实效的方式，针对特定任务打造语义产品。例如，Radar Networks开发出了一项信息共享和协作服务，可以帮助用户查找和共享网站、图片、产品和其它信息，这项服务预计将于今年底推出。Radar Networks已经获得了来自Vulcan Capital和Leapfrog Ventures的风险投资。</p>
<p>　　<strong>超越谷歌的机会</strong></p>
<p>　　谷歌也有很多工程师正在开发自然语言技术，其中包括著名专家拉曼内森&middot;古哈(Ramanathan Guha)。到目前为止，谷歌的技术已经能回答一些简单的问题，例如&ldquo;日本人口有多少？&rdquo;不过，谷歌的哲学一向是&ldquo;越简单越好&rdquo;。谷歌研究总监彼得&middot;诺维格(Peter Norvig)表示：&ldquo;用户一般不会提出太长的问题，很少有人愿意用一个完整的句子来表达自己的想法。&rdquo;</p>
<p>　　新兴公司有着一项重要的优势，那就是谷歌正在向新兴领域，例如文字处理、网络支付和移动设备市场扩张。同重建搜索引擎相比，这些市场发展速度更快，更符合华尔街的要求。市场研究公司Sterling Market Intelligence的格雷格&middot;斯特林(Greg Sterling)认为，这为新兴公司留下了机会，前提是它们能说服消费者放弃谷歌强大、易用的搜索引擎。(马丁）</p>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/126527#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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, 24 Sep 2007 09:10:45 +0800</pubDate>
        <link>http://laies.javaeye.com/blog/126527</link>
        <guid>http://laies.javaeye.com/blog/126527</guid>
      </item>
      <item>
        <title>对话袁红岗：JSF的优势及未来发展趋势     </title>
        <author>laies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://laies.javaeye.com">laies</a>&nbsp;
          链接：<a href="http://laies.javaeye.com/blog/126239" style="color:red;">http://laies.javaeye.com/blog/126239</a>&nbsp;
          发表时间: 2007年09月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">，有些人对他有些陌生，有些人对它抱以期望的目光，有些狂热者甚至预言未来的</span><span lang="EN-US">Java Web</span><span style="FONT-FAMILY: 宋体">主导者，</span><span lang="EN-US">2006</span><span style="FONT-FAMILY: 宋体">年</span><span lang="EN-US">Sun</span><span style="FONT-FAMILY: 宋体">把</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">从幕后推到了前台，那么</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的命运如何呢？真的像人们所说的那样成为开源框架的终结者吗？</span><span> <span lang="EN-US"><o:p></o:p></span></span>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p>&nbsp;</o:p></span><span style="FONT-FAMILY: 宋体">开源框架的风烟四起，让我们看到了</span><span lang="EN-US">Java Web</span><span style="FONT-FAMILY: 宋体">世界竞争惨烈，框架时代的来临已让开发者感到麻木和疲惫，人们在框架海洋里穿行不免有些劳累，不知哪种框架才是应用开发中的唯一选择，经历过</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">开发的人员不得不对</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">的组件，良好的集成工具，快速的开发效率报以羡幕的目光，于是有很多开发人员都提出为什么</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">不能开发出和</span><span lang="EN-US">net</span><span style="FONT-FAMILY: 宋体">具备同样的功能产品，来改变</span><span lang="EN-US">Java Web</span><span style="FONT-FAMILY: 宋体">世界的混乱格局呢？</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p>&nbsp;</o:p></span><span style="FONT-FAMILY: 宋体">那么作为</span><span lang="EN-US">JCP</span><span style="FONT-FAMILY: 宋体">组织成员，金蝶中间件对待</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">又是如何思考的呢？为此记者独家专访了在国内</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">界有着广泛声誉的金蝶首席科学家袁红岗先生，请他谈谈</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的未来的发展。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">记者：最近我们也做很多关于</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">方面报道，有人称</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">是一种过时的技术，也有些人称为</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">是早晨八九点钟的太阳，我想请问一下袁总你怎么看待</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">这种技术和它的未来前景。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">袁红岗：</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">这项技术没有过时，</span><span lang="EN-US">Sun</span><span style="FONT-FAMILY: 宋体">最近刚刚把</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">纳个</span><span lang="EN-US">Java EE5.0</span><span style="FONT-FAMILY: 宋体">规范，只不过一直没有用起来，开发者对他的这些看法也是正常的，如果从框架的角度的上说他是一个优秀的开发框架，主要缺少的是开发工具，如果与相关的开发工具的结合应该是比较有生命力的，它的前景还是很广阔的。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">记者：刚才袁总谈到了开发工具，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">是一项依赖开发工具很强一种技术，不知道金蝶是否也推出自已的开发工具？</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">袁红岗：的确，开发工具的成功，才能说明</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的成功，有这样一句话&ldquo;</span><span lang="EN-US">JSF is designed to tooled</span><span style="FONT-FAMILY: 宋体">&rdquo;换言之，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">规范从设计初开始就强调对开发工具的依赖，目前我们</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">开发工具也在逐步的丰富起来，包括</span><span lang="EN-US">Orcale JDeveloper</span><span style="FONT-FAMILY: 宋体">，</span><span lang="EN-US">Sun Java Statio Creator</span><span style="FONT-FAMILY: 宋体">等等，金蝶也同样提供了基于</span><span lang="EN-US">Eclipse</span><span style="FONT-FAMILY: 宋体">的集成开发环境：</span><span lang="EN-US">Apusic Stutio</span><span style="FONT-FAMILY: 宋体">，通过该工具，能够给</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的开发带来良好的支持，包括：语法加亮、代码辅助、断点调式、可视化的设计等等。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">记者：</span><span lang="EN-US">Apusic Stutio</span><span style="FONT-FAMILY: 宋体">开发工具与其它的</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">开发工具有哪些不同呢？</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">袁红岗：一个好的开发工具应该从组件和布局这些方面入手，从易用，简化上下功夫，微软的开发工具就很成功，金蝶的开发工具也是看到微软的成功，准备借鉴微软的开发工具模式，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">才有成功的可能，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">在概念上和</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">又有很多相似之处，</span><span lang="EN-US">Apusic Studio</span><span style="FONT-FAMILY: 宋体">就是专门为</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">设计的。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">记者：现在开源框架众多，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">与众多开源框架相比又有哪些优势呢</span><span lang="EN-US">?<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">袁红岗：现如今的开源框架都是建立在</span><span lang="EN-US">J2EE</span><span style="FONT-FAMILY: 宋体">本身的基础上的，建立</span><span lang="EN-US">HTTP,HTML</span><span style="FONT-FAMILY: 宋体">底层协议的基础上，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">实际上跟底层协议是无关的，它是一种高层的页面表达方式，它实际上生成不一定是</span><span lang="EN-US">HTML,</span><span style="FONT-FAMILY: 宋体">也可以生成</span><span lang="EN-US">WML</span><span style="FONT-FAMILY: 宋体">，假如</span><span lang="EN-US">HTML</span><span style="FONT-FAMILY: 宋体">这种标记形语言被一种新的描述语言代替的话，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">技术本身不会被淘汰。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">记者：业界说</span><span lang="EN-US">Ajax</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">融合是一个完美的框架组合，不知袁总怎么看待这种说法？</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US"></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">袁红岗：目前</span><span lang="EN-US">JSF+Ajax</span><span style="FONT-FAMILY: 宋体">这种思路，很多公司都有，包括我们金蝶自已在内，</span><span lang="EN-US"> Ajax</span><span style="FONT-FAMILY: 宋体">是一种客户端技术，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">是服务器端技术，而且</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">在实现机制上还存在很多缺陷，</span><span lang="EN-US">Ajax</span><span style="FONT-FAMILY: 宋体">在客户端的优势正好是</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的弱势，这样两种形成一种互补的关系，可以相互融合，提升</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">运行性能，同时</span><span lang="EN-US">Apusic JSF</span><span style="FONT-FAMILY: 宋体">技术也对</span><span lang="EN-US">Ajax</span><span style="FONT-FAMILY: 宋体">进行组件支持，简化</span><span lang="EN-US">Ajax</span><span style="FONT-FAMILY: 宋体">的开发，达到</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">与</span><span lang="EN-US">Ajax</span><span style="FONT-FAMILY: 宋体">的完美融合。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left"><strong><span lang="EN-US" style="FONT-SIZE: 14pt">JSF</span></strong><strong><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">掀起你的盖头来</span></strong><strong><span lang="EN-US" style="FONT-SIZE: 14pt"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">为什么会受到如此大的亲赖，</span><span lang="EN-US">IBM</span><span style="FONT-FAMILY: 宋体">，</span><span lang="EN-US">orcale</span><span style="FONT-FAMILY: 宋体">，包括国内领先的中间件厂商金蝶也投以关注目光。那么它又具有哪些与众不同的优势吸引众商家投怀送抱呢？下面我们就来揭开</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的神秘面纱。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">英文全称</span><span> <span lang="EN-US">JavaServer Faces (JSF) </span></span><span style="FONT-FAMILY: 宋体">是一种用于构建</span><span lang="EN-US"> Web </span><span style="FONT-FAMILY: 宋体">应用程序的新标准</span><span lang="EN-US"> Java </span><span style="FONT-FAMILY: 宋体">框架。它提供了一种以组件为中心来开发</span><span lang="EN-US"> Java Web </span><span style="FONT-FAMILY: 宋体">用户界面的方法，从而简化开发，也是</span><span lang="EN-US">Sun</span><span style="FONT-FAMILY: 宋体">精心打造的一项技术。</span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.65pt; TEXT-ALIGN: left"><strong><span lang="EN-US">JSF</span></strong><strong><span style="FONT-FAMILY: 宋体">优势之一：</span></strong><strong><span lang="EN-US">UI</span></strong><strong><span style="FONT-FAMILY: 宋体">组件（</span></strong><strong><span lang="EN-US">UI-component</span></strong><strong><span style="FONT-FAMILY: 宋体">）</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">组件（</span><span lang="EN-US">UI-component</span><span style="FONT-FAMILY: 宋体">）一直是桌面程序的专利，</span><span lang="EN-US">web</span><span style="FONT-FAMILY: 宋体">程序中，虽然</span><span lang="EN-US">HTML</span><span style="FONT-FAMILY: 宋体">定义了基本的</span><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">标签，但要使这些</span><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">标签像</span><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">组件那样工作，还需要很多代码片断来处理数据及其表现形式，而且有效地组织这些代码片断使其协调一致也是一件繁琐的工作。</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">组件是真正意义上的</span><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">组件，能极大地简化程序员的工作，例如，在页面上放置一个文本输入框，这个输入框立即具备了数据填充、界面更新、事件侦听、动作触发、有效性检查和类型转换的功能。更为重要的是，程序员只需根据业务逻辑编写核心业务代码，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">会保证代码在合适的时候被执行，完全不用考虑代码与代码之间该如何来配合。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.65pt; TEXT-ALIGN: left"><strong><span lang="EN-US">JSF</span></strong><strong><span style="FONT-FAMILY: 宋体">优势之二：事件驱动模式</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">事件是面向对象方法的重要组成部分，对象之间通过事件进行沟通和交流，使得一个或多个对象能够对另一个对象的行为作出响应，共同合作去完成一项业务逻辑。通常，编写</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">程序时，程序员要为对象之间的沟通设计机制，编写代码。虽然沟通的内容属于业务逻辑，但沟通的机制显然与业务没有太大关系，程序员因此为业务逻辑之外的功能浪费了时间。</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">改变了这种状况。</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的事件和侦听模式与大家熟悉的</span><span lang="EN-US">Javabean</span><span style="FONT-FAMILY: 宋体">的事件模式类似，有</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">基础的程序员并不需要学习任何新的东西。</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">组件可以产生事件，例如，当页面上一个文本输入框的内容被修改时，会发出一个</span><span lang="EN-US">&ldquo;</span><span style="FONT-FAMILY: 宋体">值改变事件</span><span lang="EN-US">&rdquo;</span><span style="FONT-FAMILY: 宋体">。另一个对象如果对</span><span lang="EN-US">&ldquo;</span><span style="FONT-FAMILY: 宋体">值改变事件</span><span lang="EN-US">&rdquo;</span><span style="FONT-FAMILY: 宋体">感兴趣，只需注册为该对象的侦听者，并编写处理例程，即可命令</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">在事件发生时自动调用处理例程。</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">做了所有该做的事，留给程序员的只有业务逻辑代码的编写。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.65pt; TEXT-ALIGN: left"><strong><span lang="EN-US">JSF</span></strong><strong><span style="FONT-FAMILY: 宋体">优势之三：用户界面到业务逻辑的直接映射</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">举个例子，表单提交是</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">编程最常见的任务，也是最复杂的任务之一。当用户在网页上点击</span><span lang="EN-US">&ldquo;</span><span style="FONT-FAMILY: 宋体">确定</span><span lang="EN-US">&rdquo;</span><span style="FONT-FAMILY: 宋体">按钮时，浏览器将生成一个</span><span lang="EN-US">HTTP</span><span style="FONT-FAMILY: 宋体">请求，发往服务器端的某个</span><span lang="EN-US">Servlet</span><span style="FONT-FAMILY: 宋体">，执行该</span><span lang="EN-US">Servlet</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">service</span><span style="FONT-FAMILY: 宋体">方法。在</span><span lang="EN-US">service</span><span style="FONT-FAMILY: 宋体">方法中，</span><span lang="EN-US">HTTP</span><span style="FONT-FAMILY: 宋体">请求需要经历解码、类型转换、有效性验证、状态保存、数据更新等环节，处理这些环节的所有细节，对程序员来说是沉重的负担。在</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">下，这些工作的很大一部分都由框架承担了，在程序员看来，这个过程是透明的，用户界面端的</span><span lang="EN-US">HTTP</span><span style="FONT-FAMILY: 宋体">请求可以直接映射到后端的一个事件处理例程，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">起到了承前启后的作用。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.65pt; TEXT-ALIGN: left"><strong><span lang="EN-US">JSF</span></strong><strong><span style="FONT-FAMILY: 宋体">优势之四：程序员和网页设计人员的分工</span></strong><span> <span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">JSP</span><span style="FONT-FAMILY: 宋体">中，程序员和网页设计人员的工作有时候是互相交织、无法区分的。这是因为</span><span lang="EN-US">JSP</span><span style="FONT-FAMILY: 宋体">页面中掺入了网页设计人员所不熟悉的一些</span><span lang="EN-US">JSP</span><span style="FONT-FAMILY: 宋体">标签，甚至是晦涩的</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">代码。要求网页设计人员理解这些标签和代码是不现实的，不符合分工合作的原则。在</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">中，框架为网页设计人员提供了一套标准的</span><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">组件，在工具的支持下，可以通过拖放简单地添加到网页上，然后设置某些显示属性来满足视觉要求。网页设计人员不需要知道</span><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">组件背后的复杂代码，那是程序员的事，而程序员也不需要再处理任何与视觉相关的细节，程序员所做的只是给</span><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">组件绑定类的属性或方法。虽然程序员和网页设计人员需要修改同一份文件，但他们各司其职，各得其所，互不干扰。程序员和网页设计人员工作的明确划分，是</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">在易用性方面迈出的一大步。</span><span lang="EN-US"><br />
<br />
<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.65pt; TEXT-ALIGN: left"><strong><span lang="EN-US">JSF</span></strong><strong><span style="FONT-FAMILY: 宋体">优势之五：请求处理生命周期的多阶段划分</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">虽然都是建立在</span><span lang="EN-US">Servlet</span><span style="FONT-FAMILY: 宋体">基础之上，但</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的生命周期要比</span><span lang="EN-US">JSP</span><span style="FONT-FAMILY: 宋体">复杂得多。</span><span lang="EN-US">JSP</span><span style="FONT-FAMILY: 宋体">的生命周期非常简单，页面被执行时，</span><span lang="EN-US">HTML</span><span style="FONT-FAMILY: 宋体">标记立即被生成了，生命周期随即结束。而一个完整的</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">请求</span><span lang="EN-US">-</span><span style="FONT-FAMILY: 宋体">处理生命周期被精心规划为</span><span lang="EN-US">6</span><span style="FONT-FAMILY: 宋体">个阶段，典型的</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">请求需要经历所有阶段，某些特殊的请求也可以跳过一些阶段。阶段的细分，显然引入了更多的处理，但</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">框架会管理这一切，所以，程序员在获得更多控制能力的同时，工作量并没有增加。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.65pt; TEXT-ALIGN: left"><strong><span lang="EN-US">JSF</span></strong><strong><span style="FONT-FAMILY: 宋体">优势之六：伴随工具而生存</span></strong><span> <span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">带来了</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">编程的巨大变革，变革的强烈程度超出了很多工具厂商的预料，以至于现在可供</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">使用的工具非常缺乏。缺乏工具支持的</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">只会令人敬而远之，因此，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">在设计之初就为工具厂商预留了用武之地。在为数不多的</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">工具中，</span><span lang="EN-US">sun</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">Java Studio Creator</span><span style="FONT-FAMILY: 宋体">是一个优秀的开发环境；</span><span lang="EN-US">Borland</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">Jbuilder</span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">JSF1.1</span><span style="FONT-FAMILY: 宋体">时曾经是非常好用的开发工具，可惜现在对</span><span lang="EN-US">JSF1.2</span><span style="FONT-FAMILY: 宋体">的支持没有跟上；</span><span lang="EN-US">Eclipse</span><span style="FONT-FAMILY: 宋体">下</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的插件很多，但真正支持所见即所得的</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">插件都是收费的，例如</span><span lang="EN-US">Bea</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">Workshop for JSF</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">Exadel</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">JSF Studio</span><span style="FONT-FAMILY: 宋体">等等；此外，</span><span lang="EN-US">Oracle</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">IBM</span><span style="FONT-FAMILY: 宋体">也有</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的开发工具。随着工具的不断涌现，用</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">开发</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">程序将会越来越方便和快速。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.65pt; TEXT-ALIGN: left"><strong><span lang="EN-US">JSF</span></strong><strong><span style="FONT-FAMILY: 宋体">优势之七：全面的用户自定义支持</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">前面提到，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">将极大地简化</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">程序的开发，作为一个相对复杂的框架，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">是如何做到这点的呢？原来</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">为程序员提供了很多默认的组件和类，通常情况下，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的这些默认组件和类足以满足</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">开发的需要了。但是，考虑到在某些应用场合，框架的默认行为也许不符合业务的要求，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">特别允许程序员编写自己的组件和类，来满足客户的特殊需求。例如，程序员可以编写自己的</span><span lang="EN-US">UI</span><span style="FONT-FAMILY: 宋体">组件，甚至可以创建自己的</span><span lang="EN-US">EL</span><span style="FONT-FAMILY: 宋体">解释器，来支持非标准的</span><span lang="EN-US">EL</span><span style="FONT-FAMILY: 宋体">表达语言。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.65pt; TEXT-ALIGN: left"><strong><span lang="EN-US">JSF</span></strong><strong><span style="FONT-FAMILY: 宋体">优势之八：</span></strong><strong><span lang="EN-US">Web</span></strong><strong><span style="FONT-FAMILY: 宋体">开发的官方标准之一</span></strong><span> <span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 20.6pt; TEXT-ALIGN: left"><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">1.0</span><span style="FONT-FAMILY: 宋体">版本发布于</span><span lang="EN-US">2004</span><span style="FONT-FAMILY: 宋体">年</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体">月份，当时是作为一项独立的</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">技术推出的。经过</span><span lang="EN-US">1.1</span><span style="FONT-FAMILY: 宋体">版到现在最新的</span><span lang="EN-US">1.2</span><span style="FONT-FAMILY: 宋体">版，短短的两年多时间，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">终于在</span><span lang="EN-US">2006</span><span style="FONT-FAMILY: 宋体">年年中成为</span><span lang="EN-US">Java EE 5</span><span style="FONT-FAMILY: 宋体">的组成部分，上升为</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">开发的官方标准之一。</span><span lang="EN-US">Java EE 5</span><span style="FONT-FAMILY: 宋体">最重要的使命就是简化</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">的开发，而</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">无疑为这一使命立下了汗马功劳。在</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">框架层出不穷甚至有些泛滥成灾的今天，</span><span lang="EN-US">Sun</span><span style="FONT-FAMILY: 宋体">以</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">来树立标准，对</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">的发展是有益的。</span><span lang="EN-US">Sun</span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">领域的领袖地位不容动摇，对于</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体">程序员来说，始终追随业界领袖的步伐，也许是避免技术落伍的最好方法。</span><span> </span><span lang="EN-US" style="DISPLAY: none">1</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21.1pt; TEXT-ALIGN: left"><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 28.1pt; TEXT-ALIGN: left"><strong><span lang="EN-US" style="FONT-SIZE: 14pt">JSF</span></strong><strong><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">能否统一</span></strong><strong><span lang="EN-US" style="FONT-SIZE: 14pt">Web</span></strong><strong><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">开发模式？</span></strong><strong><span lang="EN-US" style="FONT-SIZE: 14pt"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">J2EE</span><span style="FONT-FAMILY: 宋体">下一代规范</span><span lang="EN-US">Java EE5.0</span><span style="FONT-FAMILY: 宋体">中，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">技术被放到了一个非常重要的地位，</span><span lang="EN-US">J2EE</span><span style="FONT-FAMILY: 宋体">社区试图通过</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">来统一</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">应用的开模式与方法，</span><span> </span><span style="FONT-FAMILY: 宋体">但是</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">能否担起</span><span lang="EN-US">Sun</span><span style="FONT-FAMILY: 宋体">所赋予的重任？实现</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">开发的统一？</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">很多开发人士都对</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">不抱乐观的态度，用过</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的人都称</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">是</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">开发世界的创举，</span><span> <span lang="EN-US">JSF</span></span><span style="FONT-FAMILY: 宋体">可谓墙里开花，墙外不红，是什么原因的造成如此大的反差呢？</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 26.35pt; TEXT-ALIGN: left"><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 26.35pt; TEXT-ALIGN: left"><strong><span lang="EN-US">1.</span></strong><strong><span style="FONT-FAMILY: 宋体">获取方式</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 26.25pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">书是我们获取知识第一来源，一种技术的火爆程度，我们不用在网上去做任何调查，只要去一下图书城结果就一目了然，关于</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的书籍简直是凤毛麟角，难觅终影，这样在人们在获取</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">相关资料，</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">会大打折扣，比较经典《</span><span lang="EN-US">JSF in Action</span><span style="FONT-FAMILY: 宋体">》国内还没哪家出版社有翻译动向，证明图书厂商还没有对</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">投入太多关注度。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="MARGIN-LEFT: 18pt; TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="MARGIN-LEFT: 18pt; TEXT-INDENT: 10pt; TEXT-ALIGN: left"><strong><span lang="EN-US">2</span></strong><strong><span style="FONT-FAMILY: 宋体">．中文讨论区成熟度不够</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">除了图书方面，讨论区的热度也很重要，打开</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">官方讨论区，对</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">大唱赞歌人大有人在，为什么国内这种讨论却少之又少呢？一些国内比较知名的讨论区中没有看到</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的相关技术讨论，这样从影响度上从知识的渴求度上，都限制了</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">前进脚步。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21.1pt; TEXT-ALIGN: left"><strong><span lang="EN-US">3</span></strong><strong><span style="FONT-FAMILY: 宋体">．</span></strong><strong><span lang="EN-US">Sun</span></strong><strong><span style="FONT-FAMILY: 宋体">商业策略</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US">Sun</span><span style="FONT-FAMILY: 宋体">的商业运作模式一直存在问题，我们在之前曾经预言过如果</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">不叫</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">，而叫</span><span lang="EN-US">JSP3.0</span><span style="FONT-FAMILY: 宋体">那么现在结果会如何呢？</span><span lang="EN-US">Sun</span><span style="FONT-FAMILY: 宋体">可以不费一兵一卒从而实现</span><span lang="EN-US">JSP</span><span style="FONT-FAMILY: 宋体">到</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">的合理过渡，同时也会有大批的</span><span lang="EN-US">JSP</span><span style="FONT-FAMILY: 宋体">狂热者迅速的转向</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">，也可能有些人会认为两者是不同的两种技术，但是谁又能说</span><span lang="EN-US">Asp</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">Asp.net</span><span style="FONT-FAMILY: 宋体">是两种相同的技术吗？同样的策略微软用的很成功，难道</span><span lang="EN-US">Sun</span><span style="FONT-FAMILY: 宋体">没有想到吗？</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21.1pt; TEXT-ALIGN: left"><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21.1pt; TEXT-ALIGN: left"><strong><span lang="EN-US">4</span></strong><strong><span style="FONT-FAMILY: 宋体">．开发工具的支持程度</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">这次采访袁总的时候，也提到了</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">依赖开发工具的支持，</span><span lang="EN-US">Sun</span><span style="FONT-FAMILY: 宋体">，</span><span lang="EN-US">IBM</span><span style="FONT-FAMILY: 宋体">，</span><span lang="EN-US">Orcale</span><span style="FONT-FAMILY: 宋体">都提出了对</span><span lang="EN-US">JSF</span><span style="FONT-FAMILY: 宋体">开发工具的支持，但是这些开发工具在简化开发方面是否做足了功课，宠大、全面、无所不能一直是众厂商炫耀技术的舞台，这次</span><span lang="EN-US">Apusic Studio</span><span style="FONT-FAMILY: 宋体">提出了简化，易用两方面特性，这点从程序员角度出发的开发工具，我们还是值得期待的。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 21.1pt; TEXT-ALIGN: left"><strong><span lang="EN-US">5</span></strong><strong><span style="FONT-FAMILY: 宋体">．扩大影响力</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体">每一种技术都要有忠实狂热者，同时要让更多人的来应用和学习，</span><span lang="EN-US">Struts</span><span style="FONT-FAMILY: 宋体">成功就是很好例证，一位著名</span><span lang="EN-US">IT</span><span style="FONT-FAMILY: 宋体">人士曾经说过，&ldquo;</span><span style="FONT-FAMILY: 宋体">即使公司发生惨绝人寰的人事大变动，产品经理也不必过于惊惶失措，茫茫人海中，有大批的</span><span lang="EN-US">Struts</span><span style="FONT-FAMILY: 宋体">们可供选择，只需好好考虑好新员工的业务培训如何开展即可，而对于技术延续性</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体">则不必太过于担心<span lang="EN-US">,</span>这就是</span><span lang="EN-US">Struts </span><span style="FONT-FAMILY: 宋体">带来的战略性优势<span lang="EN-US">,</span>也是<span lang="EN-US">Struts</span>在今天技术落后的情况还能一直保持领先地位，这点还是值得反思的，<span lang="EN-US">JSF</span>如何在影响上扩大学习者的基层人群，打消企业的后顾之忧，影响高层对<span lang="EN-US">JSF</span>企业框架的应用选择，不知<span lang="EN-US">JSF</span>是否做好了准备。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="TEXT-INDENT: 10pt; TEXT-ALIGN: left"><span lang="EN-US" style="FONT-FAMILY: 宋体"><o:p></o:p></span></p>
<span style="FONT-FAMILY: 宋体">综上所述只是我的个人观点，如果<span lang="EN-US">JSF</span>能在影响力和扩大人员基数上突破瓶颈，那么统一<span lang="EN-US">Web</span>开发的格局将指日可待。</span>
          <br/>
          <span style="color:red;">
            <a href="http://laies.javaeye.com/blog/126239#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6