分类 标签 存档 ME! 黑客派 订阅 搜索

JavaFX 尝鲜

210 浏览

      java6 出来以后,其一大特色就是对脚本语言的支持。以前只是粗略看了一下,没感觉到有什么具体的用处。最近又对 java 的特有脚本语言 javaFX 了解一下,感觉挺有意思。



一. 以下是几个相关网址:

   1.sun javafx 官方网站:.www.sun.com/software/javafx/script/

   2.openjfx 网站:  openjfx.dev.java.net/

   3.JavaFX: First Steps - "Hello OnJava" App  www.oreillynet.com/onjava/blog/2007/05/javafx_first_steps_hello_onjav_1.html

   4.The JavaFX Script Programming Language Reference (Chinese version)



hello world 式的程序,很简单,稍看一下文档就明白了。

二. 我比较喜欢这个语言的下面几个特征:

 

     这个语言融合了 javascript,php,actionscript,sql 等许多脚本语言的特征。



    1.数组操作很有特色

         var nums = [0..3];

         ..  是范围表达式,上面的语句相当于  var nums == [0,1,2,3];

         数组支持类似于 sql 语句一样的查询表达式。

        var nums = select n*n from n in [1..100];

        结果便是从 1 到 100 每个数字的平方组成的数组。



     2.字符串

        javaFX 中的字符串支持嵌入表达式

      

 

  1. var name = 'Joe';  
  2. var s = "Hello {name}";  
  3. System.out.println(s);  


       程序在输出结果的时候会自动把字符串中的表达式 {} 算出来,替换成结果 。这段程序的输出结果是 : Hello Joe

       这个特点和 php 很相似。用在来做结果输出模板时很有用,不必用自己创造标签语法,输出的时候又得用正则分析,替换。



    3.类与对象

       对象声明可以用一种类似于 json 的语法进行。

 

  1. class Person {  
  2.         attribute name: String;  
  3.         attribute parent: Person inverse Person.children;  
  4.         attribute children: Person* inverse Person.parent;  
  5.         function getFamilyIncome(): Number;  
  6.         function getNumberOfChildren(): Number;  
  7.         operation marry(spouse: Person);  
  8.     }  
  9.   
  10. var chris = Person {  
  11.         name: "Chris"  
  12.         children:  
  13.         [Person {  
  14.             name: "Dee"  
  15.         },  
  16.         Person {  
  17.             name: "Candice"  
  18.         }]  
  19.     };  


      

       4.很有特色的反射操作

      javaFX 的反射很奇妙,我都在想,为什么 java 的反射也不做成这样。

 

  1. import java.lang.System;  
  2.   
  3.     System.out.println(1.class.Name) // prints "Number"  
  4.     System.out.println("Hello".class.Name); // prints "String"  


      方便吧?



三. 在 web 中的尝试。


      看了说明,好像 javaFX 出现的目标是简化 Swing 的界面开发编程。一方面 javaFX 还没有一个好的所见即所得的 ide 支持,另外本人对 web 方面的编程比较感兴趣。所以进行了一个小实验。

     我的思路是用一个 servlet 拦截所有对 fx 的请求,根据 requestURI, 获得 javafx 文件的绝对路径,然后在 servelt 中调用 java6 的脚本引擎,解释执行。

 FXServlet.java


java 代码

 

  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.IOException;  
  4. import java.io.InputStreamReader;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import javax.script.Bindings;  
  11. import javax.script.ScriptContext;  
  12. import javax.script.ScriptEngine;  
  13. import javax.script.ScriptEngineManager;  
  14. import javax.script.SimpleScriptContext;  
  15.   
  16. public class FXServlet extends HttpServlet {  
  17.   
  18.     private String realPath;  
  19.       
  20.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  21.             throws ServletException, IOException {  
  22.   
  23.         this.doWork(request, response);  
  24.     }  
  25.   
  26.   
  27.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  28.             throws ServletException, IOException {  
  29.   
  30.         this.doWork(request, response);  
  31.     }  
  32.       
  33.     public void doWork(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{  
  34.         System.out.println("begin ....");  
  35.          try {  
  36.                 ClassLoader loader = Thread.currentThread().getContextClassLoader();  
  37.                 ScriptEngineManager manager = new ScriptEngineManager(loader);  
  38.                 ScriptEngine engine = manager.getEngineByExtension("fx");  
  39.   
  40.                 Bindings bindings = engine.createBindings();  
  41.                 // 将 request 和 response 两个对象传递给脚本引擎。  
  42.                 bindings.put("REQUEST:javax.servlet.http.HttpServletRequest",request);  
  43.                 bindings.put("RESPONSE:javax.servlet.http.HttpServletResponse",response);  
  44.                   
  45.                 ScriptContext context = new SimpleScriptContext();  
  46.                 context.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);  
  47.                 context.setBindings(bindings, ScriptContext.ENGINE_SCOPE);  
  48.                 engine.setContext(context);  
  49.                 String uri = request.getRequestURI();  
  50.                 String contextPath = request.getContextPath();  
  51.                 // 将 requestURI 中的 contextPath 替换掉  
  52.                 if(contextPath!=null&&contextPath.trim().length()>0){  
  53.                     uri = uri.replaceAll(contextPath,"");  
  54.                 }  
  55.                 // 根据 requestURI 取得 fx 文件的绝对地址  我们把 fx 文件放在站点的 WEB-INF 下的 jfx 目录下。  
  56.                 String filePath = this.realPath + "WEB-INF"+ File.separator +"jfx" + uri;  
  57.                 File jfxFile =  new File(filePath);  
  58.                   
  59.                 if(!jfxFile.exists()){  
  60.                     response.sendError(404);  
  61.                 }else{  
  62.                     InputStreamReader reader = new InputStreamReader(new FileInputStream(jfxFile));  
  63.                     engine.eval(reader);  
  64.                     reader.close();  
  65.                 }  
  66.             } catch (Exception e) {  
  67.                 e.printStackTrace();  
  68.             }  
  69.             System.out.println("... end");  
  70.     }  
  71.   
  72.     public void init() throws ServletException {  
  73.         this.realPath = this.getServletContext().getRealPath("/");  
  74.     }  
  75.   
  76. }  




web.xml


xml 代码

 

  1. xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4"   
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   ;
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  7.   <servlet>  
  8.     <servlet-name>FXServlet</servlet-name>  
  9.     <servlet-class>net.teamhot.jfxweb.FXServlet</servlet-class>  
  10.   </servlet>  
  11.   
  12.   <servlet-mapping>  
  13.     <servlet-name>FXServlet</servlet-name>  
  14.     <url-pattern>*.fx</url-pattern>  
  15.   </servlet-mapping>  
  16. </web-app>  




Hello.fx


 

  1. import java.lang.System;  
  2. import javax.servlet.http.HttpServlet;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5. import java.io.PrintWriter;  
  6.   
  7.     // 接受从 java 中传递过来的参数  
  8.     var request:HttpServletRequest = REQUEST;  
  9.     var response:HttpServletResponse = RESPONSE;  
  10.       
  11.     var name = request.getParameter("name");  
  12.     var out:PrintWriter = response.getWriter();  
  13.       
  14.     var template = "Hello World!{if name ==null then 'guest' else name}";  
  15.   
  16.     out.print(template);  




运行 http//localhost:8080/jfx/Hello.fx

结果: Hello World!guest



运行 http//localhost:8080/jfx/Hello.fx?name=jolestar

结果: Hello World!jolestar



注意: 本程序需要 tomcat 在 jdk6 环境下运行,如果还是提示找不到javax.script.ScriptEngine,请将 jdk6 lib 下面的 rt.jar 中的 javax.script 包抽取出来,重新打包后放到 tomcat  common lib 下面。

转自:http://jolestar.javaeye.com/blog/107017


欢迎注册黑客派社区,开启你的博客之旅。让学习和分享成为一种习惯!

评论  
留下你的脚步
推荐阅读