如何在OperaMasks中使用动态语言

1. 前言 2. 在OperaMasks中使用ELite
2.1. ELite的介绍 2.2. 在OperaMasks中使用ELite
3. 在JSF中使用Ruby
3.1. Spring2带来的动态语言支持 3.2. 在JSF应用中使用JRuby
4. 总结

1. 前言

随着微软正式发布IronPython,推出基于第一款基于动态语言的开源编程工具;紧接着Sun又正式对外宣布收购JRuby,Ruby将成为JVM支持的第一个动态语言,动态语言一直围绕在我们的身边。如何使用动态语言给我们编写Java Web UI带来帮助?什么样的动态语言能够适合Java开发团队呢?SirsiDynix的架构师Travis Jensen通过五条粗略的标准来评估Groovy,JRuby,Jython这三种动态语言在Java上的表现。
  • 动态语言与Java之间的交互
  • IDE工具的支持
  • Java开发者的学习曲线
  • 可供选择的Web框架
  • 社区的支持
而由此得出的结论是Groovy将是在Java Web开发中最适合的动态语言。在这也不对这些评价多做议论,简单的结合AOM这个JSF的实现,介绍一下几种动态语言在Java Web开发中的使用。在熟悉AOM的过程中,发现了ELite这种新的动态语言,由于ELite与AOM属于同一个开发团队的产品,对于这两者的配合使用也一并做了一个示例。
在进行以下内容的同时,需要对使用的开发环境做一个简单的介绍:
  • Java 2 Standard Edition (J2SE) 5.0 (JDK 1.5)或更高版本, 下载地址
  • Apusic Application Server 5.1(内置有AOM2.0和ELite0.2)下载地址
  • Apusic OperaMasks2.0(包含有Spring2.0和AOM的Spring插件)下载地址
  • Apusic Studio 5.1M5 下载地址
  • JRuby1.1.2 下载地址
至于对PATH或者JAVA_HOME等进行设置,这里就不一一馁述了,

2. 在Operamasks中使用ELite

由于 OperaMasks中内嵌有ELite的支持,所以在使用 OperaMasks作为Web框架开发的应用中可以很方便的使用ELite这种动态语言,不管是在xhtml页面中直接当作EL表达式来使用,或者在后台Bean中直接使用ELite编写,都是非常自然和可靠的选择。

2.1. ELite的介绍

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。
ELite脱胎于AOM中的EL运行引擎,在JSR-252的基础上对EL表达式语言做了很大的扩充,成为了一种新的动态语言,并且ELite是一个集命令式和函数式风格为一身的面向对象的程序设计语言,既有高阶函数(first-class functions)、列表推导(list-comprehension)、模式匹配(pattern-matching)、延时求值(lazy-evaluation)等函数式语言所具有的语言特征, 又具有和Java相近的语法结构,让熟悉Java的使用者便于上手。
目前,ELIte 已经从 OperaMasks 中抽离出来,其项目主页为:[url]www.sourceforge.net/projects/aom-elite[/url],而在最新下载的Apusic Application Server 5.1或者最新的AOM2.0中都包含有ELite引擎。

2.2. 在Operamasks中使用ELite

ELite本身是一个可以独立运行的动态语言引擎,如何单独使用ELite可以参见[url]http://aom.group.javaeye.com/group/blog/170038[/url]的介绍。而在AOM中使用ELite是非常简单的一件事情,建立一个Apusic 标准工程,给当前工程添加一个带有AOM支持的web模块,这个时候就可以在这个工程中使用ELite了。具体的Apusic Studio以及Apusic工程的介绍,请参见[url]http://www.operamasks.org/articles/studioProject/html_single[/url]等系列文章。通过一个简单的示例,讲解一下如何在AOM中使用ELite来进行Web应用的开发,希望能让读者对ELite的使用有一个初步的了解。
在WebContent目录下新建一个Facelets文件calc_elite.xhtml
在 WEB-INF/scripts 里面有一个 calc_elite.elite 的文件,代码示例如下:
<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:h="http://java.sun.com/jsf/html" renderKitId="AJAX">
  <w:page title="Calculator">
    <w:form id="calc" transient="true">
      <layout:panelGrid columns="3">
        <h:outputLabel for="first" />
        <w:textField id="first" />
        <h:message for="first" />
        <h:outputLabel for="second" />
        <w:textField id="second" />
        <h:message for="second" />
        <h:outputLabel for="result" />
        <h:outputText id="result" />
      </layout:panelGrid>
      <br/>
      <layout:panelGrid columns="4">
        <w:button id="add" />
        <w:button id="subtract" />
        <w:button id="multiply" />
        <w:button id="divide" />
      </layout:panelGrid>
    </w:form>
  </w:page>
</f:view>
@Bind @Required first::double = 22;
@Bind @Required second::double = 7;
@Bind @Pattern("#,##0.00") result::double;

@Action void add()      => result = first + second;
@Action void subtract() => result = first - second;
@Action void multiply() => result = first * second;
@Action void divide()   => result = first / second;

声明一个 double 的变量,语法形式是ELite语法,但同样可以任意的利用各种Java的annotation
用到了 @Pattern 的标注,用来指定数字的显示样式。你可以参考 AOM API文档。
声明一个@Action 方法,这个方法你还可以这样写:
@Action void add()      {
  result = first + second;
  System.out.println("add method invoked");
}
那么,calc_elite.xhtml 与 calc_elite.elite 是怎样关联起来的呢?在 operamasks.xml 中进行声明:
<view-mapping>
  <url-pattern>/calc_elite.xhtml</url-pattern>
  <model-bean>/WEB-INF/scripts/calc_elite.elite</model-bean>
</view-mapping>
如果觉得在 operamasks.xml 中进行配置很繁琐,那么,还可以这样:在页面中通过<om:elite>标签,将 ELite 代码片断放在其中。
<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:h="http://java.sun.com/jsf/html" renderKitId="AJAX" xmlns:om="http://www.apusic.com/jsf/misc">
  <om:elite>
  <![CDATA[
@Bind @Required first::double = 22;
@Bind @Required second::double = 7;
@Bind result::double = 0;
@Action add()=> result = first + second;  
@Action subtract() => result = first - second;
@Action multiply() => result = first * second;
@Action divide()   => result = first / second;
  ]]>
  </om:elite>
  <w:page title="Calculator">
    <w:form id="calc">
      <layout:panelGrid columns="3">
        <h:outputLabel for="first" />
        <w:textField id="first" />
        <h:message for="first" />
        <h:outputLabel for="second" />
        <w:textField id="second" />
        <h:message for="second" />
        <h:outputLabel for="result" />
        <h:outputText id="result" />
      </layout:panelGrid>
      <br />
      <layout:panelGrid columns="4">
        <w:button id="add" />
        <w:button id="subtract" />
        <w:button id="multiply" />
        <w:button id="divide" />
      </layout:panelGrid>
    </w:form>
  </w:page>
</f:view>
这个例子只是简单的介绍了一下ELite 在 AOM 中的应用,ELite能给使用者带来的绝对不仅仅是这些,希望 ELite 能够成为您的另外一种奇妙的选择。

3. 在JSF中使用Ruby

作为时下流行的动态语言Ruby来说,ROR(Ruby On Rails)的兴起让Ruby的风头在快速开发中独占鳌头。简单快捷,完全的面向对象是Ruby的特点,而随着JRuby的推出,在JVM上运行Ruby程序也已经成为现实,那么在使用JSF进行开发的过程中,是否也能使用Ruby这种快捷的动态语言呢?

3.1. Spring2带来的动态语言支持

当Spring2.0宣布推出集成动态语言的Feature,也就意味着在Java Web 开发中可以通过Spring的引入而支持动态语言的使用,Spring目前支持的动态语言有JRuby,Groovy,BeanShell三种。当一个Web应用中集成有Spring环境,那么在这个应用中使用动态语言就是一件很自然的事情,在这里讲述一下如何在一个JSF应用中来使用动态语言JRuby。

3.2. 在JSF应用中使用JRuby

由于AOM本身也就是一个JSF实现,所以在这里就偷个懒,直接将AOM当作一个普通的JSF来进行JRuby使用的示例环境了。同样在Apusic Studio中建一个Apusic标准工程,给当前工程添加一个Web模块,工程和Web模块的相关配置这里也就不详细介绍,有兴趣的朋友可以通过[url]http://www.operamasks.org[/url]去了解工具的一些使用细则。在AOM中使用Spring非常简单,下载的AOM产品包下包含有Spring2.0以及AOM对Spring支持的插件,只需要将这些jar包加入到工程的Build Path中就可以了。目前最新的Apusic Studio已经提供了Spring IDE的支持,可以很方便的在工具中给当前工程添加Spring的依赖,即刻通过下载最新的Apusic Studio来体验一下吧。
在WebContent目录下新建一个Facelets文件jruby.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE HTML PUBLIC "" "">
<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" xmlns:h="http://java.sun.com/jsf/html"
renderKitId="AJAX">
    <w:head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </w:head>
    <w:page title="Insert title here">
         <h:form>
             <h:inputText value="#{myBean.text}"></h:inputText>
             <h:commandButton action="#{myBean.click}" value="Submit"></h:commandButton>  
             You typed: #{myBean.text}  
         </h:form>
    </w:page>
</f:view>
在这个页面中引用的后台Bean的名称为“myBean”,在AOM中可以很方便的用Java来编写这个Bean,但在这里不是我们的目的,我们将用JRuby来实现这个后台Bean。
为了使用Ruby实现这个后台Bean,我们需要一个spring-jruby的接口,在web/src的jruby包下新建一个接口IMyBeanController
public interface IMyBeanController {  
  public String getText();  
  public void setText(String text);  
  public String click();  
}
同样在web/src的jruby包下新建一个MyBeanController.rb文件,以下是实现这个接口的Ruby代码
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  
最后一步是在WEB-INF目录下的Spring的配置文件applicationContext.xml中定义这个后台Bean
<lang:jruby id="myBean"  
script-interfaces="jruby.MyBeanController"  
script-source="classpath:jruby/MyBeanController.rb" scope="request">  
</lang:jruby>
在这个用动态语言定义的后台Bean中,也可以使用scope属性来定义它的作用域,这个示例中我们使用的是“request”作用域。为了能在JSF的后台Bean中使用通过Spring配置的Bean,我们需要Spring-Jsf的配合使用,关于这方面的介绍在[url]http://www.operamasks.org/articles/magic-6/html_single[/url]这篇文章中有很详细的介绍,在这里我们重点放在如何使用JRuby上。当然通过这种方式,我们也可以将在这里选用的动态语言改为Groovy或者BeanShell,而Groovy与Java语言的紧密性,使得Groovy在Java程序中的使用更为简单,这里之所以没有选用Groovy来做示例,完全是出于随机性,由于Spring对这几种动态语言的兼容,使得示例选择的语言变的不那么关键。
使用动态语言编写JSF的后台Bean的这种方式很有趣也很灵活,但还是有一些缺点让人觉得无奈
  • 使用动态语言编写的Bean为了能与spring集成,需要实现一个Java接口。
  • 对于后台Bean中的属性读写不够灵活
然而使用动态语言编写后台Bean带来的好处也是显而易见的,例如修改Bean的内容后可以不用重启应用或者重新部署应用,这个好处让你眼前一亮了吧。关于如何在其他的JSF实现中使用JRuby,相信读者都已经有一个清晰的思路了。

4. 总结

以上两节只是简单介绍了一下如何在OperaMasks中使用ELite和JRuby两种动态语言,由于ELite与OperaMasks的同源同宗,所以在OperaMasks中使用ELite显得更为自然,更为简单,而ELite的强大也让基于OperaMasks的Web开发变得更为灵活,同样的Spring对动态语言的支持,让动态语言的适应性得到了加强。
在Java Web编程中使用动态语言的特性可以显著降低Java编程的规模,并且动态语言的领域性和Java的健壮性可以让你的Java程序具有更多的平台特性。

转载于:https://blog.51cto.com/javafans/84680

在OperaMasks中使用ELite和JRuby动态语言的秘笈相关推荐

  1. 在Silverlight 2 beta1中使用IronPython等动态语言

    目前在Silverlight Tools Beta 1 for Visual Studio 2008 中包括了3个动态语言的运行库:IronPython.IronRuby和Managed JScrip ...

  2. python线上编辑问题_大型线上项目中动态语言诸多问题之二 -- 以 Python 语言为例...

    第一个问题:Mutable对象被误改 这个是在线上环境出现过的一个BUG 事后说起来很简单,服务端数据(放在dict里面的)被意外修改了,但查证的时候也花了许多时间,伪代码如下: def routin ...

  3. 【Groovy】Groovy 动态语言特性 ( Groovy 中函数实参自动类型推断 | 函数动态参数注意事项 )

    文章目录 前言 一.Groovy 中函数实参自动类型推断 二.函数动态参数注意事项 三.完整代码示例 前言 Groovy 是动态语言 , Java 是静态语言 ; 本篇博客讨论 Groovy 中 , ...

  4. 【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )

    文章目录 前言 一.Groovy 动态语言 二.Groovy 中的变量自动类型推断及动态调用 三.Java 中必须为变量指定其类型 前言 Groovy 是动态语言 , Java 是静态语言 ; 一.G ...

  5. 【Android 逆向】Android 中常用的 so 动态库 ( 拷贝 /system/lib/ 中的 Android 系统 so 动态库 )

    文章目录 一.拷贝 /system/lib/ 中的 Android 系统 so 动态库 一.拷贝 /system/lib/ 中的 Android 系统 so 动态库 将 Android 系统的 /sy ...

  6. 【转载】ABAP中数据和对象的动态创建和调用

    ABAP中数据和对象的动态创建和调用 动态创建数据或者对象是指在程序运行过程中创建数据变量或者对象实例,我们可以用引用定义来创建数据变量,格式为: CREATE DATA  gt_def TYPE ( ...

  7. 关系查询处理 查询优化 论文_每日论文33:关系数据库中的关键词查询结果动态优化...

    每日论文 第三十三篇 2020/08/18 摘要: 关键词查询可以帮助用户从数据库中快速获取感兴趣的内容,它不需要用户掌握专业的数据库结构化查询语言,降低了使用门槛.针对基于关键词的数据库查询,基于数 ...

  8. 下面的语言中哪些语言是动态语言( )

    下面的语言中哪些语言是动态语言(B    ) A.C B.JavaScript C.C++ D.CSS E.Java F.Objective-C 解析 静态语言(强类型语言) 静态语言是在编译时变量的 ...

  9. c++对象回收string类型成员时coredump_本体技术视点 | 虚拟机中引用性动态语言对象模型思考...

    1 引言 Ontology 的 NeoVM 虚拟机新增加了 DCALL.HAS_KEY.KEYS 以及 VALUES 等几条新的指令.因此,基于 NeoVM 的引用性动态语言对象的设计理论上可行,这可 ...

最新文章

  1. send和WSASend区别
  2. 玩转数据结构从入门到进阶三
  3. list中抽出某一个字段的值_使用LINQ获取List列表中的某个字段值
  4. 深入V8引擎-AST(2)
  5. 室内装修隐蔽工程验收知识拓展_装修之前先看知贤,『装修微课堂』室内装修隐蔽工程详解,装修小白防坑避雷手册!...
  6. mysql 存储 事务_MYSQL 可以在存储过程里实现事务控制吗
  7. 如何获取上传文件的本地路径
  8. dns是指网络域名系统_域名系统(DNS)是Internet的骨干。 这就是全部的运作方式。...
  9. 用python七巧板模型拼图形_用七巧板拼图形
  10. 纯Javascript实现Windows 8 Metro风格实现
  11. 中国女足3:2逆转!支付宝:1300万奖金已到位 蒙牛奖励千万现金
  12. java编译找不到符号_java编译时找不到符号,怎么处理
  13. QChart修改标题颜色,修改X轴Y轴字体颜色
  14. ROS中Plugin插件学习
  15. flutter doctor --android-licenses命令之后出现JAVA_HOME错误
  16. 20款简洁独特的logo设计
  17. ps入门教程、ps修图基本工具使用方法视频教学
  18. vue2.x版本要点(一)
  19. 简读《Head First设计模式》
  20. 如果金融男和IT男同时追你,你选谁?女孩的回答80%的人猜错了

热门文章

  1. jQuery - 设置内容和属性
  2. Java基础:异常机制
  3. poj1861 最小生成树 prim amp; kruskal
  4. 5月23日 JavaScript
  5. 【php】windows安装PHP5.5+Apache2.4
  6. javascript回车完美实现tab切换功能
  7. Servlet学习-request
  8. Rstudio连接spark失败
  9. 使用R语言进行中文分词
  10. android自定义控件绘制位置,Android自定义控件之——文字圆形边框(将文字绘制在圆中间)...