继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

在OperaMasks中使用ELite和JRuby动态语言的秘笈

PIPIONE
关注TA
已关注
手记 921
粉丝 147
获赞 701

如何在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程序具有更多的平台特性。

©著作权归作者所有:来自51CTO博客作者javafans8171的原创作品,如需转载,请注明出处,否则将追究法律责任

Javaweb开发休闲web开发


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP