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. attributename:String;
  3. attributeparent:PersoninversePerson.children;
  4. attributechildren:Person*inversePerson.parent;
  5. functiongetFamilyIncome():Number;
  6. functiongetNumberOfChildren():Number;
  7. operationmarry(spouse:Person);
  8. }
  9. varchris=Person{
  10. name:"Chris"
  11. children:
  12. [Person{
  13. name:"Dee"
  14. },
  15. Person{
  16. name:"Candice"
  17. }]
  18. };


4.很有特色的反射操作
javaFX的反射很奇妙,我都在想,为什么java的反射也不做成这样。

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


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. < servlet-mapping >
  12. < servlet-name > FXServlet </ servlet-name >
  13. < url-pattern > *.fx </ url-pattern >
  14. </ servlet-mapping >
  15. </ 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. //接受从java中传递过来的参数
  7. varrequest:HttpServletRequest=REQUEST;
  8. varresponse:HttpServletResponse=RESPONSE;
  9. varname=request.getParameter("name" );
  10. varout:PrintWriter=response.getWriter();
  11. vartemplate="HelloWorld!{ifname==nullthen'guest'elsename}" ;
  12. 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

你可能感兴趣的:(JavaFX)