🎶 Sym - 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台

📕 思源笔记 - 一款桌面端笔记应用,支持 Windows、Mac 和 Linux

🎸 Solo - B3log 分布式社区的博客端节点,欢迎加入下一代社区网络

♏ Vditor - 一款浏览器端的 Markdown 编辑器

JavaFX 尝鲜

      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

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

留下你的脚步