<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>b051</title>
    <description></description>
    <link>http://b051.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>myGWT -&gt; Ext GWT 体验</title>
        <author>b051</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://b051.javaeye.com">b051</a>&nbsp;
          链接：<a href="http://b051.javaeye.com/blog/186482" style="color:red;">http://b051.javaeye.com/blog/186482</a>&nbsp;
          发表时间: 2008年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天打开onGWT的RSS一看, 啥呀, GWT EXT vs EXT GWT. 晕呼呼.<br /><br />原来是myGWT不干了, 变成了Ext下的一个项目. 一看demo, 怎么和以前0.4.3/0.5.1都不一样呢. 正好有点空, 看看能不能给我的myGWT应用升个级. 下了gxt-1.0-beta1.<br /><br />把gxt(叫这名字不好么..)引到项目cp上, 要求gwt1.5, 还好我有个gwt-mac-0.0.2415, 搞上, Make, Intellij不干活了, 50.0...49.0问题, 原来它还是用1.6打包的, 不清楚soylatte能不能行, 我对apple给的1.6p1实在不敢恭维. 心想, 算了, 自己手工给他重新编译到1.5.<br /><br />给的src目录和gxt.jar居然有些许不一样, 还要手工Mix一下, buildr起一个新项目就叫gxt. (SVN访问居然要钱?!)<br />repo里没有gwt的,我是自己放进去的, 再定义一个platform环境变量, 因为发布环境为linux嘛.<br /><pre name="code" class="ruby">GWT = group("gwt-user", "gwt-dev-#{ENV['platform']}", :under=>"com.google.code.gwt", :version=>"1.5m2")
DOM4J = [ "dom4j:dom4j:jar:1.6.1" ]
repositories.remote &lt;&lt; "http://www.ibiblio.org/maven2/"
</pre><br />为了运行explorer这个demo, 把以前写的编译方法拿过来<br /><pre name="code" class="ruby">
def gwt(projects, model)
    out_path = projects[0]._("src/main/webapp")
    cp       = projects.map { |p| p._("src/main/java") }
    # rm_rf "#{out_path}/#{model}"
    if ENV["platform"]=="mac"
      jvmarg = ["-XstartOnFirstThread", "-Xmx512M"]
    else 
      jvmarg = ["-Xmx512M"]
    end
    puts "start #{Time.now()}"
    java("com.google.gwt.dev.GWTCompiler", "-out", out_path, model, :classpath=>[cp, GWT, project("gxt")], :verbose=>true, :java_args=>jvmarg)
    puts "end #{Time.now()}"
    cp "#{out_path}/#{model}/index.html", "#{out_path}/"
  end
</pre><br />这几个samples不是按照maven的格式组织项目的, 稍微改改 cd src;mkdir -p main/java;mv com main/java<br />resources还和buildr的保留关键字冲突, cd ../..;mv resources samples-resources<br />因为GWT是直接看.java文件的, 所以需要把java也当作资源文件打在一起, 大概应该这么写:<br /><pre name="code" class="ruby">
 define "gxt" do
    compile.with GWT
    resources.from self.path_to("src/main/java")
    package :jar
  end
</pre><br />这样我打包后是1.3M.. 差不多吧. 主要是resource文件占了99%.<br />最后这个explorer的build就好写了,<br />  <pre name="code" class="ruby">
define "explorer" do
    compile.with projects("samples-resources","gxt"), GWT, DOM4J
    build do
      parent.gwt(projects("explorer", "samples-resources", "gxt"), "com.extjs.gxt.samples.explorer.Explorer")
    end
    package(:war).with(:libs=>compile.classpath)
  end
  define "samples-resources" do
    compile.with GWT, projects("gxt")
    package :jar
  end
</pre><br />buildr一把, <br /><br /><pre name="code" class="java">start 四  4 24 17:09:11 +0800 2008
Running java com.google.gwt.dev.GWTCompiler
Compiling module com.extjs.gxt.samples.explorer.Explorer
2008-04-24 17:09:20.958 java[1732:813] [Java CocoaComponent compatibility mode]: Enabled
2008-04-24 17:09:20.960 java[1732:813] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
Compilation succeeded
Linking compilation into /Users/rexsheng/sf/gxt-1.0-beta1/samples/explorer/src/main/webapp/com.extjs.gxt.samples.explorer.Explorer
end 四  4 24 17:10:23 +0800 2008</pre><br /><br />比我想得快得多...<br /><br />把Intellij的自动Make关掉, 加上个jetty启动. OK.<br />在定义一个gwt的启动, 也关掉自动Make, -noserver模式, OK.<br /><br />终于看到了http://extjs.com/explorer/一样的东西.<br /><br />代码还没看, 光是把它给的demo配置起来就用了2个多小时. 好在, 是能够跑起来了.<br /><br />后记: <br />bug还是有的. 前进后退按钮有逻辑上的bug. 但可能是1.5m2的GWT本身的.<br />没有什么值得看的升级文档, 升级以前的项目, 如履薄冰
          <br/>
          <span style="color:red;">
            <a href="http://b051.javaeye.com/blog/186482#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/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><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Apr 2008 17:41:36 +0800</pubDate>
        <link>http://b051.javaeye.com/blog/186482</link>
        <guid>http://b051.javaeye.com/blog/186482</guid>
      </item>
      <item>
        <title>JavaAdapter</title>
        <author>b051</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://b051.javaeye.com">b051</a>&nbsp;
          链接：<a href="http://b051.javaeye.com/blog/162534" style="color:red;">http://b051.javaeye.com/blog/162534</a>&nbsp;
          发表时间: 2008年02月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          rhimoo这个项目旨在用javascript来写服务器端，有点rhino on rails的意思。目前看来它还是一个刚初始的项目，但是已经可以正常运行demo了。demo包括用javascript配置并启动的jetty,和一个jjsp分析器。<br />我的兴趣只在研究它的源代码。<br /><br />关于rhino的性能，我通过这几天研究把一部分动态配置部分用rhino实现，发现只要调整jvm参数Xmx=Xms，其整体性能约为纯java的75%，我没有拿N皇后问题来测试，那个并不客观。<br /><br />我应用rhino的部分并不像rhimoo这样，让javascript来做所有事情，我只是让它做一些资源配置，让用户实现我的api，而api中你可以去写javascript的方法。就好像Facebook F8那样。<br /><br />这样做的目的是减少javascript带来的性能损失，代价是我需要在javascript中创建很多种java对象。我的做法是这样:<br /><pre name="code" class="java">
Context cx = Context.enter();
Scriptable scope = new ImporterTopLevel(cx);
cx.evaluateReader(scope, getResource("mootools/mootools-server-1.2-1331.js"), "mootools-server", 1, null);
cx.evaluateReader(scope, getResource(context + ".js"), context, 1, null);
cx.evaluateReader(scope, getResource("bootstrap.js"), "bootstrap", 1, null);
...
</pre><br />用bootstrap来做一些翻译工作。<br /><br />前几天因为这个不是主要矛盾，我就图省事把这些bean的getter,setter去掉，直接上public的字段。这样$extend(new klass(), options)就可以了。<br />后来，需要方法注入了，就把options遍历一下，从中map出$type=='function'的，然后再把class改成abstract的，最后用new klass({})就是了。<br />今天发现要这么乱改的类还真不少，而且这样做实在是丑陋哇<img src="/images/smiles/icon_wink.gif"/><br /><br />好吧，研究一下rhimoo，才发现它是用<br /><pre name="code" class="js">
new JavaAdapter(ServletHolder, {
    newInstance: function () {
        var servlet = new JavaAdapter(MooServletTemplate, methods);
        servlet.initialize();
        return servlet;
    }
});
</pre><br />来新建ServletHolder的，查了一下什么是JavaAdapter，好么，我后来做的遍历注入abstract就算白做了。一气做好了setter，把它们再改回正常面目。<br />最后发现c3p0的ComboPooledDataSource不能用JavaAdapter，原因嘛，它是final的。java可真是安全<img src="/images/smiles/icon_twisted.gif"/>咋办涅，计算它是不是final类有点过分了，干脆给一个参数得啦。<br /><pre name="code" class="js">var $adapt = function(klass, options, f) {
    var instance = $chk(f) ? new klass() : new JavaAdapter(klass, options);
    for (var k in options) {
        var value = options[k];
        if ($type(value) == 'function') continue;
        try {
            instance[k] = value;
        } catch(e1) {
            try {
                var setter = 'set' + k.capitalize();
                instance[setter](value);
            } catch(e2) {
            }
        }
    }
    return instance;
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://b051.javaeye.com/blog/162534#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/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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Feb 2008 17:29:43 +0800</pubDate>
        <link>http://b051.javaeye.com/blog/162534</link>
        <guid>http://b051.javaeye.com/blog/162534</guid>
      </item>
      <item>
        <title>Java strings and JavaScript strings</title>
        <author>b051</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://b051.javaeye.com">b051</a>&nbsp;
          链接：<a href="http://b051.javaeye.com/blog/162203" style="color:red;">http://b051.javaeye.com/blog/162203</a>&nbsp;
          发表时间: 2008年02月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在Rhino on Rails来临之前，想做做热身运动。用rhino做了一些小玩意，用javascript来配置领域模型中的策略部分。在其中发现了一个javascript和Java的String之间关于共有的split方法的一个小问题。<br />比如这样一个检测方法:<br /><pre name="code" class="js">var check = function(s) { return [].merge(s.split(/\s+/)).join(' '); };</pre><br />可以想象，直接在Rhino中运行(我加上了mootools)的结果是:<br />'a b  c  d a' => 'a b c d'<br />但如果你把它'注入'<br /><pre name="code" class="js">var c = new Check({check:check});</pre><br />到比如这样一个java类:<br /><pre name="code" class="java">public interface Check { Object check(String s); }</pre><br />然后再执行的话:<br /><pre name="code" class="js">c.check('a b  c  d a');</pre><br />那么问题就出现了，结果还是原来的字符串。<br />一步步调试，发现问题是传到Check类中的是java.lang.String。如果用split('\s+')倒是可以解决一部分问题。但是这样的配置就不透明了啊。<br />查过文档，也没有很明确地说，查过org.mozilla.javascript.NativeString类，知道了至少是有方法的，随便试了一下，如果加一句<br /><pre name="code" class="js">s=''+s</pre><br />就可以比较好的解决转换问题。<br />但依然不透明，那么只有在'注入'的时候加一点料了，<br /><pre name="code" class="js">var c = new Check({check:function(s){s=''+s;return check(s);}});</pre>
          <br/>
          <span style="color:red;">
            <a href="http://b051.javaeye.com/blog/162203#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>Thu, 14 Feb 2008 11:51:56 +0800</pubDate>
        <link>http://b051.javaeye.com/blog/162203</link>
        <guid>http://b051.javaeye.com/blog/162203</guid>
      </item>
  </channel>
</rss>