<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>金蝶AOM框架</title>
    <description>金蝶AOM框架是对JSF的一种应用层面的全面拓展，有其丰富的特色：
1. 拓展MVC为IoVC（Inversion of View-Control）
2. Ajax的原生支持。
3. 基于Ext扩展出的丰富的企业级组件以及对这些组件的展现和维护提供了相当漂亮的开发平台支持。
4. Elite, the ruby of J2EE. Elite赋予了J2EE动态语言的能力

更多技术特点可访问AOM的官方网站http://www.operamasks.org</description>
    <link>http://aom.group.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>AOM中使用动态语言</title>
        <author>apusic-simba</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://apusic-simba.javaeye.com">apusic-simba</a>&nbsp;
          链接：<a href="http://aom.group.javaeye.com/group/blog/210140" style="color:red;">http://aom.group.javaeye.com/group/blog/210140</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2 class="title">在AOM中使用动态语言</h2>
<hr />
<div class="toc"><dl><dt><span class="section"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#d0e4">1. 前言</a>
</span>
</dt>
<dt><span class="section"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#d0e57">2. 在AOM中使用ELite</a>
</span>
</dt>
<dd><dl><dt><span class="section"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#d0e62">2.1. ELite的介绍</a>
</span>
</dt>
<dt><span class="section"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#d0e71">2.2. 在AOM中使用ELite</a>
</span>
</dt>
</dl>
</dd>
<dt><span class="section"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#d0e119">3. 在JSF中使用Ruby</a>
</span>
</dt>
<dd><dl><dt><span class="section"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#d0e124">3.1. Spring2带来的动态语言支持</a>
</span>
</dt>
<dt><span class="section"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#d0e129">3.2. 在JSF应用中使用JRuby</a>
</span>
</dt>
</dl>
</dd>
<dt><span class="section"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#d0e171">4. 总结</a>
</span>
</dt>
</dl>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both;"><a name="d0e4"></a>
1.&nbsp;前言</h2>
</div>
</div>
</div>
<p>随着微软正式发布IronPython，推出基于第一款基于动态语言的开源编程工具；紧接着Sun又正式对外宣布收购JRuby，Ruby将成为JVM支持的第一个动态语言，动态语言一直围绕在我们的身边。如何使用动态语言给我们编写Java
    Web UI带来帮助？什么样的动态语言能够适合Java开发团队呢？SirsiDynix的架构师Travis
    Jensen通过五条粗略的标准来评估Groovy,JRuby,Jython这三种动态语言在Java上的表现。</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>动态语言与Java之间的交互</p>
</li>
<li>
<p>IDE工具的支持</p>
</li>
<li>
<p>Java开发者的学习曲线</p>
</li>
<li>
<p>可供选择的Web框架</p>
</li>
<li>
<p>社区的支持</p>
</li>
</ul>
</div>
<p>而由此得出的结论是Groovy将是在Java
    Web开发中最适合的动态语言。在这也不对这些评价多做议论，简单的结合AOM这个JSF的实现，介绍一下几种动态语言在Java
    Web开发中的使用。在熟悉AOM的过程中，发现了ELite这种新的动态语言，由于ELite与AOM属于同一个开发团队的产品，对于这两者的配合使用也一并做了一个示例。</p>
<p>在进行以下内容的同时，需要对使用的开发环境做一个简单的介绍：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Java 2 Standard Edition (J2SE) 5.0 (JDK 1.5)或更高版本， <span class="link-external"><a href="http://java.sun.com/javase/downloads" target="_top">下载地址</a>
</span>
</p>
</li>
<li>
<p>Apusic Application Server 5.1（内置有AOM2.0和ELite0.2）<span class="link-external"><a href="http://www.apusic.com/dist/apusicAS/" target="_top">下载地址</a>
</span>
</p>
</li>
<li>
<p>Apusic OperaMasks2.0（包含有Spring2.0和AOM的Spring插件）<a href="http://www.operamasks.org/download" target="_top">下载地址</a>
</p>
</li>
<li>
<p>Apusic Studio 5.1M5 <span class="link-external"><a href="http://www.apusic.com/dist/apusicStudio/" target="_top">下载地址</a>
</span>
</p>
</li>
<li>
<p>JRuby1.1.2 <span class="link-external"><a href="http://dist.codehaus.org/jruby/" target="_top">下载地址</a>
</span>
</p>
</li>
</ul>
</div>
<p>至于对PATH或者JAVA_HOME等进行设置，这里就不一一馁述了，</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both;"><a name="d0e57"></a>
2.&nbsp;在AOM中使用ELite</h2>
</div>
</div>
</div>
<p>由于AOM中内嵌有ELite的支持，所以在使用AOM作为Web框架开发的应用中可以很方便的使用ELite这种动态语言，不管是在xhtml页面中直接当作EL表达式来使用，或者在后台Bean中直接使用ELite编写，都是非常自然和可靠的选择。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e62"></a>
2.1.&nbsp;ELite的介绍</h3>
</div>
</div>
</div>
<p>ELite的介绍还需要从EL（Expression Language）表达式语言说起，在JSP
      2.0中，推出了一种称之为Expression Language的表达式语言，主要目的是方便用户存取后台的Java Bean。在JSF
      1.1中，由于JSP 2.0 的EL不能够满足所有的需求，因此，在JSF 1.1中也定义了一套自己的EL表达式语言；幸运的是，在 JSP
      2.1与JSF 12中，这两者进行了统一，并重新命名为：Unified Expression Language，简称：EL。</p>
<p>ELite脱胎于AOM中的EL运行引擎，在JSR-252的基础上对EL表达式语言做了很大的扩充，成为了一种新的动态语言，并且ELite是一个集命令式和函数式风格为一身的面向对象的程序设计语言，既有高阶函数（first-class
      functions）、列表推导（list-comprehension）、模式匹配（pattern-matching）、延时求值（lazy-evaluation）等函数式语言所具有的语言特征，
      又具有和Java相近的语法结构，让熟悉Java的使用者便于上手。</p>
<p>目前，ELIte 已经从 OperaMasks
      中抽离出来，其项目主页为：www.sourceforge.net/projects/aom-elite，而在最新下载的Apusic
      Application Server 5.1或者最新的AOM2.0中都包含有ELite引擎。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e71"></a>
2.2.&nbsp;在AOM中使用ELite</h3>
</div>
</div>
</div>
<p>ELite本身是一个可以独立运行的动态语言引擎，如何单独使用ELite可以参见<span class="link-external"><a href="http://aom.group.javaeye.com/group/blog/170038" target="_top">http://aom.group.javaeye.com/group/blog/170038</a>
</span>
的介绍。而在AOM中使用ELite是非常简单的一件事情，建立一个Apusic
      标准工程，给当前工程添加一个带有AOM支持的web模块，这个时候就可以在这个工程中使用ELite了。具体的Apusic
      Studio以及Apusic工程的介绍，请参见<a href="http://www.operamasks.org/articles/studioProject/html_single" target="_top">http://www.operamasks.org/articles/studioProject/html_single</a>
等系列文章。通过一个简单的示例，讲解一下如何在AOM中使用ELite来进行Web应用的开发，希望能让读者对ELite的使用有一个初步的了解。</p>
<p>在WebContent目录下新建一个Facelets文件calc_elite.xhtml</p>
<pre class="programlisting">&lt;f:view xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xmlns:f=&quot;http://java.sun.com/jsf/core&quot;
  xmlns:w=&quot;http://www.apusic.com/jsf/widget&quot; xmlns:layout=&quot;http://www.apusic.com/jsf/layout&quot;
  xmlns:h=&quot;http://java.sun.com/jsf/html&quot; renderKitId=&quot;AJAX&quot;&gt;
  &lt;w:page title=&quot;Calculator&quot;&gt;
    &lt;w:form id=&quot;calc&quot; transient=&quot;true&quot;&gt;
      &lt;layout:panelGrid columns=&quot;3&quot;&gt;
        &lt;h:outputLabel for=&quot;first&quot; /&gt;
        &lt;w:textField id=&quot;first&quot; /&gt;
        &lt;h:message for=&quot;first&quot; /&gt;
        &lt;h:outputLabel for=&quot;second&quot; /&gt;
        &lt;w:textField id=&quot;second&quot; /&gt;
        &lt;h:message for=&quot;second&quot; /&gt;
        &lt;h:outputLabel for=&quot;result&quot; /&gt;
        &lt;h:outputText id=&quot;result&quot; /&gt;
      &lt;/layout:panelGrid&gt;
      &lt;br/&gt;
      &lt;layout:panelGrid columns=&quot;4&quot;&gt;
        &lt;w:button id=&quot;add&quot; /&gt;
        &lt;w:button id=&quot;subtract&quot; /&gt;
        &lt;w:button id=&quot;multiply&quot; /&gt;
        &lt;w:button id=&quot;divide&quot; /&gt;
      &lt;/layout:panelGrid&gt;
    &lt;/w:form&gt;
  &lt;/w:page&gt;
&lt;/f:view&gt;</pre>
<p>在 WEB-INF/scripts 里面有一个 calc_elite.elite 的文件，代码示例如下：</p>
<pre class="programlisting"><a name="tutorial_calc_elite_1"></a>
<img src="http://www.operamasks.org/articles/aom-elite/html_single/images/callouts/1.png" border="0" alt="1" />
@Bind @Required first::double = 22;
@Bind @Required second::double = 7;
<a name="tutorial_calc_elite_2"></a>
<img src="http://www.operamasks.org/articles/aom-elite/html_single/images/callouts/2.png" border="0" alt="2" />
@Bind @Pattern(&quot;#,##0.00&quot;) result::double;

<a name="tutorial_calc_elite_3"></a>
<img src="http://www.operamasks.org/articles/aom-elite/html_single/images/callouts/3.png" border="0" alt="3" />
@Action void add()      =&gt; result = first + second;
@Action void subtract() =&gt; result = first - second;
@Action void multiply() =&gt; result = first * second;
@Action void divide()   =&gt; result = first / second;</pre>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tbody>
<tr>
<td align="left" valign="top" width="5%"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#tutorial_calc_elite_1"><img src="http://www.operamasks.org/articles/aom-elite/html_single/images/callouts/1.png" border="0" alt="1" />
</a>
 </td>
<td align="left" valign="top">
<p>声明一个 double
            的变量，语法形式是ELite语法，但同样可以任意的利用各种Java的annotation</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#tutorial_calc_elite_2"><img src="http://www.operamasks.org/articles/aom-elite/html_single/images/callouts/2.png" border="0" alt="2" />
</a>
 </td>
<td align="left" valign="top">
<p>用到了 @Pattern 的标注，用来指定数字的显示样式。你可以参考 AOM API文档。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%"><a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html#tutorial_calc_elite_3"><img src="http://www.operamasks.org/articles/aom-elite/html_single/images/callouts/3.png" border="0" alt="3" />
</a>
 </td>
<td align="left" valign="top">
<p>声明一个@Action 方法，这个方法你还可以这样写：</p>
<pre class="programlisting">@Action void add()      {
  result = first + second;
  System.out.println(&quot;add method invoked&quot;);
}</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>那么，calc_elite.xhtml 与 calc_elite.elite 是怎样关联起来的呢？在
      operamasks.xml 中进行声明：</p>
<pre class="programlisting">&lt;view-mapping&gt;
  &lt;url-pattern&gt;/calc_elite.xhtml&lt;/url-pattern&gt;
  &lt;model-bean&gt;/WEB-INF/scripts/calc_elite.elite&lt;/model-bean&gt;
&lt;/view-mapping&gt;</pre>
<p>如果觉得在 operamasks.xml 中进行配置很繁琐，那么，还可以这样：在页面中通过&lt;om:elite&gt;标签，将
      ELite 代码片断放在其中。</p>
<pre class="programlisting">&lt;f:view xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xmlns:f=&quot;http://java.sun.com/jsf/core&quot;
  xmlns:w=&quot;http://www.apusic.com/jsf/widget&quot; xmlns:layout=&quot;http://www.apusic.com/jsf/layout&quot;
  xmlns:h=&quot;http://java.sun.com/jsf/html&quot; renderKitId=&quot;AJAX&quot; xmlns:om=&quot;http://www.apusic.com/jsf/misc&quot;&gt;
  <a name="tutorial_calc_elite_2_1"></a>
<img src="http://www.operamasks.org/articles/aom-elite/html_single/images/callouts/1.png" border="0" alt="1" />
&lt;om:elite&gt;
  &lt;![CDATA[
@Bind @Required first::double = 22;
@Bind @Required second::double = 7;
@Bind result::double = 0;

@Action add()=&gt; result = first + second;  
@Action subtract() =&gt; result = first - second;
@Action multiply() =&gt; result = first * second;
@Action divide()   =&gt; result = first / second;
  ]]&gt;
  &lt;/om:elite&gt;
  &lt;w:page title=&quot;Calculator&quot;&gt;
    &lt;w:form id=&quot;calc&quot;&gt;
      &lt;layout:panelGrid columns=&quot;3&quot;&gt;
        &lt;h:outputLabel for=&quot;first&quot; /&gt;
        &lt;w:textField id=&quot;first&quot; /&gt;
        &lt;h:message for=&quot;first&quot; /&gt;
        &lt;h:outputLabel for=&quot;second&quot; /&gt;
        &lt;w:textField id=&quot;second&quot; /&gt;
        &lt;h:message for=&quot;second&quot; /&gt;
        &lt;h:outputLabel for=&quot;result&quot; /&gt;
        &lt;h:outputText id=&quot;result&quot; /&gt;
      &lt;/layout:panelGrid&gt;
      &lt;br /&gt;
      &lt;layout:panelGrid columns=&quot;4&quot;&gt;
        &lt;w:button id=&quot;add&quot; /&gt;
        &lt;w:button id=&quot;subtract&quot; /&gt;
        &lt;w:button id=&quot;multiply&quot; /&gt;
        &lt;w:button id=&quot;divide&quot; /&gt;
      &lt;/layout:panelGrid&gt;
    &lt;/w:form&gt;
  &lt;/w:page&gt;
&lt;/f:view&gt;</pre>
<p>这个例子只是简单的介绍了一下ELite 在 AOM 中的应用，ELite能给使用者带来的绝对不仅仅是这些，希望 ELite
      能够成为您的另外一种奇妙的选择。</p>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both;"><a name="d0e119"></a>
3.&nbsp;在JSF中使用Ruby</h2>
</div>
</div>
</div>
<p>作为时下流行的动态语言Ruby来说，ROR（Ruby On
    Rails）的兴起让Ruby的风头在快速开发中独占鳌头。简单快捷，完全的面向对象是Ruby的特点，而随着JRuby的推出，在JVM上运行Ruby程序也已经成为现实，那么在使用JSF进行开发的过程中，是否也能使用Ruby这种快捷的动态语言呢？</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e124"></a>
3.1.&nbsp;Spring2带来的动态语言支持</h3>
</div>
</div>
</div>
<p>当Spring2.0
宣布推出集成动态语言的Feature，也就意味着在Java Web
开发中可以通过Spring的引入而支持动态语言的使用，Spring目前支持的动态语言有JRuby，Groovy，BeanShell三种。当一个
Web应用中集成有Spring环境，那么在这个应用中使用动态语言就是一件很自然的事情，在这里讲述一下如何在一个JSF应用中来使用动态语言
JRuby。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e129"></a>
3.2.&nbsp;在JSF应用中使用JRuby</h3>
</div>
</div>
</div>
<p>由于AOM本身也就是一个JSF实现，所以在这里就偷个懒，直接将AOM当作一个普通的JSF来进行JRuby使用的示例环境了。同样在Apusic
      Studio中建一个Apusic标准工程，给当前工程添加一个Web模块，工程和Web模块的相关配置这里也就不详细介绍，有兴趣的朋友可以通过<a href="http://www.operamasks.org/articles/aom-elite/html_single/index.html" target="_top">http://www.operamasks.org</a>
去了解工具的一些使用细则。在AOM中使用Spring非常简单，下载的AOM产品包下包含有Spring2.0以及AOM对Spring支持的插件，只需要将这些jar包加入到工程的Build
      Path中就可以了。目前最新的Apusic Studio已经提供了Spring
      IDE的支持，可以很方便的在工具中给当前工程添加Spring的依赖，即刻通过下载最新的Apusic Studio来体验一下吧。</p>
<p>在WebContent目录下新建一个Facelets文件jruby.xhtml</p>
<pre class="programlisting">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE HTML PUBLIC &quot;&quot; &quot;&quot;&gt;
&lt;f:view xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xmlns:f=&quot;http://java.sun.com/jsf/core&quot;
xmlns:w=&quot;http://www.apusic.com/jsf/widget&quot; xmlns:layout=&quot;http://www.apusic.com/jsf/layout&quot;
xmlns:ajax=&quot;http://www.apusic.com/jsf/ajax&quot; xmlns:h=&quot;http://java.sun.com/jsf/html&quot;
renderKitId=&quot;AJAX&quot;&gt;
    &lt;w:head&gt;
          &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
    &lt;/w:head&gt;
    &lt;w:page title=&quot;Insert title here&quot;&gt;
         &lt;h:form&gt;
             &lt;h:inputText value=&quot;#{myBean.text}&quot;&gt;&lt;/h:inputText&gt;
             &lt;h:commandButton action=&quot;#{myBean.click}&quot; value=&quot;Submit&quot;&gt;&lt;/h:commandButton&gt;  
             You typed: #{myBean.text}  
         &lt;/h:form&gt;
    &lt;/w:page&gt;
&lt;/f:view&gt;</pre>
<p>在这个页面中引用的后台Bean的名称为&ldquo;myBean&rdquo;，在AOM中可以很方便的用Java来编写这个Bean，但在这里不是我们的目的，我们将用JRuby来实现这个后台Bean。</p>
<p>为了使用Ruby实现这个后台Bean，我们需要一个spring-jruby的接口，在web/src的jruby包下新建一个接口IMyBeanController</p>
<pre class="programlisting">public interface IMyBeanController {  
  public String getText();  
  public void setText(String text);  
  public String click();  
}  </pre>
<p>同样在web/src的jruby包下新建一个MyBeanController.rb文件，以下是实现这个接口的Ruby代码</p>
<pre class="programlisting">require 'java'  
    
include_class 'jruby.IMyBeanController'  
 
class MyBeanController  
 include IMyBeanController  
  
  @text = nil 
  
  def setText(text)  
      @text = text  
  end    
  def getText  
      @text  
  end      
  def save  
      puts @text  
  end     
end  </pre>
<p>最后一步是在WEB-INF目录下的Spring的配置文件applicationContext.xml中定义这个后台Bean</p>
<pre class="programlisting">&lt;lang:jruby id=&quot;myBean&quot;  
 script-interfaces=&quot;jruby.MyBeanController&quot;  
script-source=&quot;classpath:jruby/MyBeanController.rb&quot; scope=&quot;request&quot;&gt;  
&lt;/lang:jruby&gt; </pre>
<p>在这个用动态语言定义的后台Bean中，也可以使用scope属性来定义它的作用域，这个示例中我们使用的是&ldquo;request&rdquo;作用域。为了能在JSF的后台Bean中使用通过Spring配置的Bean，我们需要Spring-Jsf的配合使用，关于这方面的介绍在<a href="http://www.operamasks.org/articles/magic-6/html_single" target="_top">http://www.operamasks.org/articles/magic-6/html_single</a>
这
篇文章中有很详细的介绍，在这里我们重点放在如何使用JRuby上。当然通过这种方式，我们也可以将在这里选用的动态语言改为Groovy或者
BeanShell，而Groovy与Java语言的紧密性，使得Groovy在Java程序中的使用更为简单，这里之所以没有选用Groovy来做示
例，完全是出于随机性，由于Spring对这几种动态语言的兼容，使得示例选择的语言变的不那么关键。</p>
<p>使用动态语言编写JSF的后台Bean的这种方式很有趣也很灵活，但还是有一些缺点让人觉得无奈</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>使用动态语言编写的Bean为了能与spring集成，需要实现一个Java接口。</p>
</li>
<li>
<p>对于后台Bean中的属性读写不够灵活</p>
</li>
</ul>
</div>
<p>然而使用动态语言编写后台Bean带来的好处也是显而易见的，例如修改Bean的内容后可以不用重启应用或者重新部署应用，这个好处让你眼前一亮了吧。关于如何在其他的JSF实现中使用JRuby，相信读者都已经有一个清晰的思路了。</p>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both;"><a name="d0e171"></a>
4.&nbsp;总结</h2>
</div>
</div>
</div>
<p>以
上两节只是简单介绍了一下如何在AOM中使用ELite和JRuby两种动态语言，由于ELite与AOM的同源同宗，所以在AOM中使用ELite显得
更为自然，更为简单，而ELite的强大也让基于AOM的Web开发变得更为灵活，同样的Spring对动态语言的支持，让动态语言的适应性得到了加强。</p>
<p>在Java
    Web编程中使用动态语言的特性可以显著降低Java编程的规模，并且动态语言的领域性和Java的健壮性可以让你的Java程序具有更多的平台特性。</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://aom.group.javaeye.com/group/blog/210140#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 14:14:11 +0800</pubDate>
        <link>http://aom.group.javaeye.com/group/blog/210140</link>
        <guid>http://aom.group.javaeye.com/group/blog/210140</guid>
      </item>
      <item>
        <title>AOM组件规范（试行版）</title>
        <author>apusic-simba</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://apusic-simba.javaeye.com">apusic-simba</a>&nbsp;
          链接：<a href="http://aom.group.javaeye.com/group/blog/210139" style="color:red;">http://aom.group.javaeye.com/group/blog/210139</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1 class="title">AOM组件规范</h1>
<hr />
<div class="toc"><dl><dt><span class="chapter"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e4">1. 版本历史</a>
</span>
</dt>
<dt><span class="chapter"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e33">2. 组件使用</a>
</span>
</dt>
<dd><dl><dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e36">2.1. 组件体系</a>
</span>
</dt>
<dd><dl><dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e79">2.1.1. 可视组件</a>
</span>
</dt>
<dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e85">2.1.2. 非可视组件</a>
</span>
</dt>
</dl>
</dd>
<dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e91">2.2. 组件类</a>
</span>
</dt>
<dd><dl><dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e98">2.2.1. 组件属性</a>
</span>
</dt>
<dd><dl><dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e101">2.2.1.1. 属性命名规则</a>
</span>
</dt>
</dl>
</dd>
</dl>
</dd>
<dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e267">2.3. 组件事件</a>
</span>
</dt>
<dd><dl><dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e281">2.3.1. UI事件</a>
</span>
</dt>
<dd><dl><dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e286">2.3.1.1. 在客户端侦听并响应UI事件</a>
</span>
</dt>
<dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e304">2.3.1.2. 在服务器端侦听并响应UI事件</a>
</span>
</dt>
<dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e380">2.3.1.3. 客户端侦听方法与服务器端侦听器的执行关系</a>
</span>
</dt>
</dl>
</dd>
<dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e385">2.3.2. 模型事件</a>
</span>
</dt>
</dl>
</dd>
<dt><span class="section"><a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#d0e392">2.4. transient属性</a>
</span>
</dt>
</dl>
</dd>
</dl>
</div>
<div class="chapter" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="d0e4"></a>
Chapter&nbsp;1.&nbsp;版本历史</h2>
</div>
</div>
</div>
<div class="table"><a name="d0e7"></a>
<p class="title"><strong>Table&nbsp;1.1.&nbsp;Apusic Operamasks组件规范 Version 0.1</strong>
</p>
<div class="table-contents">
<table border="1" summary="Apusic Operamasks组件规范 Version 0.1">
<tbody>
<tr>
<td align="center">规范版本号</td>
<td>0.1</td>
</tr>
<tr>
<td align="center">最后更新</td>
<td>2008年6月6日</td>
</tr>
<tr>
<td align="center">版本说明</td>
<td>初始版本</td>
</tr>
<tr>
<td align="center">起草人</td>
<td>Patrick</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="chapter" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="d0e33"></a>
Chapter&nbsp;2.&nbsp;组件使用</h2>
</div>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both;"><a name="d0e36"></a>
2.1.&nbsp;组件体系</h2>
</div>
</div>
</div>
<p>AOM2.0中常用组件约70多个（未包括图表类组件与JSF原生组件），在设计时已按照其功能特性分别归类到以下命名空间中：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p><strong>http://www.apusic.com/jsf/widget ：.&nbsp;</strong>
此命名空间中的组件大部分是常用的界面组件，通过这些组件可以快速的搭建应用程序。同时此命名空间中也提供了一些用于展现风格控制，页结构声明等场景的非可视化组件。下文中属于此命名的组件将以w:为命名空间前缀</p>
</li>
<li>
<p><strong>http://www.apusic.com/jsf/layout ：.&nbsp;</strong>
此命名空间中包含了一系列布局组件，通过使用这些布局组件，可以方便、灵活的对页面进行布局。下文中属于此命名的组件将以layout:为命名空间前缀。</p>
</li>
<li>
<p><strong>http://www.apusic.com/jsf/ajax ：.&nbsp;</strong>
此命名空间中包含了一组实用的ajax工具组件，可以很容易的为系统增加ajax特性。下文中属于此命名的组件将以ajax:为命名空间前缀。</p>
</li>
<li>
<p><strong>http://www.apusic.com/jsf/misc ：.&nbsp;</strong>
此命名空间中包含了与服务器端逻辑声明相关的一些标签。下文中属于此命名的组件将以om:为命名空间前缀。</p>
</li>
</ul>
</div>
<p>由于命名空间本身会影响到用户的编程体验与设计工具的布局，因此在这里采用了较粗粒度的分类。对于AOM中的组件还可以从以下角度进行分类：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>从页面组件是否关联到JSF的实体组件类（UIComponent的子类）来分类。
关联到组件类的页面组件（下文称为实体组件）将在服务器端组件树中创建对应的组件类，由AOM引擎来维护其组件树层次结构、状态恢复、模型绑定等特性。而
没有关联到组件类的页面组件（下文简称为非实体组件）在服务器端组件树中不存在对应的实体组件类，自然也无法在模型对象中绑定此类组件的组件类。</p>
</li>
<li>
<p>从
页面组件的可视化功能进行分类。从可视化特性来划分，组件可以大体分为可视组件与非可视组件。可视组件将对应最终呈现页面上的一块区域，并在其中展现其内
容。非可视组件则主要负责声明与功能行为，其自身在页面上不可见。但非可视组件仍可能对最终呈现的效果产生影响。例如&lt;w:
forEach&gt;、&lt;w:stylesheet&gt;等组件。</p>
<p>大部分可视组件属于实体组件，但也存在例外，非实体
的可视组件往往是一个结构性实体组件的子组件，例如&lt;w:dataGrid&gt;的&lt;w:outputColumn&gt;组件，或
&lt;w:panelGrid&gt;的&lt;w:cell&gt;组件等等。</p>
</li>
</ul>
</div>
<p>下面将对可视组件与非可视组件按照其功能再作进一步的分类。这里仅列出各类组件的标签名称，组件的具体作用请参考组件文档。进行这种分类有助于下文对组件的共性与各类规则的描述。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e79"></a>
2.1.1.&nbsp;可视组件</h3>
</div>
</div>
</div>
<p>下表列出了AOM2.0支持的可视组件标签，同时列出实体组件所对应的组件类。若标签没有指明组件类，则此标签为非实体组件。</p>
<div><img src="http://www.operamasks.org/articles/rcspec/html_single/images/AOM_visual_comp.png" alt="" />
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e85"></a>
2.1.2.&nbsp;非可视组件</h3>
</div>
</div>
</div>
<p>下表列出了AOM2.0支持的非可视组件标签，同时列出实体组件所对应的组件类。若标签没有指明组件类，则此标签为非实体组件。</p>
<div><img src="http://www.operamasks.org/articles/rcspec/html_single/images/AOM_nonvisual_comp.png" alt="" />
</div>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both;"><a name="d0e91"></a>
2.2.&nbsp;组件类</h2>
</div>
</div>
</div>
<p>在页面中使用标签放置的实体组件，都对应一个服务器端组件类的实例。这个组件类实例可通过标签的bind属性或IoVC的@Bind标注与ManagedBean中的属性进行绑定，在ManagedBean中通过组件类的API进行各种操作。</p>
<p>一般来说，可视组件类的命名规则应为&ldquo;UI&rdquo;加上首字大写的页面标签名。例如&lt;w:button&gt;对应的组件类是UIButton。
<a href="http://www.apusic.com/jsf/ajax" target="_blank">http://www.apusic.com/jsf/ajax</a>命名空间下的组件类以&ldquo;Ajax&rdquo;开头加上首字大写的页面标签名（此包下的可视组件亦以此
规则为准），例如&lt;ajax:updater&gt;的组件类是AjaxUpdater。非可视组件类的命名为首字大写的页面标签名。上一节的列表
中列出了与组件标签对应的组件类，对于不符合以上命名规则的组件类，用橙色标出。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e98"></a>
2.2.1.&nbsp;组件属性</h3>
</div>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e101"></a>
2.2.1.1.&nbsp;属性命名规则</h4>
</div>
</div>
</div>
<p>本节列出一些常见属性的命名规则，描述中使用以下术语：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>以...为前缀：表示名称以某字符串开头，不应改变其大小写。</p>
</li>
<li>
<p>以...为标识：表示名称中应包含某字符串，若其位于名称开头，应首字小写，否则，应首字大写。</p>
</li>
<li>
<p>以...命名：表示应以此字符串作为名称，不应改变其大小写。</p>
</li>
</ul>
</div>
<p>常见属性的命名遵循以下规则：</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>可见性属性：</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>rendered属性表示此组件是否被渲染。目前所有组件均有此属性，但应注意此属性不支持在ajax环境下动态修改，需要配合&lt;ajax:updater&gt;使用。</p>
</li>
<li>
<p>visible属性表示此组件会被渲染时在客户端设定的可见性。</p>
<p>* 目前违反此规则的属性与对应组件有：</p>
<pre class="programlisting">hidden : outputColumn idColumn</pre>
</li>
<li>
<p>组件部件的可见性，以前缀show加上首字大写部件为名称的属性表示是否显示此部件。</p>
<p>* 目前违反此规则的属性和对应组件有：</p>
<pre class="programlisting">border           : accordionLayout columnLayout tree iframe tabLayout borderLayout tableLayout editDataGrid gridLayout panelBox cardLayout panelGrid dataGrid window absoluteLayout panel
footer           : cardLayout accordionLayout columnLayout tree dataGrid tabLayout borderLayout window tableLayout editDataGrid panel absoluteLayout
frameborder      : iframe
header           : accordionLayout columnLayout tree tabLayout borderLayout tableLayout editDataGrid cardLayout dataGrid outputColumn window idColumn absoluteLayout panel 
hideBorders      : cardLayout accordionLayout columnLayout tree dataGrid tabLayout borderLayout window tableLayout editDataGrid panel absoluteLayout 
hideCollapseTool : cardLayout accordionLayout columnLayout tree dataGrid tabLayout borderLayout window tableLayout editDataGrid panel absoluteLayout 
hideHeaders      : dataGrid editDataGrid 
hideLabel        : checkBox numberField textField combo timeField dateField textArea calcNumberField simpleHtmlEditor 
hideParent       : cardLayout accordionLayout columnLayout tree dataGrid tabLayout borderLayout window tableLayout editDataGrid panel absoluteLayout 
hideTrigger      : combo timeField dateField 
drawArrow        : textAnnotation 
drawBaseLine     : xAxis axis yAxis 
drawGridLine     : xAxis axis yAxis 
drawItemLabel    : compositeChart scatterChart timeDataItem curveAreaChart lineChart chart areaChart curveChart xyDataItem functionItem histogramDataItem barChart radarChart pieChart dataItem 
drawLine         : xAxis axis yAxis 
drawLines        : curveChart functionItem xyDataItem timeDataItem curveAreaChart lineChart histogramDataItem dataItem 
drawMarkers      : curveChart functionItem xyDataItem timeDataItem curveAreaChart lineChart histogramDataItem dataItem 
drawOutline      : compositeChart scatterChart timeDataItem curveAreaChart lineChart chart areaChart curveChart xyDataItem functionItem histogramDataItem barChart radarChart pieChart dataItem 
drawTickLabels   : xAxis axis yAxis 
drawTickMarks    : xAxis axis yAxis</pre>
</li>
</ul>
</div>
</li>
<li>
<p>有效性属性：</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>disabled属性用于决定组件自身的有效性；</p>
</li>
<li>
<p>根据组件有效性设置而生效的属性，以enabled或disabled为前缀。例如disabledClass等。</p>
</li>
<li>
<p>动作的有效性使用动词的able形式。例如editable，closable等；</p>
</li>
<li>
<p>特性或子部件的有效性使用&ldquo;enableXXX&rdquo;形式，例如enableColumnMove等。</p>
<p>目前违反此规则的属性和对应组件有：</p>
<pre class="programlisting">maskDisabled : cardLayout accordionLayout columnLayout tree dataGrid tabLayout borderLayout window tableLayout editDataGrid panel absoluteLayout</pre>
</li>
<li>
<p>表示是否需要引擎提供支持（更新，回调，注入等）的属性，使用require为前缀。</p>
<p>目前违反此规则的属性和对应组件有：</p>
<pre class="programlisting">updateAble : treeNode</pre>
</li>
</ul>
</div>
</li>
<li>
<p>可接受性属性：</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>表示允许接受某种子组件或输入值的属性，使用allow为前缀。例如allowChildren。</p>
</li>
<li>
<p>具体列出允许或不允许的取值的属性，使用allowed或disallowed为前缀。</p>
</li>
<li>
<p>readOnly属性表示是否允许用户输入。</p>
<p>目前违反此规则的属性和对应组件有：</p>
<pre class="programlisting">readonly: chooseSkin dateMenu slider datePicker button</pre>
</li>
</ul>
</div>
</li>
<li>
<p>有序属性：</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>表示&ldquo;排序前一位&rdquo;或&ldquo;上一次&rdquo;的属性使用prev为前缀。例如&lt;w:pagingToolbar&gt;的prevText。</p>
</li>
<li>
<p>表示&ldquo;排序后一位&rdquo;或&ldquo;下一次&rdquo;的属性使用next为前缀。</p>
</li>
<li>
<p>表示第一位或第一次的属性使用first为前缀。</p>
</li>
<li>
<p>表示最后一位或最后一次的属性使用last为前缀。</p>
</li>
<li>
<p>表示显示位置的前面使用before为前缀。例如&lt;w:pagingToolbar&gt;的beforePageText。表示显示位置的后面使用after为前缀。</p>
</li>
</ul>
</div>
</li>
<li>
<p>统计量属性：</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>表示最大值的属性，在不引起歧义的情况下，可使用maximum作为属性名。若同一组件可设定多种最大值，组件自身取值的最大值使用maxValue作为属性名，其它表示最大值的属性应以max为前缀。</p>
</li>
<li>
<p>表示最小值的属性，在不引起歧义的情况下，可使用minimum作为属性名。若同一组件可设定多种最小值，组件自身取值的最小值使用minValue作为属性名，其它表示最大值的属性应以min为前缀。</p>
</li>
</ul>
</div>
</li>
<li>
<p>信息属性：</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>标题统一以title命名（或前缀）。</p>
<p>目前违反此规则的属性和对应组件有：</p>
<pre class="programlisting">captionClass : panelGrid gridLayout 
captionStyle : panelGrid gridLayout</pre>
</li>
<li>
<p>表示组件的标签性提示信息的属性，以label为标识。（注，以xxx为标识指属性名中包含此字符串，若其并非开头，应按照java                 bean属性命名规则首字大写。下同。）</p>
</li>
<li>
<p>表示跟随鼠标弹出提示信息的属性，以tip为标识。</p>
</li>
<li>
<p>表示正常情况下提示信息的属性，以text为标识。例如：emptyText</p>
</li>
<li>
<p>表示出错提示信息（包括未符合其他属性所指定的条件）的属性，以message为标识。</p>
<p>目前违反上述两项的属性和对应组件有：</p>
<pre class="programlisting">blankText            : numberField textField combo timeField dateField textArea calcNumberField
disabledDatesText    : dateField
disabledDaysText     : dateField
invalidText          : checkBox numberField textField combo timeField dateField textArea calcNumberField simpleHtmlEditor
maxLengthText        : numberField textField combo timeField dateField textArea calcNumberField
maxText              : numberField timeField dateField calcNumberField
minLengthText        : numberField textField combo timeField dateField textArea calcNumberField
minText              : numberField timeField dateField
nanText              : numberField calcNumberField
regexText            : numberField textField combo timeField dateField textArea calcNumberField
valueNotFoundText    : combo timeField
vtypeText            : numberField textField combo timeField dateField textArea calcNumberField

completeMessage      : fileUploadProgress
startMessage         : fileUploadProgress
uploadingMessage     : fileUploadProgress</pre>
</li>
</ul>
</div>
</li>
<li>
<p>样式属性：</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>背景颜色属性统一命名为bgcolor。与背景相关的属性统一以bg为前缀</p>
<pre class="programlisting">backgroundAlpha      : scatterChart compositeChart curveChart curveAreaChart lineChart barChart chart radarChart pieChart areaChart 
backgroundColor      : scatterChart compositeChart legend curveChart title curveAreaChart lineChart barChart chart radarChart pieChart areaChart 
backgroundImage      : scatterChart compositeChart curveChart curveAreaChart lineChart barChart chart radarChart pieChart areaChart 
backgroundImageAlpha : scatterChart compositeChart curveChart curveAreaChart lineChart barChart chart radarChart pieChart areaChart 
backgroundImagePosition : scatterChart compositeChart curveChart curveAreaChart lineChart barChart chart radarChart pieChart areaChart</pre>
</li>
<li>
<p>与CSS Class相关的属性以class为标识（不应称为XXXStyleClass）。</p>
<pre class="programlisting">contentStyleClass    : panelBox
startStyleClass      : status
stopStyleClass       : status
styleClass           : drawImage form chart simpleDataGrid gridLayout separator toolBar menuItem pieChart menu idColumn fileUpload radioMenuItem scatterChart compositeChart checkMenuItem menuBar curveAreaChart updater lineChart cell status commandMenuItem areaChart linkMenuItem chooseSkin curveChart panelBox panelGrid dataView slider page barChart progressBar outputColumn renderGroup radarChart logger</pre>
</li>
<li>
<p>与CSS Style相关的属性以style为标识。组件自身的CSS                 Style的属性命名为style。</p>
</li>
</ul>
</div>
</li>
<li>
<p>连接属性：</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>对外部网址的引用属性（不经JSF导航规则处理），使用href命名。</p>
</li>
<li>
<p>对会经过JSF导航规则处理的地址引用，使用url命名。</p>
</li>
</ul>
</div>
</li>
</ol>
</div>
</div>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both;"><a name="d0e267"></a>
2.3.&nbsp;组件事件</h2>
</div>
</div>
</div>
<p>AOM中存在着多种事件，包括请求生命周期事件，组件事件，应用事件等。本文只对组件事件进行规范。</p>
<p>根据组件事件的发起位置，可以分为UI（User Interface）事件和模型事件两类：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>UI事件：指跟UI相关并由用户的操作而产生的事件。例如一个&lt;w:button&gt;组件的onclick事件，或一个&lt;w:textField&gt;组件的onchange事件等。</p>
</li>
<li>
<p>模型事件：指跟UI无关，主要由于组件模型自身机制而产生的事件。例如dataGrid在装载数据时所广播的ondataload事件。</p>
</li>
</ul>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e281"></a>
2.3.1.&nbsp;UI事件</h3>
</div>
</div>
</div>
<p>根据UI事件侦听逻辑的执行位置，可以分为客户端侦听与服务器端侦听两种。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e286"></a>
2.3.1.1.&nbsp;在客户端侦听并响应UI事件</h4>
</div>
</div>
</div>
<p>客户端的侦听逻辑通过组件属性暴露，若需要在客户端侦听并响应UI事件，应在组件的事件属性中使用客户端脚本（javascript）编写侦听逻
辑。事件属性的命名应为&ldquo;on&rdquo;开头后续全小写的事件名称，例如&lt;w:button
onclick=&quot;...&quot;&gt;。事件属性的取值应为String类型，或结果为String类型的EL表达式，取值为javascript代码，代
码前可以加上javascript:标识，也可以忽略。因此，在AOM中以下三种写法是等价的：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<pre class="programlisting">页面：
&lt;w:button onclick=&quot;alert('I am clicked');&quot;/&gt;</pre>
<p>&nbsp;</p>
</li>
<li>
<pre class="programlisting">页面：
&lt;w:button onclick=&quot;#{bean.clickedJs}/&gt;

ManagedBean：
public String getClickedJs() {
    return &quot;javascript:alert('I am clicked');&quot;
}</pre>
<p>&nbsp;</p>
</li>
<li>
<pre class="programlisting">页面：
&lt;w:button onclick=&quot;#{bean.clickedJs()}/&gt;

ManagedBean：
public String clickedJs() {
    return &quot;alert('I am clicked');&quot;
}</pre>
</li>
</ul>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e304"></a>
2.3.1.2.&nbsp;在服务器端侦听并响应UI事件</h4>
</div>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h5 class="title"><a name="d0e307"></a>
2.3.1.2.1.&nbsp;静态定义服务器端侦听方法</h5>
</div>
</div>
</div>
<p>在AOM中，所有在客户端执行的事件都可通过&lt;ajax:action&gt;标签转变为在服务器端执行，根据下面规则：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>&lt;ajax:action&gt;作为UI组件的子组件，侦听其父组件的UI事件，并引起页面提交，触发服务器端处理逻辑。               可使用以下三种方式之一指定&lt;ajax:action&gt;所侦听的事件：</p>
<div class="orderedlist">
    <ol type="1">
<li>
<p>使用&lt;ajax:action&gt;标签的event属性指定事件名称。</p>
<pre class="programlisting">&lt;w:textField id=&quot;txt&quot;&gt;
    &lt;ajax:action event=&quot;onblur&quot; action=&quot;#{bean.txtBlurAction}&quot;/&gt;
&lt;/w:textField&gt;</pre>
</li>
<li>
<p>使用@Action或@ActionListener标注在ManagedBean上作IoVC绑定，用标注的event属性指定事件名称指定。</p>
<pre class="programlisting">页面代码：
&lt;w:textField id=&quot;txt&quot;/&gt;

ManagedBean：
@Action(id = &quot;txt&quot;, event = &quot;onblur&quot;)
public void txtBlurAction()</pre>
<p>注：@ActionListener与@Action作用相同，但@ActionListener标注的方法还可接收一个类型为javax.faces.event.ActionEvent的参数，获取触发此侦听方法的事件实例。例如：</p>
<pre class="programlisting">@ActionListener(id = &quot;btn1&quot;)
private void action1(ActionEvent event) {
    System.out.println(&quot;action1 called by &quot; + event.getSource().getClass());
}
    
@ActionListener(id = &quot;btn1&quot;)
private void action2() {
    System.out.println(&quot;action2 called&quot;);
}</pre>
<p>单击页面中所绑定的&lt;w:button id=&quot;btn1&quot;/&gt;按钮，得到的输出为：</p>
<pre class="programlisting">action1 called by class org.operamasks.faces.component.widget.UIButton
action2 called</pre>
<p>使用@ActionListener可为一个组件绑定多个侦听方法，但这些侦听方法执行顺序未作定义。此外，使用标签@ActionListeners应可为多个组件事件指定同一个侦听方法：</p>
<pre class="programlisting">@ActionListeners({
    @ActionListener(id = &quot;btn1&quot;),
    @ActionListener(id = &quot;btn2&quot;)})
private void action(ActionEvent event) {
    System.out.println(&quot;action called by &quot; + ((UIComponent)event.getSource()).getId());
}</pre>
</li>
<li>
<p>使用@Action或@ActionListener标注在ManagedBean上作IoVC绑定，由被标注方法的命名约定&ldquo;&lt;UI组件id&gt;_&lt;侦听事件名称&gt;&rdquo;指定。</p>
<pre class="programlisting">页面代码：
&lt;w:textField id=&quot;txt&quot;/&gt;

ManagedBean：
@Action
public void txt_onblur()</pre>
</li>
</ol>
    </div>
</li>
<li>
<p>服务器端侦听方法可使用以下两种方式之一指定（示例同上）：</p>
<div class="orderedlist">
    <ol type="1">
<li>
<p>使用&lt;ajax:action&gt;标签的action属性指定类型为MethodExpression的统一EL表达式。</p>
</li>
<li>
<p>使用@Action或@ActionListener标注在ManagedBean中绑定侦听方法。</p>
</li>
</ol>
    </div>
<p>服务器端侦听方法允许使用以下两种签名之一：</p>
<div class="itemizedlist">
    
<ul type="circle">
<li>
<p>无参数</p>
</li>
<li>
<p>带一个类型为AjaxEvent的参数。AjaxEvent接口定位为：</p>
<pre class="programlisting">/**
 * 获取触发事件的UI组件
 */
public UIComponent getSource();

/**
 * 获取本事件的相关参数
 */
public Map&lt;String, Object&gt; getParams();</pre>
</li>
</ul>
</div>
</li>
</ul>
</div>
<p>注：计划加入支持静态定义AjaxActionListener的方式（关于AjaxActionListener接口详见<a href="http://www.operamasks.org/articles/rcspec/html_single/index.html#dynamiclistener">Section&nbsp;2.3.1.2.2, &ldquo;动态定义服务器端侦听器&rdquo;</a>
），但具体方案仍在设计中。初定在UI组件标签中加入名为&ldquo;&lt;事件名称&gt;Listener&rdquo;的属性，用于指定结果类型为AjaxActionListener的统一EL表达式。例如可通过以下代码加入一个onclick事件的服务器端侦听器：</p>
<pre class="programlisting">&lt;w:button id=&quot;btn&quot; onclickListener=&quot;#{mylistener}&quot;/&gt;</pre>
<p>其中mylistener是一个实现了AjaxActionListener接口的ManagedBean。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h5 class="title"><a name="d0e373"></a>
2.3.1.2.2.&nbsp;动态定义服务器端侦听器</h5>
</div>
</div>
</div>
<p>在AOM中，可通过组件类实例的addFacesListener(FacesListener
listener)方法动态加入一个服务器端侦听器。传入的listener应为AjaxActionListener接口的实现类。
AjaxActionListener接口暴露以下方法：</p>
<pre class="programlisting">public interface AjaxActionListener extends javax.faces.event.FacesListener {
   /**
    * 返回此侦听器所侦听的事件名称
    */
   Set&lt;String&gt; getListeningEvents();

   /**
    * 事件被触发时的处理逻辑
    */
   void process(AjaxEvent event);
}</pre>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e380"></a>
2.3.1.3.&nbsp;客户端侦听方法与服务器端侦听器的执行关系</h4>
</div>
</div>
</div>
<p>若一个组件的一个事件同时定义了客户端侦听方法与服务器端侦听器，执行顺序为：事件触发时，首先在客户端执行客户端侦听方法，若此方法顺利执行并返
回true（若方法无返回值，默认为true），则提交页面，执行服务器端侦听器逻辑。若客户端侦听方法显式返回false，则不会提交页面，自然也不执
行服务器端侦听器逻辑。</p>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e385"></a>
2.3.2.&nbsp;模型事件</h3>
</div>
</div>
</div>
<p>由于组件模型自身机制而产生的事件称为模型事件，此类事件统一以消息总线（MessageBus）的形式进行处理。例如以下代码定义了id为grid的DataGrid组件的ondataload事件的侦听方法：</p>
<pre class="programlisting">@EventListener(&quot;grid_ondataload&quot;)
private void ondataload(AjaxEvent event) {
   ...
}</pre>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both;"><a name="d0e392"></a>
2.4.&nbsp;transient属性</h2>
</div>
</div>
</div>
<p>所有UI组件均具有transient属性，在AOM中，此属性为false（默认）指UI组件将保存完整ViewState信息，为true表明
此UI组件只保存无法从faces页面重建的部分ViewStateView。由于ViewState本身对用户透明，因此对于任一组件，除非需要在运行
期动态修改其子组件树结构，否则该组件在transient属性为true时的渲染结果和行为应与transient属性为false时一致。</p>
<p>若需要让transient属性为true的组件支持动态子组件树，需要将其置于&lt;om:stateAware&gt;组件之中：</p>
<pre class="programlisting">&lt;om:stateAware deep=&quot;true&quot;&gt;
    &lt;ajax:updater binding=&quot;#{DynamicPageBean.updater}&quot;&gt;
          &lt;layout:panelGrid binding=&quot;#{DynamicPageBean.panelGrid}&quot; columns=&quot;1&quot; border=&quot;1&quot;&gt;
          &lt;/layout:panelGrid&gt;
    &lt;/ajax:updater&gt;
&lt;/om:stateAware&gt;</pre>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://aom.group.javaeye.com/group/blog/210139#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 14:13:16 +0800</pubDate>
        <link>http://aom.group.javaeye.com/group/blog/210139</link>
        <guid>http://aom.group.javaeye.com/group/blog/210139</guid>
      </item>
      <item>
        <title>AOM2 组件介绍（一）：DataGrid</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://aom.group.javaeye.com/group/blog/195655" style="color:red;">http://aom.group.javaeye.com/group/blog/195655</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DataGrid 应该是最常用的组件之一，第一篇我们先来介绍AOM2组件之DataGrid.<br /><br />我们先来回顾下之前的做法：<br /><pre name="code" class="java">
@Bind
private List&lt;user> grid;
</pre><br /><br />然后直接在页面上编码，显示数据。<br /><pre name="code" class="xml">
&lt;w:datagrid paged="true" rows="20" id="users" contextmenu="true" toolbarposition="top" var="user">
  &lt;w:outputcolumn header="用户名" value="#{user.username}">
  &lt;w:outputcolumn header="电子邮件" value="#{user.email}">
&lt;/w:outputcolumn>
</pre><br /><br />AOM2的对DataGrid 进行了重新设计，主要通过ViewProvider,RowDataProvider分类提供视图和数据的展示<br /><br /><br />一起来实践：<br /><br />新建一Faces 页面 grid.xml。<br /><pre name="code" class="xml">
&lt;f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:w="http://www.apusic.com/jsf/widget" xmlns:layout="http://www.apusic.com/jsf/layout" xmlns:ajax="http://www.apusic.com/jsf/ajax" renderkitid="AJAX">
	&lt;w:head>
		
	&lt;/w:head>
	&lt;w:page title="Grid Demo">
		&lt;w:datagrid id="grid">
	&lt;/w:datagrid>
&lt;/w:page>
</pre><br /><br />很简单，就写了一行代码<br /><pre name="code" class="xml">
&lt;w:dataGrid id="grid"/>
</pre><br /><br />在GridBean 中新建一UIDataGrid，并绑定到id为grid的页面组件<br /><pre name="code" class="java">
@Bind
private UIDataGrid grid;
</pre><br /><br />新建一个class:User.java用来展示数据<br /><pre name="code" class="java">
public class User {
	private String id;
	private String name;
	private String email;
        //getter and setter ...

        public User(String id, String name, String email) {
		super();
		this.id = id;
		this.name = name;
		this.email = email;
	}

	public User() {

	}
        //顺手写几个测试数据，用于下面的测试
	public static List&lt;User> samples(){
		List&lt;User> users = new ArrayList&lt;User>();
		users.add(new User("1","AAA","a@g.com"));
		users.add(new User("2","bbb","b@g.com"));
		users.add(new User("3","CCC","c@g.com"));
		users.add(new User("4","ddd","d@g.com"));
		users.add(new User("5","EEE","e@g.com"));
		users.add(new User("6","fff","f@g.com"));
		return users;
	}
}
</pre><br /><br />新增value属性，就是这个grid的数据来源。<br /><pre name="code" class="java">
@Bind(id = "grid", attribute = "value")
private List&lt;User> users = User.samples();
</pre><br /><br />新增viewProvider属性，这个属性是grid视图展示的一个提供者，包括 Grid的数据列模型，Grid表头的描述模型 等，可以通过viewProvider来设置显示的名称，宽度，是否可以排序，转换类型，对齐方式，以及是否是隐藏列。还可以配置显示复杂的表头，譬如合并多行/多列等<br /><pre name="code" class="java">
	@Bind(id = "grid", attribute = "viewProvider")
	private GridViewProvider viewProvider = new GridViewProvider() {
                //GridViewProvider 是一接口，需要我们实现如下三个方法
                //getColumnModel 为Grid的数据列模型，
		public GridColumnModel getColumnModel(Object input) {
			GridColumnModel model = new GridColumnModel();
                        //新增列，指定id为name
			GridColumn column = new GridColumn("name");
                        //指定宽度为150
                        column.setWidth(150);
                        //可以排序
			column.setEnableSort(true);
                        //添加到grid的数据模型 
			model.addColumn(column);

                        //新增列，指定id为email
			column = new GridColumn("email");
			model.addColumn(column);

                        //新增列，指定id为id
			column = new GridColumn("id");
                        //并将该列设置为隐藏列
			column.setHidden(true);
			model.addColumn(column);
                        
                        //在展示数据的时候，显示行号 
			model.setShowRowNumber(true);
			return model;
		}

		public GridHeaderModel getHeaderModel(Object input) {
			GridHeaderModel model = new GridHeaderModel();
			GridHeader header = new GridHeader();
			GridHeaderCell cell;
                        //新增列的头单元，并命名为"名称" 
			cell = new GridHeaderCell("名称");
			header.addCell(cell);
                        //新增列的头单元，并命名为"电子邮件"    
			cell = new GridHeaderCell("电子邮件");
			header.addCell(cell);
			model.addHeader(header);
			return model;
		}

		public GridSelectionModel getSelectionModel(Object input) {
			return null;
		}
	};
</pre><br /><br />新增rowDataProvider，DataGrid渲染每一行时，会将每一行的数据传递给下面的getLabel方法，由他来决定如何展示数据<br /><pre name="code" class="java">
@Bind(id = "grid", attribute = "rowDataProvider")
	private GridRowDataProvider rowProvider = new GridRowDataProvider() {
                //其中 rowData为每行数据，column 为列信息。
                //通过column.getId可以获得上面定义的列ID
		public Object getLabel(Object rowData, GridColumn column) {
                        //获取当前列的ID
			String id = column.getId();
			User user = (User) rowData;
                        //判断，根据不同的id，展示不同的数据，如果上面的Grid的数据列模型设置了转换，那么会自动调用
			if ("name".equals(id)) {
                                //列的id是name,显示用户名
				return user.getName();
			} else if ("email".equals(id)) {
                                //列的id是email,显示电子邮件
				return user.getEmail();
			}
			return null;
		}
	};
</pre><br /><br />OK，一个基本的数据展示就完成了。可以简单的测试下，浏览下效果。<br /><br />图就忽略了。。。。<br /><br />没有分页，高度一直拉到最下面，太丑了：（<br /><br />一：你可以用最上面的方法，直接在页面上写上属性<br /><pre name="code" class="xml">
&lt;w:datagrid paged="true" rows="20" contextmenu="true" toolbarposition="top" .... />
</pre><br /><br />二：也可以直接通过元数据@ComponentAttributes，批量给组件添加属性，首先还是将上面的datagrid恢复原来的代码<br /><pre name="code" class="xml">
&lt;w:datagrid id="grid"/>
</pre><br /><br />在GridBean代码中，新增<br /><pre name="code" class="java">
@ComponentAttributes(id = "grid")
private Map&lt;String, Object> config;
</pre><br /><br />在构造函数里面，增加相应的属性<br /><pre name="code" class="java">
public GridBean() {
    this.config = = new HashMap&lt;String, Object>();
    //分页
    this.config.put("paged", true);
    //每页10条记录
    this.config.put("rows", 10);
    //根据记录的多少，自动调整表格高度
    this.config.put("autoHeight", true);
    //.....
}
</pre><br /><br /><br />也许有人疑惑了，问，这里的属性paged,rows,autoHeight那里来的，如果你不知道，你可以查看Faces页面对应的属性，这个和那里是一样的关键字。<br /><br />再次测试下，浏览效果<br /><img src="http://mmm.javaeye.com/upload/picture/pic/14875/d2732ba8-86bf-36d9-aeac-2b2efc4d9188.gif" /><br /><br />不错。<br /><br />动态绑定数据：<br />下面我们介绍第二个常用的功能，如何动态的绑定Gridl的数据。<br />首先在那个User.java中新增一个方法，我们填充更多的内容<br /><pre name="code" class="java">
	public static List&lt;User> samples2(){
		List&lt;User> users = new ArrayList&lt;User>();
		for(int i=0;i&lt;10;i++){
			users.addAll(samples());
		}
		return users;
	}
</pre><br /><br />在页面上放一个button<br /><pre name="code" class="xml">
&lt;w:form>
  &lt;w:button id="btn" />
&lt;/w:form>
&lt;w:dataGrid id="grid"/>
</pre><br /><br />绑定button的value,显示字符为“Reload Data”<br /><pre name="code" class="java">
@Bind(id = "btn", attribute = "value")
private String btn_label = "Reload Data";
</pre><br /><br />绑定一个Action,当点击按钮的时候，触发该方法，重新加载新的数据。<br /><pre name="code" class="java">
@Action(id = "btn")
public void changeValues() {
        //首先，赋值新的数据
	this.users = User.samples2();
        //配置第一个显示的记录，这里是估计用了2，用来演示，如果不填写，或者0 那么将会全部展示
	grid.setFirst(2);
        //重新配置表格的每页显示的条数，更新为15条每页
	grid.setRows(15);
        //重新版定Grid,展示新的数据
	this.grid.rebind();
}
</pre><br /><br />注：重新加载数据的时候，不仅仅可以重新赋值，还可以更新viewProvider,rowDataProvider，如 (该片段代码来自于AOM RCDEMOS，推荐阅读)：<br /><br /><pre name="code" class="java">
grid.setViewProvider(GridBeanHelper.getTrainViewProvider());
grid.setRowDataProvider(GridBeanHelper.getTrainRowProvider());
</pre><br /><br />收工，明天继续。<br />Done!
          <br/>
          <span style="color:red;">
            <a href="http://aom.group.javaeye.com/group/blog/195655#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 May 2008 14:40:59 +0800</pubDate>
        <link>http://aom.group.javaeye.com/group/blog/195655</link>
        <guid>http://aom.group.javaeye.com/group/blog/195655</guid>
      </item>
      <item>
        <title>项目管理之我见 </title>
        <author>zhuyuanxiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhuyuanxiang.javaeye.com">zhuyuanxiang</a>&nbsp;
          链接：<a href="http://aom.group.javaeye.com/group/blog/195050" style="color:red;">http://aom.group.javaeye.com/group/blog/195050</a>&nbsp;
          发表时间: 2008年05月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>伴随着我国信息化的发展，项目管理越来越成为项目成功的关键问题。许多项目配备了足够优秀的人手，仍然以失败告终，根本原因就是没有良好的管理，大家都在努力工作，但是每个人却冲着不同的方向，结果可想而知。那么如何才能有效的管理呢？<br />首先，控制需求。<br />采集需求的书多如牛毛，每个人都提出了自己的观点。作者认为控制需求中主要把握好以下三点：<br />● 充分阅读招标方案中客户的要求，最好将之细化成具体的、量化的、可操作的目标。当然最初的阅读无法达到细化的需要，但是充分理解招投标方案是对行业知识最快的学习方法，还需要通过不同侧面去了解所做项目的行业背景，这就是俗话所说的做功课。；<br />● 充分认识&ldquo;客户永远是对的&rdquo;。刚接手项目时，没有行业经验必须先虚心向客户学习。确定需求时，还必须具备专家的能力理解和引导客户需求。与客户最危险的沟通方式就是问：这个项目想做点啥？不设条件的让客户去想，要不客户不理解信息化项目说不出东西，要不就是客户终于有个表达自己的机会说出无数的需求，使项目范围无限扩大。其实，这些都是因为自己没有对项目充分认识，自己不懂当然会被别人牵着鼻子走了。；<br />● 充分理解需求变更的现实意义。软件工程早期人们极端的认为客户无理地变更需求导致项目失败，但是随着极限编程概念的推广和软件开发效率的不断提升，大家也越来越理解需求变更的合理性。但是，管理需求变更仍然是非常重要的工作。如果担心得罪客户而一味的迁就，或者硬顶客户并且所有事情都找他签字，结果都会给项目推进带来不必要的麻烦。因此，确定合理的变更流程，并且引导客户认识并承担需求变更的成本与风险。就能够有效规避需求变更本身给项目带来的冲击。<br />例如：作者参与过的公安项目，以前根本没有公安行业的背景，于是经历过一个月的痛苦学习阶段，然后才具备了与客户正面沟通的实力，指出客户需求中与本次项目中有所冲突的地方，并且为客户提出其他的解决方案，最终协助客户找到项目完工的真正目标，促使拖了近一年的项目用两个月的时间完成了收尾、上线、初验并收款。而项目的成功推进根本原因是控制好需求，清晰了目标，有了方向工作就好做了。</p>
<p>其次，建立团队。<br />一个优秀的团队一定会有一个优秀的项目经理，项目经理可以说是整个团队的灵魂，因此一个项目要成功必须要找到合适的项目经理。<br />项目经理会负责选择合适的团队成员将团队组织在一起，团队至少包括：技术负责人、软件开发人员、软件测试人员，比例是1:2:1，这个配置是根据中国情况提供的最低标准。中国很少能够组织完整的项目团队，资源的严重不足导致团队人员只能按最低配置完成。由比例可以得知团队至少需要5个人，这是团队组织标准7&plusmn;2的最低要求，这样的团队才是有战斗力的团队。<br />由于项目太多，许多公司连这样的团队都无法组织。如果是这样，作者建议宁愿一个团队接多个项目，也不要一个项目只配1～2个人。因为这是团队建设中的第二个重要问题：分工。术有专攻，自古就已经得到认同。同时，现代科学技术越来越复杂，没有人是全才。还有，公司不可能养得起许多个高手。因此，这样的团队由：项目经理＋技术负责人＋技术熟手＋技术生手＋测试人员是一个非常好的搭配，大大减低公司在人员上的成本投入，不同层面的人员搭配可以使项目中各种工作都有相应的人员去应对，同时不同层次的工程师配合也使知识在项目中得到有效传递，而生手的成熟只有靠项目完成，有老手帮带也使项目质量容易管控。同时可以保证每个人在项目中有事做，有成长的机会，有成就感。</p>
<p>然后，制定计划。<br />&ldquo;凡事预则立，不预则废&rdquo;，因此没有计划的工作失败是难免的事情，成功完全是碰运气。但是制定计划本身也是一件技术活，在计划之前一定要先完成需求准备工作，就是为项目确定目标，没有目标也就无从谈起计划了。只有目标本身是可量化的，计划才能够有效制定出来。小时候经常会制定目标考100分，现在发现那不叫目标叫愿望。目标是对项目进行有效评估，了解具体的工作是哪些，大致需要多久时间才，确认目标实现后项目就可以结束。这些才是项目的真正目标，并以每个目标评估的时间消耗为基础，制定项目计划，项目计划出来后直接乘2就是最终项目的完成时间表。但是现实是项目时间表根本没法获得公司或者客户的认可，时间肯定会被大大压缩，这时就需要对计划中的目标排优先级，重新阅读每个目标，如果是可做可不做的先删除，直到留下来不得不做的，再重新评估时间，基本上会比实际项目时间短很多，但是以这个为基础开始项目实施吧。<br />作者参与过一个公司内部项目，将地理信息系统应用从J2EE平台移植到DotNET上，技术风险比较多，人员也是临时组建的，本来三个月的项目最后被压缩成一个半月，但是项目最终完成并通过公司和投资人的验收。因为，从开始就排定了项目目标的优先级，并且作为项目经理时刻提醒组员关注项目前进方向；其次，一直把应用集成排在项目的第一目标，在三周左右项目就已经可以上线运行，于是测试工作与开发工作保持同步展开；最后，与客户（领导和投资人）保持紧密沟通，时刻报知项目进度和完成的内容，使客户了解项目是否提供了他所需要的最基础的功能，以及真正理解项目未实现的目标原因，并能够提早接受这样的现实情况，为项目最终验收奠定了基础。</p>
<p>最后，有效执行。<br />执行力是许多管理者关注的问题，常常感叹为什么有Power就推不动事情的前进呢？其实，就如国家实力一样，分硬实力和软实力。管理者拥有的只是公司提供的这个Power叫硬实力，但是还需要在工作中积累自己的软实力，通过增强团队凝聚力、提升团队文化、创造团队成员的个人发展环境来增强自己的软实力。有了软实力，团队成员更愿意付出努力来为团队目标奋斗，许多事情自然不需要花大力气推动，而有了水到渠成的感觉。</p>
          <br/>
          <span style="color:red;">
            <a href="http://aom.group.javaeye.com/group/blog/195050#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 20 May 2008 23:12:41 +0800</pubDate>
        <link>http://aom.group.javaeye.com/group/blog/195050</link>
        <guid>http://aom.group.javaeye.com/group/blog/195050</guid>
      </item>
      <item>
        <title>实践是最好的老师</title>
        <author>zhuyuanxiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhuyuanxiang.javaeye.com">zhuyuanxiang</a>&nbsp;
          链接：<a href="http://aom.group.javaeye.com/group/blog/194184" style="color:red;">http://aom.group.javaeye.com/group/blog/194184</a>&nbsp;
          发表时间: 2008年05月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>记录此文，是想记住今天在飞机上与别人交流的一点心得。</p>
<p>今天谈论的是摄影，我也喜欢摄影，但是以前总希望自己能够有时间专业的学习摄影，于是我放弃了。一直想等到有时间进行专业学习了，再好好的感受摄影。</p>
<p>但是今天的交流使我重新思考自己的想法。因为飞机上的朋友介绍他自己就是不断地拍，当然每次拍也会用心考虑用什么方式拍，但是并没有被那些手段约束自己。虽然拍的大部分时候都让人不满意，但是他希望通过不断地拍寻找自己的感觉，当什么时候找到自己喜欢的拍摄方式，得到的片子也令自己满意的时候，那就代表有了自己的思想了，然后再以这个思想为基础去与别人交流，吸收别人那里对自己有价值的东西，而不是盲从。</p>
<p>写这个也是想告诉自己，有些时候最重要的是行动，行动的时候不要太在乎目标，只是用心去感受过程就好了，因为需要通过在许多结果中寻找自己的感觉，然后以这样的感觉为基础再去学习别人的技巧，这样就不是死抄，而是在丰富自己的感觉，收获就大不同了。</p>
<p>其实也是想给三十岁的自己定个方向，不用在乎我自己在学计算机哪个方面的知识，充分地丰富自己是最重要的，也不用在乎学到什么程度，重要的是感受自己什么时候做的最开心，以此为基础再去学习其他的东西，相信就拥有了别人不可复制的东西。</p>
          <br/>
          <span style="color:red;">
            <a href="http://aom.group.javaeye.com/group/blog/194184#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 18 May 2008 22:57:39 +0800</pubDate>
        <link>http://aom.group.javaeye.com/group/blog/194184</link>
        <guid>http://aom.group.javaeye.com/group/blog/194184</guid>
      </item>
      <item>
        <title>计划撰写Apusic Studio快速开发指南</title>
        <author>plutluo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://plutoluo.javaeye.com">plutluo</a>&nbsp;
          链接：<a href="http://aom.group.javaeye.com/group/blog/192601" style="color:red;">http://aom.group.javaeye.com/group/blog/192601</a>&nbsp;
          发表时间: 2008年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>近一段时间以来，Apusic Studio功能特性全部完成，性能也逐步稳定，预计近期将会发布Release版本。随着开发工作的暂告一段落，Studio快速开发指南的文档撰写工作开始提上日程。计划今日开始文档的规划和撰写工作，预计一周至一周半左右完成。</p>
<p>文档的目的：旨在提供一份详实的文档使用户快速熟悉如何使用Apusic Studio进行J2EE（AOM）的开发工作。</p>
<p>初步的文档大纲为：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<strong>Apusic Studio 快速开发指南</strong></p>
<p><strong>1.</strong> <strong>Apusic标准工程介绍</strong><br />&nbsp;&nbsp;&nbsp; 1.1. 概述<br />&nbsp;&nbsp;&nbsp; 1.2. 目录结构<br />&nbsp;&nbsp;&nbsp; 1.3. Apusic系统工程简介<br />&nbsp;&nbsp;&nbsp; 1.4. 操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.1. 新建Apusic标准工程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.2. 新建模块<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.3. 部署与调试<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.4&nbsp; 新增,修改,删除服务器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.4. 导出Apusic工程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.5&nbsp; 导入Apusic工程</p>
<p><strong>2. Web开发介绍</strong><br />&nbsp;&nbsp;&nbsp; 3.1. 概述<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.1.1. Web开发环境<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.1.2. 新建Web模块<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.1.3. 新建Facelets页面<br />&nbsp;&nbsp;&nbsp; 3.2. 可视化开发<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2.1. 标签栏<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2.2. Web页面编辑器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2.3. 属性视图<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2.4. 大纲<br />&nbsp;&nbsp;&nbsp; 3.3.&nbsp; 基本组件<br />&nbsp;&nbsp;&nbsp; 3.4. 布局组件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.3.1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .... &lt;九个布局组件&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.3.9<br />&nbsp;&nbsp;&nbsp; 3.5. LiteBean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4.1. 概述<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4.2. 新建LiteBean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4.3. LiteBean支持<br />&nbsp;&nbsp;&nbsp; 3.6 IoVC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5.1 概述<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5.2 IoVC支持&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><strong>3. EJB开发介绍</strong><br />&nbsp;&nbsp;&nbsp; 2.1. 概述<br />&nbsp;&nbsp;&nbsp; 2.2. EJB模块<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.2.1. 新建EJB模块<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.2.2. 如何引用外部jar包<br />&nbsp;&nbsp;&nbsp; 2.3. 新建会话Bean<br />&nbsp;&nbsp;&nbsp; 2.4&nbsp; JPA建模<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.4.1 新建JPA实体<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.4.2 如何从数据库导入JPA实体<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.4.3 生成Service实现<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.4.4 生成数据库脚本<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.4.5 生成测试案例<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><strong>4. 其他功能</strong><br />&nbsp;&nbsp;&nbsp;&nbsp; 4.1 Property Editor<br />&nbsp;&nbsp;&nbsp;&nbsp; 4.2 管理Apusic服务器<br />&nbsp;&nbsp;&nbsp;&nbsp; 4.3 监控Apusic服务器</p>
<p><strong>5. Apusic Stuido实用技巧</strong><br />&nbsp;&nbsp;&nbsp;&nbsp; 5.1 快捷部署应用<br />&nbsp;&nbsp;&nbsp;&nbsp; 5.2 快捷访问应用页面<br />&nbsp;&nbsp;&nbsp;&nbsp; 5.3 快捷定位文件系统<br />&nbsp;&nbsp;&nbsp;&nbsp; 5.4 页面与托管Bean切换<br />&nbsp;&nbsp;&nbsp;&nbsp; 5.6 定制WebEditor页签<br />&nbsp;&nbsp;&nbsp;&nbsp; 5.7 快速定位父标签</p>
<p><strong>6. 示例</strong><br />&nbsp;&nbsp;&nbsp; 6.1. 如何获取在线示例<br />&nbsp;&nbsp;&nbsp; 6.2. Hello Duke<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.2.1. 前言<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.2.2. Step By Step<br /><strong>7. 新特性</strong></p>
<p><strong>8. 法律声明</strong></p>
<p>该大纲不会是最终版，在撰写中会根据实际情况进行相应调整。</p>
          <br/>
          <span style="color:red;">
            <a href="http://aom.group.javaeye.com/group/blog/192601#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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/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>Tue, 13 May 2008 15:07:42 +0800</pubDate>
        <link>http://aom.group.javaeye.com/group/blog/192601</link>
        <guid>http://aom.group.javaeye.com/group/blog/192601</guid>
      </item>
      <item>
        <title>Apusic Studio 5.1M5 新特性一览</title>
        <author>plutluo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://plutoluo.javaeye.com">plutluo</a>&nbsp;
          链接：<a href="http://aom.group.javaeye.com/group/blog/190776" style="color:red;">http://aom.group.javaeye.com/group/blog/190776</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>本文首发于operamaks</p>
<p>
社区(www.operamasks.org)，原文地址为：http://www.operamasks.org/articles/studio_newfeature/html_single。</p>
<div style="text-align: left;"><br />

&nbsp;
<br />


<table border="0" id="portal-columns">
<tbody>
<tr>
<td id="portal-column-content">
<div id="content">
<div class="documentContent" id="region-content">
                    <a name="documentContent"></a>

                    <!--
<div metal:use-macro="here/global_statusmessage/macros/portal_message">
                      Portal status message
                    </div>
-->
                    
                    
    
<!--
<div metal:use-macro="here/document_actions/macros/document_actions">
            Document actions (print, sendto etc)
        </div>
<h1 tal:content="object_title" class="documentFirstHeading">
          Title or id
        </h1>
<div metal:use-macro="here/document_byline/macros/byline">
          Get the byline - contains details about author and modification date.
        </div>
-->
<div class="plain">
<div class="article" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="d0e1"></a>

Apusic Studio 5.1M5 新特性一览</h2>
</div>
</div>
<hr />
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both;"><a name="d0e4"></a>

1.&nbsp;说明</h2>
</div>
</div>
</div>
<p>Apusic Studio 5.1M5发布以来,版本号已经更新至Patch2，功能也不断增强和完善。本文将会就M5版本中新添加或增强的特性进行详尽的介绍。</p>
<p>Apusic Studio 5.1M5版本中新添加或增强的主要特性有：</p>
<div class="orderedlist">
<ol type="1">
<li>
<p><a href="#quickdeploy" title="2.1.&nbsp;快捷部署">Section&nbsp;2.1, &ldquo;快捷部署&rdquo;</a>

</p>
</li>
<li>
<p><a href="#advancedWeb" title="2.2.&nbsp;增强的Web模块">Section&nbsp;2.2, &ldquo;增强的Web模块&rdquo;</a>

</p>
</li>
<li>
<p><a href="#webeditor" title="2.3.&nbsp;增强的Web编辑器">Section&nbsp;2.3, &ldquo;增强的Web编辑器&rdquo;</a>

</p>
</li>
<li>
<p><a href="#IOVC" title="2.4.&nbsp;IOVC支持">Section&nbsp;2.4, &ldquo;IoVC支持&rdquo;</a>

</p>
</li>
<li>
<p><a href="#Visiual" title="2.5.&nbsp;组件可视化增强">Section&nbsp;2.5, &ldquo;组件可视化增强&rdquo;</a>

</p>
</li>
<li>
<p><a href="#Composite" title="2.6.&nbsp;自定义复合组件">Section&nbsp;2.6, &ldquo;自定义复合组件&rdquo;</a>

</p>
</li>
<li>
<p><a href="#Properties" title="2.7.&nbsp;Properties Editor">Section&nbsp;2.7, &ldquo;Properties Editor&rdquo;</a>

</p>
</li>
<li>
<p><a href="#JPAService" title="2.8.&nbsp;生成JPA 业务实现">Section&nbsp;2.8, &ldquo;生成JPA 业务实现&rdquo;</a>

</p>
</li>
<li>
<p><a href="#JPATest" title="2.9.&nbsp;生成JPA 测试案例">Section&nbsp;2.9, &ldquo;生成JPA 测试案例&rdquo;</a>

</p>
</li>
<li>
<p><a href="#fileLocation" title="2.10.&nbsp;快捷的文件定位">Section&nbsp;2.10, &ldquo;快捷的文件定位&rdquo;</a>

</p>
</li>
</ol>

</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both;"><a name="d0e42"></a>

2.&nbsp;内容</h2>
</div>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="quickdeploy"></a>

2.1.&nbsp;快捷部署</h3>
</div>
</div>
</div>
<p>在Apusic Studio 5.1M5版本以前，常规部署应用的方式为：工程上右键--&gt;部署到服务器--&gt;部署(卸载/重新启动应用/停止应用/启动应用)，如下图:</p>
<div class="figure"><a name="d0e50"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/deploy.png" alt="常规部署应用" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;1.&nbsp;常规部署应用</strong>

</p>
</div>
<br class="figure-break" />
<p>常规运行Web页面的方式为：页面上右键--&gt;Run As--&gt;在Apusic 应用服务器上运行。如下图所示：</p>
<div class="figure"><a name="d0e58"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/deploy2.png" alt="常规运行页面" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;2.&nbsp;常规运行页面</strong>

</p>
</div>
<br class="figure-break" />
<p>在M5版本中，新加入了快捷部署的功能。具体为：</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>快捷部署应用</p>
<p>在 Apusic Studio 快捷工具栏上新添加有快捷部署应用的按钮，如下图：</p>
<div class="figure"><a name="d0e72"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/quickbutton.png" alt="快捷部署按钮" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;3.&nbsp;快捷部署按钮</strong>

</p>
</div>
<br class="figure-break" />
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>快捷按钮分为默认选项和其余选项两栏，默认选项表示直接点击时执行的操作项（快捷键为Alt +F11）。</p>
</li>
<li>
<p>选中Apusic工程后，按钮即呈现有效状态。反之，如该按钮将呈现非有效状态。</p>
</li>
<li>
<p>按钮会根据历史记录，对其选项进行排序，将最近一次的历史操作加入默认选项中。例如我们选中ear1工程，通过快捷按钮进行&ldquo;重新启动应用ear1&quot;操作后，会发现&rdquo;重新启动应用ear1&rdquo;成为默认选项，此时直接点击快捷按钮，会执行&ldquo;重新启动应用ear1&rdquo;操作。</p>
</li>
</ul>
</div>
</li>
<li>
<p>快捷访问/部署页面</p>
<p>实际开发过程中，常常遇到这样的场景：在Studio中进行页面编辑的同时，想看看该页面实际的访问效果如何？</p>
<p>针对这种场景，M5版本新添加了页面部署快捷键Ctrl+F11，通过它能直接访问（或部署）当前焦点所处的页面（编辑器打开或者页面被选中）。如下图：</p>
<div class="figure"><a name="d0e95"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/quickpage.png" alt="快捷访问按钮" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;4.&nbsp;快捷访问按钮</strong>

</p>
</div>
<br class="figure-break" />
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>在弹出对话框内选择在Apusic应用服务器上运行。</p>
</li>
<li>
<p>当页面所属应用已经部署时，该操作会执行打开系统浏览器访问该页面。反之，该操作会先执行应用部署，再执行页面访问。操作。</p>
</li>
</ul>
</div>
</li>
</ol>

</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="advancedWeb"></a>

2.2.&nbsp;增强的Web模块</h3>
</div>
</div>
</div>
<p>M5版本中对web模块部分特性进行了增强和迁移，具体涉及有：</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>提供是否支持AOM选项</p>
<p>默认勾选，表示新建的Web模块支持AOM（支持JSF）。反之表示新建普通Web模块。</p>
</li>
<li>
<p><a name="iovcsupport"></a>

提供是否支持IoVC选项</p>
<p>默认勾选，表示该Web模块支持IoVC。反之，表示不支持。该特性将会影响到<a href="http://www.operamasks.org/articles/studio_newfeature/html_single/#IOVC" title="2.4.&nbsp;IOVC支持">IoVC</a>

特性支持</p>
</li>
<li>
<p><a name="namspace"></a>

配置默认命名空间</p>
<p>定义生成Faces页面时默认绑定的LiteBean包名。</p>
</li>
<li>
<p><a name="proxy"></a>

配置映射规则</p>
<p>定义页面所属文件夹和对应LiteBean命名前缀的映射规则，该规则将写入operamasks.xml文件中。</p>
</li>
<li>
<p>配置View类型</p>
<p>默认Facelets View，表示采用Facelets 作为jsf表现层展现，选择JSP View，表示采用JSP 作为JSF 表现层展现。</p>
<p>注：当采用Facelets View时，新建Faces页面应为.xhtml后缀，采用JSP View，新建Faces页面应为.jsp后缀。</p>
</li>
</ol>

</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="webeditor"></a>

2.3.&nbsp;增强的Web编辑器</h3>
</div>
</div>
</div>
<p>M5版本（Patch2）中为Web Page Editor（默认Faces页面编辑器）添加了诸多特性，其中包括：</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>提供页面源码（Source）页签（默认）</p>
<p>由于原有可视化设计器（Design页签）受可视化效果，代码设计实时同步等设计制约，导致其代码编辑效率不高。M5版本中添加了页面源码（Source）编辑页签，以提升编辑器的源码编辑性能。该源码编辑器提供了诸如代码辅助，语法高亮，代码格式化等功能。如下图：</p>
<div class="figure"><a name="d0e155"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/sourceeditor.png" alt="页面源码页签" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;5.&nbsp;页面源码页签</strong>

</p>
</div>
</li>
<li>
<p>提供页面对应LiteBean编辑器页签（可选）</p>
<p>当&ldquo;<a href="#show_liteBean">显示LiteBean页签</a>

&rdquo;选项勾选时，会以页签的方式显示页面绑定的LiteBean（该LiteBean可以通过operamasks.xml中配置或采用&lt;useBean&gt;标签注入）。如下图：</p>
<div class="figure"><a name="d0e169"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/litebeaneditor.png" alt="LiteBean页签" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;6.&nbsp;LiteBean页签</strong>

</p>
</div>
<br class="figure-break" />
<p>注：该LiteBean编辑器提供Java Source编辑器的基本功能。</p>
</li>
<li>
<p>Web编辑器偏好配置</p>
<p>用户如果需要对Web编辑器的默认显示页签内容等偏好进行配置，可以通过Window--&gt;Preferences--&gt;Apusic--&gt;Web进行配置。如下图：</p>
<div class="figure"><a name="d0e182"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/websetting.png" alt="Web编辑器偏好配置" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;7.&nbsp;Web编辑器偏好配置</strong>

</p>
</div>
<br class="figure-break" />
<p>默认提供3种偏好配置，分别为：</p>
<div class="table"><a name="d0e190"></a>
<p class="title"><strong>Table&nbsp;1.&nbsp;可视化Web页面编辑器显示页签配置</strong>

</p>
<div class="table-contents">
    
<table border="1" summary="可视化Web页面编辑器显示页签配置">
<tbody>
<tr>
<td>显示Design页签</td>
<td>默认项，不可取消</td>
</tr>
<tr>
<td>显示Source页签</td>
<td>显示页面源码编辑页签</td>
</tr>
<tr>
<td>显示Preview页签</td>
<td>显示页面预览页签（Browser）</td>
</tr>
<tr>
<td><a name="show_liteBean"></a>

显示LiteBean页签</td>
<td>显示页面绑定LiteBean页签（当页面绑定多个LiteBean时，会出现多页签）</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<div class="table"><a name="d0e215"></a>
<p class="title"><strong>Table&nbsp;2.&nbsp;可视化Web页面编辑器默认显示配置</strong>

</p>
<div class="table-contents">
    
<table border="1" summary="可视化Web页面编辑器默认显示配置">
<tbody>
<tr>
<td>默认显示Source页签</td>
<td>打开编辑器时，Source页签为默认显示页签</td>
</tr>
<tr>
<td>默认显示Design页签</td>
<td>打开编辑器时，Design页签为默认显示页签</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
</li>
</ol>

</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="IOVC"></a>

2.4.&nbsp;IoVC支持</h3>
</div>
</div>
</div>
<p>M5版本中针对AOM2.0提供了原生的支持，其中一个显著的特性就是IoVC（IoVC用法指南可以参阅AOM2.0用户指南第6章节）支持。具体为：</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>组件与LiteBean绑定</p>
<p>在设计视图中可以通过双击组件，右键菜单等多种方式为用户自动进行组件的IoVC绑定。</p>
<p><a href="#iovcsupport">Web模块支持IoVC</a>

：</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>默认IoVC绑定</p>
<p>在设计视图中，双击组件（当组件没有指定ID时，会弹出ID输入框让用户输入) 会触发组件的IoVC默认绑定行为。弹出组件IoVC默认绑定向导。如下图：</p>
<div class="figure"><a name="d0e251"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/iovcwizard.png" alt="IOVC组件默认绑定向导" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;8.&nbsp;IoVC组件默认绑定向导</strong>

</p>
</div>
<br class="figure-break" />
<p>选择欲绑定的LiteBean，点击Finish后，即可在后台LiteBean中自动生成默认绑定代码。</p>
</li>
<li>
<p>指定IoVC绑定</p>
<p>在设计视图中，用户可以通过：组件上右键--&gt;IoVC中选择欲绑定的IoVC类别，即会弹出绑定详细配置向导，在向导内指定欲绑定的组件属性即可。如下图：</p>
<div class="figure"><a name="d0e264"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/iovcpattern.png" alt="选择IOVC绑定类别" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;9.&nbsp;选择IoVC绑定类别</strong>

</p>
</div>
<br class="figure-break" />
<div class="figure"><a name="d0e270"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/iovcwizard2.png" alt="绑定详细配置向导" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;10.&nbsp;绑定详细配置向导</strong>

</p>
</div>
</li>
<li>
<p>组件双击</p>
<p>在设计视图中，双击组件，执行默认IoVC绑定或者进入LiteBean绑定代码操作。</p>
</li>
</ul>
</div>
<p><a href="#iovcsupport">Web模块不支持IoVC</a>

：</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>组件双击</p>
<p>在设计视图中，双击组件，当组件默认行为没有绑定后台ManagedBean时，弹出新建ManagedBean向导，如下图：</p>
<div class="figure"><a name="d0e291"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/managedbeanwizard.png" alt="新建ManagedBean向导" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;11.&nbsp;新建ManagedBean向导</strong>

</p>
</div>
<br class="figure-break" />
<p>用户可以指定已有的ManagedBean进行绑定，或者新建ManagedBean（新建后，会自动生成组件的默认行为绑定）。当组件的默认行为已经和后台ManagedBean绑定后，在设计视图中双击组件，能直接进入绑定代码。</p>
</li>
</ul>
</div>
</li>
<li>
<p>页面与LiteBean绑定（web模块需支持IoVC）</p>
<div class="itemizedlist">
    
<ul type="disc">
<li>
<p>新建Faces页面时，会默认生成<a href="#namspace">根据命名规则定义</a>

的LiteBean。如果不需要生成，可以在新建Faces页面向导第三页中取消生成托管Bean选项的勾选即可。</p>
</li>
<li>
<p>新建Faces页面时，如不采用默认命名规则生成LiteBean 。则Studio会默认将其该页面与LiteBean的映射写入operamasks.xml文件中。</p>
</li>
</ul>
</div>
</li>
</ol>

</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="Visiual"></a>

2.5.&nbsp;组件可视化增强</h3>
</div>
</div>
</div>
<p>Apusic Studio 5.1M5版本中，可视化效果增强的组件列表如下：</p>
<div class="table"><a name="d0e317"></a>
<p class="title"><strong>Table&nbsp;3.&nbsp;可视化效果增强组件列表--Widget类</strong>

</p>
<div class="table-contents">
<table border="1" summary="可视化效果增强组件列表--Widget类">
<tbody>
<tr>
<td>组件名</td>
<td>内容</td>
</tr>
<tr>
<td>checkBox</td>
<td>
<div class="itemizedlist">
            
<ul type="disc">
<li>
<p>boxLabel属性可视化支持</p>
</li>
<li>
<p>checked属性可视化支持</p>
</li>
<li>
<p>fieldLabel属性可视化支持</p>
</li>
</ul>
</div>
</td>
</tr>
<tr>
<td>Combo</td>
<td>
<div class="itemizedlist">
            
<ul type="disc">
<li>
<p>emptyText属性可视化支持</p>
</li>
<li>
<p>fieldLabel属性可视化支持</p>
</li>
</ul>
</div>
</td>
</tr>
<tr>
<td>Menu</td>
<td>实现可视化效果，单击控制Menu展开和收缩，同时支持多级Menu的可视化，支持拖拽添加MenuItem</td>
</tr>
<tr>
<td>numberField</td>
<td>
<div class="itemizedlist">
            
<ul type="disc">
<li>
<p>emptyText属性可视化支持</p>
</li>
<li>
<p>value属性可视化支持</p>
</li>
<li>
<p>fieldLabel属性可视化支持</p>
</li>
</ul>
</div>
</td>
</tr>
<tr>
<td>textArea</td>
<td>
<div class="itemizedlist">
            
<ul type="disc">
<li>
<p>fieldLabel属性可视化支持</p>
</li>
<li>
<p>emptyText属性可视化支持</p>
</li>
<li>
<p>value属性可视化支持</p>
</li>
</ul>
</div>
</td>
</tr>
<tr>
<td>textField</td>
<td>
<div class="itemizedlist">
            
<ul type="disc">
<li>
<p>inputType=&quot;password&quot;属性可视化支持</p>
</li>
<li>
<p>fieldLabel属性可视化支持</p>
</li>
</ul>
</div>
</td>
</tr>
<tr>
<td>timeField</td>
<td>
<div class="itemizedlist">
            
<ul type="disc">
<li>
<p>fieldLabel属性可视化支持</p>
</li>
<li>
<p>下拉列表内容填充（预览）</p>
</li>
</ul>
</div>
</td>
</tr>
<tr>
<td>toolBar</td>
<td>实现可视化效果。</td>
</tr>
<tr>
<td>simpleHtmlEditor</td>
<td>
<div class="itemizedlist">
            
<ul type="disc">
<li>
<p>enableColors属性可视化支持</p>
</li>
<li>
<p>enableFont属性可视化支持</p>
</li>
<li>
<p>enableLinks属性可视化支持</p>
</li>
<li>
<p>enableFontSize属性可视化支持</p>
</li>
<li>
<p>enableAlignments属性可视化支持</p>
</li>
<li>
<p>enableSourceEdit属性可视化支持</p>
</li>
<li>
<p>enableFormat属性可视化支持</p>
</li>
</ul>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break" />
<div class="table"><a name="d0e438"></a>
<p class="title"><strong>Table&nbsp;4.&nbsp;可视化效果增强组件列表--Layout类</strong>

</p>
<div class="table-contents">
<table border="1" summary="可视化效果增强组件列表--Layout类">
<tbody>
<tr>
<td>组件名</td>
<td>内容</td>
</tr>
<tr>
<td>absoluteLayout</td>
<td>子组件Panel绝对定位可视化支持</td>
</tr>
<tr>
<td>cardLayout</td>
<td>子组件Panel翻页可视化支持</td>
</tr>
<tr>
<td>tabLayout</td>
<td>子组件Panel翻页可视化支持</td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="table-break" />
<p>更多关于可视化效果的详细介绍，可以参阅Apusic Studio 快速开发指南。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="Composite"></a>

2.6.&nbsp;自定义复合组件</h3>
</div>
</div>
</div>
<p>M5版本（patch2）中，添加了自定义复合组件功能。具体用法如下：</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>选中Apusic 工程，右键--&gt;Import--&gt;Apusic Studio--&gt;Facelets复合组件，弹出导入Facelets复合组件向导。如下图：</p>
<div class="figure"><a name="d0e474"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/faceltes1.png" alt="导入Facelets复合组件向导" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;12.&nbsp;导入Facelets复合组件向导</strong>

</p>
</div>
</li>
<li>
<p>指定欲导入的taglib.xml（文件系统内或jar包内），指定自定义复合组件前缀。点击Finish，完成导入。</p>
</li>
<li>
<p>完成上述操作后，打开页面 Design设计器，即可在其工具栏中发现自定义的复合组件，同时可以采用拖拽的方式进行可视化设计。如下图：</p>
<div class="figure"><a name="d0e486"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/paltte.png" alt="工具栏" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;13.&nbsp;工具栏</strong>

</p>
</div>
</li>
</ol>

</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="Properties"></a>

2.7.&nbsp;Properties Editor</h3>
</div>
</div>
</div>
<p>M5版本中，新添加了Properties Editor编辑器，便于用户进行国际化资源文件的编写，查看，修改等工作。在资源文件上双击即可打开Properties Editor，如下图：</p>
<div class="figure"><a name="d0e497"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/properties.png" alt="Properties Editor" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;14.&nbsp;Properties Editor</strong>

</p>
</div>
<br class="figure-break" />
<p>更多详细的用法请参阅Apusic Stuido快速开发指南。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="JPAService"></a>

2.8.&nbsp;生成JPA 业务实现</h3>
</div>
</div>
</div>
<p>M5以前的版本，JPA
业务实现的生成方式是通过JPA模型设计器生成（生成JPA的时候自动生成对应的业务实现）。因为该方式灵活性较欠缺，不能满足复杂应用中按需定制的实际
需求，所以M5版本重构了JPA 业务实现的生成方式。改为手动指定、模板定制的方式。具体如下：</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>JavaEE资源管理器视图中，在对应包名上右键--&gt;实体模型--&gt;生成业务实现。如下图：</p>
<div class="figure"><a name="d0e514"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/jpa.png" alt="生成业务实现" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;15.&nbsp;生成业务实现</strong>

</p>
</div>
</li>
<li>
<p>在弹出的生成业务实现向导第一页中选择Session Bean，（Spring Bean和WebService暂不支持）如下图：</p>
<div class="figure"><a name="d0e523"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/jpa2.png" alt="新建业务实现向导" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;16.&nbsp;新建业务实现向导</strong>

</p>
</div>
</li>
<li>
<p>向导第二页选择欲生成业务实现的JPA实体。</p>
</li>
<li>
<p>向导第三页中配置业务实现的输出路径，实现方法等，同时可以通过点击&ldquo;配置代码模板&rdquo;进入业务方法模板配置界面，在其中进行业务实现 方法的定制。如下图：</p>
<div class="figure"><a name="d0e535"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/jpa3.png" alt="业务实现详细配置" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;17.&nbsp;业务实现详细配置</strong>

</p>
</div>
<br class="figure-break" />
<div class="figure"><a name="d0e541"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/jpa4.png" alt="配置代码模板" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;18.&nbsp;配置代码模板</strong>

</p>
</div>
<br class="figure-break" />
<p>注：业务方法模板中支持${entity}通配符，在生成的业务实现代码中，会根据该通配符将对应的entity类名填充。</p>
</li>
</ol>

</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="JPATest"></a>

2.9.&nbsp;生成JPA 测试案例</h3>
</div>
</div>
</div>
<p>针对自定制的JPA业务实现，M5版本加入了生成JPA测试案例的新功能，以完成从建模到业务实现到测试案例的一体化工作。具体用法如下：</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>JavaEE资源管理器视图中，ejbJar上右键--&gt;生成测试案例，或对应包上右键--&gt;实体模型--&gt;生成测试案例，弹出测试案例向导。如下图：</p>
<div class="figure"><a name="d0e558"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/jpa5.png" alt="新建JPA测试案例向导" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;19.&nbsp;新建JPA测试案例向导</strong>

</p>
</div>
</li>
<li>
<p>向导第一页中指定相关内容（包名，测试类名等等），测试类（Class under test）为对应的JPA业务实现类。</p>
</li>
<li>
<p>在向导第二页中指定欲测试的方法名。如下图：</p>
<div><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/jpa6.png" alt="" />

</div>
</li>
</ol>

</div>
<p>生成JPA测试案例后，将工程部署至Apusic服务器，即可通过类上右键--&gt;Run As--&gt;Junit test运行测试。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="fileLocation"></a>

2.10.&nbsp;快捷的文件定位</h3>
</div>
</div>
</div>
<p>实际上文件系统定位功能是Apusic Studio 5.0版本以后就自带的功能，但一直没有进行介绍，本文中将其作为M5的新特性囊括其中，做出说明。</p>
<p>在实际开发中，我们经常需要定位文件系统，或进入终端，针对这种需求，Apusic Studio提供了快捷的文件系统定位和终端定位功能，具体用法如下：</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>选择欲定位的文件或则目录，右键--&gt;Apusic Tools--&gt;Open Terminal（Show in Explorer）。其中Open Terminal表示在终端内打开，Show in Explorer表示在文件系统内打开。如下图示：</p>
<div class="figure"><a name="d0e584"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/file.png" alt="快捷文件定位" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;20.&nbsp;快捷文件定位</strong>

</p>
</div>
</li>
<li>
<p>根据不同的操作系统，用户可以定制相应的命令。方式为：首选项内（Windows--&gt;Preferences）Apusic --&gt;Tools项目中，可以定制Open Terminal 和Show in Explorer的命令内容。如下图示：</p>
<div class="figure"><a name="d0e593"></a>
<div class="figure-contents">
<div class="mediaobject"><img src="http://www.operamasks.org/articles/studio_newfeature/html_single/img/file2.png" alt="配置命令" />

</div>
</div>
<p class="title"><strong>Figure&nbsp;21.&nbsp;配置命令</strong>

</p>
</div>
</li>
</ol>

</div>
</div>
</div>
</div>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
<br />

<br />

<br />

<br />

<br />

</div>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://aom.group.javaeye.com/group/blog/190776#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/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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 May 2008 23:38:30 +0800</pubDate>
        <link>http://aom.group.javaeye.com/group/blog/190776</link>
        <guid>http://aom.group.javaeye.com/group/blog/190776</guid>
      </item>
      <item>
        <title>漫谈金蝶Apusic Studio（二）</title>
        <author>cloudxman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cloudxman.javaeye.com">cloudxman</a>&nbsp;
          链接：<a href="http://aom.group.javaeye.com/group/blog/190476" style="color:red;">http://aom.group.javaeye.com/group/blog/190476</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          金蝶的EAS是未来10-20年的战略高端产品，从运行平台定位就必须支持主流的应用服务器，比如BEA 的Weblogic和IBM 的Websphere，但是从研发角度来讲。Weblogic和Websphere太笨重了，在1G内存的开发人员的机器上工作效率很低。而这个时候，Apusic3.0 已经完全支持J2EE1.4标准，短小精悍，启动速度可媲美Tomcat，但是有支持EJB。对于金蝶来讲，很自然的一个考虑就是把Apusic3.0作为开发期的应用平台选型。当然，这个时候金蝶的战略已经很明确,会借EAS产品线大力发展自己的应用服务器平台了，从而形成国内独一无二的 ERP + 应用平台的持久发展战略。<br /><br />早期，在金蝶EAS BOS Studio还未发展起来的时候，金蝶EAS的开发团队延用了Eclipse + JVM远程调试的方式来支持Apusic3.0的开发，这种开发对于熟悉Java的人来说，与加了插件的Eclipse + Tomcat 开发基本是一样的。其实，所谓断点调试的功能支持并非IDE环境支持的功劳，而应该归功于Java 在JVM层次就架构好了调试框架 JPDA。<br /><br />作为大产品研发，任何开发工具的改进都将给提升团队的工作效率带来莫大的价值。金蝶EAS规划的时候，及分离了非常重要的一个团队去专门研发可以支撑未来EAS快速开发和二次开发的一个平台，这个平台当时叫BOS Studio,当然现在有一个很时髦的流行词汇，叫“业务应用基础平台”。<br /><br />BOS Studio是基于Eclipse上扩展的一个Plugin，不过这个Plugin规模不小，其功能定位是能够支撑 EAS产品的研发和面向最终客户和合作伙伴的二次开发。用当时的术语，称之为 业务驱动的 MDA (Model Driven Architecture)平台。这个产品的立意非常高远，会把企业ERP应用的开发抽象成建模，从应用、开发、部署、维护多个角度解决 ERP产品发展问题。<br /><br />其实在BOS Studio之前，金蝶在自己的Com/Com+三层架构的K3产品线就根据多年的用户需求积累逐渐抽象出了一个快速配置开发平台，用它来快速定制报表、扩展基础数据等。这套方案直接为EAS产品线的规划提供了原型。只不过EAS的规划站在一个新的起点和高度，拥有了更多想法和创新。
          <br/>
          <span style="color:red;">
            <a href="http://aom.group.javaeye.com/group/blog/190476#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/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>Wed, 07 May 2008 09:43:47 +0800</pubDate>
        <link>http://aom.group.javaeye.com/group/blog/190476</link>
        <guid>http://aom.group.javaeye.com/group/blog/190476</guid>
      </item>
      <item>
        <title>漫谈金蝶Apusic Studio（一）</title>
        <author>cloudxman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cloudxman.javaeye.com">cloudxman</a>&nbsp;
          链接：<a href="http://aom.group.javaeye.com/group/blog/189212" style="color:red;">http://aom.group.javaeye.com/group/blog/189212</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对于一个软件开发人员来讲，Studio 可比喻为战士驰骋战场的兵器，恰如兵器在现代战争中地位日益重要一样，Studio在现代软件开发中扮演的角色也日益重要。<br /><br />在集成开发环境(IDE)发展的早期,大家的兵器都很原始。记得我95年刚接触C语言的时候，已经有了Turbo C2.0,在那个还没有太多图形化开发的时代，TC能够很好把.c和.h文件组织起来，并提供编译支持，断点调试和及时帮助。TC使用起来的感觉已经很棒。<br /><br />随着Window的产生，面向图形化开发的日益重要，集成开发环境就进入快速发展期，各种IDE纷至沓来，从Turbo Vision,Borland C++ ,Microsoft C++ 到Visual Studio, Visual Fox Pro,Delphi,JBuilder,Eclipse等等. 软件工业化生产的各种需求都被日益纳入IDE所要解决的范围，从而不断扩充IDE的能力，以至于最后驱动了Eclipse 这种通用IDE框架的产生。<br /><br />我从2003年开始接触Eclipse. 那个时候，作为负责金蝶EAS产品线研发的开发工具和开发流程选型的负责人，我还一直是JBuilder的推崇者，可能不仅我，那个时候金蝶大部分技术人员还在使用的也是JBuilder。但是，我面临的一个任务是为二百多技术人员选择开发工具和开发流程，处于慎重起见，我和我的团队做了一个样板工程来企图验证各种可选工具的最佳搭配，这些工具涉及 VSS、CVS、Starteam、ClearCase、Jbuilder、Together、Rose、Eclipse。经过反复论证和培训推广，最后确定了CVS + Eclipse +Together的开发工具选型格局。<br /><br />让我欣慰的是Eclipse无疑是正确的选择。事隔几年后，伟大的Borland公司宣布放弃自己了JBuilder框架的独立发展，这让Eclipse成为了事实上Java IDE的工业标准。<br /><br />金蝶那个时候研发EAS，采用了EJB的持久化框架，所以，除了IDE,还有开发应用服务器的选择。Apusic3.0在这个时候进入研发开始作为开发应用平台使用。<br /><br />（未完）
          <br/>
          <span style="color:red;">
            <a href="http://aom.group.javaeye.com/group/blog/189212#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>Sun, 04 May 2008 10:57:03 +0800</pubDate>
        <link>http://aom.group.javaeye.com/group/blog/189212</link>
        <guid>http://aom.group.javaeye.com/group/blog/189212</guid>
      </item>
      <item>
        <title>在AOM框架下开发的分工</title>
        <author>cloudxman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cloudxman.javaeye.com">cloudxman</a>&nbsp;
          链接：<a href="http://aom.group.javaeye.com/group/blog/188303" style="color:red;">http://aom.group.javaeye.com/group/blog/188303</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在这篇帖子我介绍两个内容<br />第一：如何转到AOM框架开发？<br />第二：在AOM框架下开发的分工<br /><br />最近接触了较多的独立软件开发商，不少技术总监对AOM的演示效果表示非常惊讶，但是由于对JSF框架本身应用还不是很了解，表达了对应用这种技术的一些疑问，其中除了JSF框架本身是否可以满足企业应用开发的各种需求的疑问外，还非常关注采用AOM所带来的对原有工作模式的改变。<br /><br />我曾经参与过面向电子政务和企业Web开发的项目，接触过采用JSP+JavaBean 和 JSP+Struts/Webwork+Hibernate两种典型开发框架的企业。一般来说，这种开发商存在美工、前端开发工程师、后台开发工程师、DBA几种角色。美工主要根据客户感性需求定制页面视觉效果，一般采用PhotoShop加工成Image,然后 前端开发工程师要把这个Image处理成 Html+CSS+JavaScript，这个纯静态的东西（姑且叫网页代码）是开始Web页面交互设计的基础。从我的感觉，通常的Web开发上面两个处理过程是省不掉的。<br /><br />从效率上讲，其实在美工采用PhotoShop加工Image的同时，后台工程师就可以开始后台框架代码和DB的设计开发了。等“网页代码”出来后，前端和后端开始结合，这个时期较大的工作量在于把后台的内容放置到网页，以及处理来自页面的内容提交、导航、功能控制等。<br /><br />Java的长项在于后端，无论从语言使用、框架使用、以及调试都带给人比较愉快的享受。但是前端网页代码、前后台交互，以及处理这两者之间的沟通、变更是整个Web开发的最痛苦的地方。<br /><br />好，现在我来介绍前面的问题。<br />1. 对于很多Web首页的开发，由于这个页面在用户要求下，一般“图文并茂、比较花哨”，这种情况下 Web展现依然需要采用 美工+前端工程师来解决。但是从网页代码与后端的交互可以采用AOM提供的很多方便的控件（比如AJAX更新）来帮助解决。<br /><br />2. 首页外，一般的Web应用就是 布局+菜单+列表+按钮+控件的表达方式了（尤其是后台管理），这个时候AOM可以派上用场，借助Apusic Studio对AOM JSF控件的良好支持，以及无JavaScript的AJAX交互，后台工程师可以完全胜任整个环节。<br /><br />3. 多个模块可以交由多个后台工程师来并行做，在某些共用控件需要拓展功能的时候，可以分离出“控件设计师”的角色来单独负责控件的完善（也许你的企业，控件设计师与后台工程师是同一人）<br /><br />4. 通过积累，企业可以形成丰富的自己的控件库，这是提升整个企业后期开发效率的重要积累。（如果采用了JSF+EJB3 或者JSF+Hibernate，从某种程度讲，企业应用的积累更多在于控件了）<br /><br />5. 对于哪些还没有采用JSF的企业，建议可以找一个规模不大的项目，来应用JSF和AOM，一旦熟悉了JSF，即可快熟推广到其他新的项目。<br /><br />6. 只要企业认同了JSF这一Java官方框架，AOM本身不会给你带来更多麻烦。因为AOM是可以选择的，想要的时候要，不想要的时候也可以不要。<br /><br />7. 根据我的经验，对于有过JavaWeb后台开发的工程师，JSF框架的适应应该在1-2周左右。至于AOM 和Apusic Studio的适应，应该在2-3天。Apusic Studio是Eclipse的plugin,并且把Application Server无缝集成，相信每个Eclipse的爱好者会非常熟悉。
          <br/>
          <span style="color:red;">
            <a href="http://aom.group.javaeye.com/group/blog/188303#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-w