注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

使用Java的javax.script包调用JavaScript脚本代码示例详解说明  

2012-12-21 08:08:52|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 JDK1.6加入了对Script(JSR223)的支持。这是一个脚本框架,提供了让脚本语言来访问Java内部的方法。你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本。这个脚本API允许你为脚本语言提供Java支持。另外,Web Scripting Framework允许脚本代码在任何的Servlet容器(例如Tomcat)中生成Web内容。


关于ScriptEngine和ScriptEngineManager的使用:

 超做js首先需要ScriptEngine

  在jdk中可以用3中方式获得:

 

Java代码
  1. mgr.getEngineByExtension(String extension)  
  2. mgr.getEngineByMimeType(String mimeType)  
  3. mgr.getEngineByName(String shortName)  

         

getEngineByExtension可用参数:

 

Java代码 
  1. js  

  eg:

Java代码 
  1. ScriptEngineManager mgr = new ScriptEngineManager();    
  2. ScriptEngine engine = mgr.getEngineByExtension("js");  

 

 getEngineByMimeType可用参数:

Java代码 
  1. application/javascript  
  2. application/ecmascript  
  3. text/javascript  
  4. text/ecmascript  

eg:  

Java代码 
  1. ScriptEngineManager mgr = new ScriptEngineManager();    
  2. ScriptEngine engine = mgr.getEngineByMimeType("application/javascript");  

 

getEngineByName可用参数:

Java代码 
  1. js  
  2. rhino  
  3. JavaScript  
  4. javascript  
  5. ECMAScript//js和javascript是它的扩展  

 eg:

写道
ScriptEngineManager mgr = new ScriptEngineManager(); 
ScriptEngine engine = mgr.getEngineByName("JavaScript");

 

具体解析js可以是加载js文件或者js 脚本字符串:

例如夹在js文件:

Java代码 
  1. engine.eval(new FileReader(jsfile));      

    或者

  

Java代码 
  1. engine.eval(jsstring);     

 解析js需要Invocable 类:首先ScriptEngine 记载js文件或者字符串(如上):

 然后转化为Invocable 就可以用来执行我们的js函数:

eg:

Java代码 
  1. engine.eval("function test(){return 'this is test js in java'}");     
  2. Invocable inv = (Invocable) engine;     
  3. String value = String.valueOf(inv.invokeFunction("test"));  
  4.   

Java代码 
  1. /**    
  2.  * ScriptTest 
  3.  *  java调用javascript示例代码 
  4.  * @author  your name 
  5.  * Date: Nov 4, 2011 
  6.  */  
  7. package org.sun.script.js;  
  8.   
  9. import java.awt.Component;  
  10. import java.awt.Container;  
  11. import java.awt.EventQueue;  
  12. import java.beans.EventSetDescriptor;  
  13. import java.beans.IntrospectionException;  
  14. import java.beans.Introspector;  
  15. import java.io.FileReader;  
  16. import java.lang.reflect.InvocationHandler;  
  17. import java.lang.reflect.InvocationTargetException;  
  18. import java.lang.reflect.Method;  
  19. import java.lang.reflect.Proxy;  
  20. import java.util.Properties;  
  21.   
  22. import javax.script.ScriptEngine;  
  23. import javax.script.ScriptEngineFactory;  
  24. import javax.script.ScriptEngineManager;  
  25. import javax.swing.JButton;  
  26. import javax.swing.JFrame;  
  27. import javax.swing.JPanel;  
  28.   
  29. public class ScriptTest  
  30. {  
  31.       
  32.     public static void main(final String[] args)  
  33.     {  
  34.         EventQueue.invokeLater(new Runnable()  
  35.         {  
  36.             public void run()  
  37.             {  
  38.                 String language;  
  39.                 if (args.length == 0)  
  40.                     language = "js";  
  41.                 else  
  42.                     language = args[0];  
  43.                   
  44.                 ScriptEngineManager manager = new ScriptEngineManager();  
  45.                 System.out.println("Available factories: ");  
  46.                 for (ScriptEngineFactory factory : manager.getEngineFactories())  
  47.                     System.out.println(factory.getEngineName());  
  48.                 final ScriptEngine engine = manager.getEngineByName(language);  
  49.                   
  50.                 if (engine == null)  
  51.                 {  
  52.                     System.err.println("No engine for " + language);  
  53.                     System.exit(1);  
  54.                 }  
  55.                   
  56.                 ButtonFrame frame = new ButtonFrame();  
  57.                   
  58.                 try  
  59.                 {  
  60.                     // File initFile = new File("init." + language);  
  61.                     // if (initFile.exists())  
  62.                     // {  
  63.                     // System.out.println("exists");  
  64.                     // engine.eval(new FileReader(initFile));  
  65.                     // }  
  66.                       
  67.                     getComponentBindings(frame, engine);  
  68.                       
  69.                     final Properties events = new Properties();  
  70.                     events.load(new FileReader("bin\\org\\sun\\script\\js\\" + language + ".properties"));  
  71.                     for (final Object e : events.keySet())  
  72.                     {  
  73.                         String[] s = ((String) e).split("\\.");  
  74.                         addListener(s[0], s[1], (String) events.get(e), engine);  
  75.                     }  
  76.                 }  
  77.                 catch (Exception e)  
  78.                 {  
  79.                     e.printStackTrace();  
  80.                 }  
  81.                   
  82.                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  83.                 frame.setTitle("ScriptTest");  
  84.                 frame.setVisible(true);  
  85.             }  
  86.         });  
  87.     }  
  88.       
  89.     /** 
  90.      * Gathers all named components in a container. 
  91.      *  
  92.      * @param c the component 
  93.      * @param namedComponents 
  94.      */  
  95.     private static void getComponentBindings(Component c, ScriptEngine engine)  
  96.     {  
  97.         String name = c.getName();  
  98.         if (name != null)  
  99.             engine.put(name, c);  
  100.         if (c instanceof Container)  
  101.         {  
  102.             for (Component child : ((Container) c).getComponents())  
  103.                 getComponentBindings(child, engine);  
  104.         }  
  105.     }  
  106.       
  107.     /** 
  108.      * Adds a listener to an object whose listener method executes a script. 
  109.      *  
  110.      * @param beanName the name of the bean to which the listener should be 
  111.      *            added 
  112.      * @param eventName the name of the listener type, such as "action" or 
  113.      *            "change" 
  114.      * @param scriptCode the script code to be executed 
  115.      * @param engine the engine that executes the code 
  116.      * @param bindings the bindings for the execution 
  117.      */  
  118.     private static void addListener(String beanName, String eventName, final String scriptCode,  
  119.             final ScriptEngine engine) throws IllegalArgumentException, IntrospectionException, IllegalAccessException,  
  120.             InvocationTargetException  
  121.     {  
  122.         Object bean = engine.get(beanName);  
  123.         EventSetDescriptor descriptor = getEventSetDescriptor(bean, eventName);  
  124.         if (descriptor == null)  
  125.             return;  
  126.         descriptor.getAddListenerMethod().invoke(bean,  
  127.                 Proxy.newProxyInstance(nullnew Class[] { descriptor.getListenerType() }, new InvocationHandler()  
  128.                 {  
  129.                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  
  130.                     {  
  131.                         engine.eval(scriptCode);  
  132.                         return null;  
  133.                     }  
  134.                 }));  
  135.           
  136.     }  
  137.       
  138.     private static EventSetDescriptor getEventSetDescriptor(Object bean, String eventName)  
  139.             throws IntrospectionException  
  140.     {  
  141.         for (EventSetDescriptor descriptor : Introspector.getBeanInfo(bean.getClass()).getEventSetDescriptors())  
  142.             if (descriptor.getName().equals(eventName))  
  143.                 return descriptor;  
  144.         return null;  
  145.     }  
  146. }  
  147.   
  148. class ButtonFrame extends JFrame  
  149. {  
  150.     public ButtonFrame()  
  151.     {  
  152.         setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);  
  153.           
  154.         panel = new JPanel();  
  155.         panel.setName("panel");  
  156.         add(panel);  
  157.           
  158.         yellowButton = new JButton("Yellow");  
  159.         yellowButton.setName("yellowButton");  
  160.         blueButton = new JButton("Blue");  
  161.         blueButton.setName("blueButton");  
  162.         redButton = new JButton("Red");  
  163.         redButton.setName("redButton");  
  164.           
  165.         panel.add(yellowButton);  
  166.         panel.add(blueButton);  
  167.         panel.add(redButton);  
  168.     }  
  169.       
  170.     public static final int DEFAULT_WIDTH = 300;  
  171.     public static final int DEFAULT_HEIGHT = 200;  
  172.       
  173.     private JPanel panel;  
  174.     private JButton yellowButton;  
  175.     private JButton blueButton;  
  176.     private JButton redButton;  
  177. }  

 

Js代码
  1. js.properties  
Js代码 
  1. <pre class="js" name="code">yellowButton.action=panel.background = java.awt.Color.YELLOW  
  2. blueButton.action=panel.background = java.awt.Color.BLUE  
  3. redButton.action=panel.background = java.awt.Color.RED</pre>  
  评论这张
 
阅读(571)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016