<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>fkpwolf</title>
    <description></description>
    <link>http://fkpwolf.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>在dojo中创建一个button的三种方式</title>
        <author>fkpwolf</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fkpwolf.javaeye.com">fkpwolf</a>&nbsp;
          链接：<a href="http://fkpwolf.javaeye.com/blog/182802" style="color:red;">http://fkpwolf.javaeye.com/blog/182802</a>&nbsp;
          发表时间: 2008年04月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          初学dojo，做个笔记。因为dojo的相关文档很少，官方的写的也很凌乱。 全部的代码如下： <br /><pre name="code" class="html">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
&lt;head>
	&lt;meta http-equiv="Content-type" content="text/html; charset=utf-8" />
	&lt;title>Sample 1.0.0 xdomain page&lt;/title>
	&lt;script type="text/javascript"
		djConfig="isDebug: true, parseOnLoad: true"
		src="http://o.aolcdn.com/dojo/1.0.0/dojo/dojo.xd.js">&lt;/script>
	&lt;script type="text/javascript">
		dojo.require("dijit.form.Button");
		dojo.require("dijit.InlineEditBox");
		dojo.require("dijit.form.TextBox");
		
		Commands = {
			sayHello: function(){
				var status = "Button Clicked at time: " + (new Date());
				dojo.byId("output").innerHTML = status;
				console.debug(status);
			}
		}

		dojo.addOnLoad(function(){
			dojo.connect(dojo.byId("testButton"), "onclick", Commands, "sayHello");
       			new dijit.form.Button({ "class": "large", label:"wokao",onClick:foo }, dojo.byId("id1"));
			new dijit.InlineEditBox({onChange:myHandler, autoSave:false}, 
				dojo.byId("id2"));
		});
	&lt;/script>
	&lt;script type="text/javascript">
		function foo(){
			console.debug("click foo");
		}
		function myHandler(idOfBox, value) {
          		console.debug("Edited value from "+idOfBox+" is now "+value);
       		}

	&lt;/script>
    &lt;style type="text/css">
        @import "http://o.aolcdn.com/dojo/1.0.0/dijit/themes/tundra/tundra.css";
        @import "http://o.aolcdn.com/dojo/1.0.0/dojo/resources/dojo.css";
    &lt;/style>
	
&lt;/head>
&lt;body>
	&lt;h1>Sample Dojo 1.0.0 xdomain page&lt;/h1>
	&lt;p>
		&lt;button id="testButton">Click Me&lt;/button>
	&lt;/p>
	&lt;p id="output">
	&lt;/p>
	&lt;button dojoType="dijit.form.Button" id="helloButton">Hello World!&lt;/button>
	&lt;span id="id1">&lt;/span>	
	&lt;h3 id="editable" autosave="false"
                dojoType="dijit.InlineEditBox" title="h3 example"
                onChange="myHandler(this.id,arguments[0])">
		Edit me - I trigger the onChange callback
	&lt;/h3>
	&lt;span id="id2">programatic InlineEditBox&lt;/span>

	
	
&lt;/body>
&lt;/html>

</pre><br /><br /><br />第一种是HTML的产生方式。 <br />第二种是使用dojoType的方式。可将这种方式是基于标准HTML的一种扩展，也是一种静态的方式。<br /><pre name="code" class="html">
&lt;button dojoType="dijit.form.Button" id="helloButton">Hello World!&lt;/button>
</pre><br />跟Tapestry有点类似，其优点是一般的图形化的html编辑器也可以对其进行编辑。对于这种方式，需要在dojo的配置里面设置“parseOnLoad: true”。<br />第三种是使用编程的方式（programmatically），把属性的值统一的传给构造函数。<br /><pre name="code" class="javascript">
new dijit.form.Button({ "class": "large", label:"wokao",onClick:foo }, dojo.byId("id1"));
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://fkpwolf.javaeye.com/blog/182802#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Apr 2008 10:05:56 +0800</pubDate>
        <link>http://fkpwolf.javaeye.com/blog/182802</link>
        <guid>http://fkpwolf.javaeye.com/blog/182802</guid>
      </item>
      <item>
        <title>在Netbeans 6.1中使用dojo开发自定义的JSF组件</title>
        <author>fkpwolf</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fkpwolf.javaeye.com">fkpwolf</a>&nbsp;
          链接：<a href="http://fkpwolf.javaeye.com/blog/177308" style="color:red;">http://fkpwolf.javaeye.com/blog/177308</a>&nbsp;
          发表时间: 2008年03月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3>0.准备和目的</h3>
<p>前提：netbeans 6.1 beta。</p>
<p>目的：开发一个功能最简的JSF woodstock组件。</p>
<p>准备：Firefox + FireBug插件</p>
<p>&nbsp;</p>
<h3>1。新建一个普通的JSF组件</h3>
<p>具体可以参考sun的<a href="http://www.javapassion.com/handsonlabs/jsfcustom/" target="_blank">教程</a>
，可以忽略其附加的高级功能，在IDE环境中可以很快的开发出一个标准JSF组件出来。</p>
<pre name="code" class="java">public class ImageRenderer extends javax.faces.render.Renderer{  </pre>
<p>一切皆为标准的JSF组件。Renderer可以只考虑最简单的输出，不考虑viewstate。</p>
<p>然后，因为netbeans中页面使用的是xhtml的技术，将该tag运用到其中需如下工作：</p>
<pre name="code" class="html">xmlns:k=&quot;/WEB-INF/tlds/rrr&quot;</pre>
&nbsp;
<p>这里没有考虑design-time的所需要的类。</p>
<h3>2。woodstock组件</h3>
<p>在前面的组件开发中，代码量比较大地方的在Renderer中的encodeBegin方法。这个方法主要用来产生客户端HTML代码，大量的使用了诸如如下的代码：</p>
<pre name="code" class="java">writer.startElement(&quot;img&quot;, imgComponent);
writer.writeAttribute(&quot;onClick&quot;, &quot;javascript:&quot; + postBackFuncName + &quot;(this)&quot;, null); </pre>
<p>有些类似在Servlet输出HTML用到的out.println()，这种方法较之JSP之类的模板技术显得非常的蹩脚。于是在netbeans 6中引入了dojo和json，用来将逻辑和展现分离。如今javascript框架遍地开花，server端越来越多的页面渲染的工作交给了javascript，比如Rails使用了prototype，框架的使用大大的提高了javascript的潜能和开发效率。</p>
<p><a href="https://woodstock.dev.java.net/" target="_blank">woodstock</a>
也即原来的jsf web ui，是Sun的一个JSF的实现，跟标准不同的是提供了更多的组件和AJAX support。如其button Renderer产生client html source code如下：</p>
<pre name="code" class="js">&lt;span id=&quot;j_id17&quot;&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
  webui.suntheme.widget.common._createWidget('j_id17',
  {&quot;id&quot;:&quot;form1:button2&quot;,&quot;widgetType&quot;:&quot;webui.suntheme.widget.button&quot;,
&quot;visible&quot;:true,&quot;primary&quot;:false,&quot;value&quot;:&quot;Button&quot;,
&quot;escape&quot;:true,&quot;mini&quot;:false,&quot;disabled&quot;:false});
&lt;/script&gt;&lt;/span&gt;</pre>
<p>&nbsp; 不同于一般的&lt;button name=&quot;&quot; value=&quot;&quot;/&gt;&ldquo;明文&rdquo;的形式。这里调用的函数_createWidget基于dojo的功能，而{}的属性由在server段的Renderer中的java代码组装出来(利用json API)，剩下的渲染工作都是client的浏览器中完成。</p>
<h3>&nbsp;3.将标准组件改造成woodstock组件</h3>
<p>将标准JSF组件该为webui组件</p>
<pre name="code" class="java">import com.sun.webui.jsf.renderkit.widget.RendererBase;
public class MyRenderer extends RendererBase {</pre>
<p>&nbsp;这个类注意的地方不多，只要注意getWidgetType这个方法：</p>
<pre name="code" class="java">    protected String getWidgetType(FacesContext context, UIComponent component) {
        return &quot;fan.kao&quot;;
    }</pre>
<p>&nbsp;这里返回的字符串代表新组件的名称，也是组件在dojo中的namespace。</p>
<p>&nbsp;</p>
<p>在JSP中，由于该新的组件是woodstock本身没有的，为了避免修改原有的组件库的包，需要在页面中注册这个新的组件：</p>
<pre name="code" class="js">&lt;script&gt;webui.suntheme.dojo.registerModulePath(&quot;fan&quot;,&quot;/WebApplication1&quot;);&lt;/script&gt;</pre>
<p>这样，就可以把根目录下的js文件纳入dojo的module装载路径。</p>
<p>&nbsp;至此，所有Java相关的工作已经完成，剩下的就和在dojo创建一个widget的过程一样，包括一个js文件，一个templete文件。</p>
<p>&nbsp;</p>
<p>在开发过程中，可以使用FireBug插件来调试js相关的问题，dojo也对FireBug做了相应的支持。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://fkpwolf.javaeye.com/blog/177308#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Mar 2008 16:21:35 +0800</pubDate>
        <link>http://fkpwolf.javaeye.com/blog/177308</link>
        <guid>http://fkpwolf.javaeye.com/blog/177308</guid>
      </item>
  </channel>
</rss>