当前位置: 代码迷 >> JavaScript >> JavaScript解析发动机For Java
  详细解决方案

JavaScript解析发动机For Java

热度:422   发布时间:2012-11-08 08:48:11.0
JavaScript解析引擎For Java

一、需求分析:

?

?? ? ? 最近开发过程中需要用java去执行JavaScript,获得一些动态生成的东西,这就想到了JavaScript解析引擎了。

?

二、资料收集:

?

?? ? ? 目前来说用java做的解析引擎不多,下面是一个比较好的解析引擎,来自Mozilla:

?? ? ? ?http://www.mozilla.org/rhino/download.html

?光有解析引擎还是不够的,还需要完善的解决方案和api,看看开源世界为我们带来什么:

1.ladyrBrowser

?? ? ? ? ? ?https://www.ladyr.es/ladyrbrowser/wiki

这个上次提到过,一直没来得及做总结,他是一个西班牙的研究机构写的浏览器,用的技术是xulrunner和swt结合。其实核心是火狐,不过提供java的api去进行一些dom对象的操作,事件模拟,JavaScript解析和执行之类的操作。但是经过大规模的测试,不太稳定,而且容易崩溃,要使用的话估计需要修改源代码进行优化。

2.Lobo and Cobra

?? ? ? ? ? ??http://lobobrowser.org/index.jsp

?? ? ? ? ? 这是一个纯java写的浏览器,用的也是Rhino作为解析引擎,支持html,css和JavaScript和一些扩展。lobo和Cobra关注点不一样,lobo关注与对一些插件的支持,如javafx等等,而Cora关注与html的解析。所以我先选择它作为我的首选解决方案.

?

三,研究测试

?

运行lobo浏览器需要下载相关的jar包,设置classpath的时候,lobo.jar和lobo-pub.jar是必须的,然后其他的插件支持放在ext文件夹下与lobo.jar和lobo-pub.jar放在同一目录下.

?

然后运行官方的测试类:(http://lobobrowser.org/browser/api-info.jsp)

?

?

import java.awt.event.WindowEvent;
import javax.swing.*;
import javax.swing.border.*;
import org.lobobrowser.gui.*;
import org.lobobrowser.main.PlatformInit;

public class BrowserPanelTest extends JFrame {
	public static void main(String[] args) throws Exception {
		// Initialize logging.
		PlatformInit.getInstance().initLogging(false);

		// This step is necessary for extensions to work:
		PlatformInit.getInstance().init(false, false);
		
		// Create frame with a specific size.
		JFrame frame = new BrowserPanelTest();
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setSize(600, 400);
		frame.setVisible(true);
	}

	public BrowserPanelTest() throws Exception {
		this.setTitle("Lobo Demo");
		final BrowserPanel bp = new BrowserPanel();
		bp.setBorder(BorderFactory.createTitledBorder(new EtchedBorder(EtchedBorder.RAISED), "Embedded browser"));
		bp.navigate("http://lobobrowser.org/browser/home.jsp");
		this.getContentPane().add(bp);
		
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				// This needs to be called in order
				// to inform extensions about the
				// window closing.
				bp.windowClosing();
			}
		});
	}
}
?

就可以看到浏览器,不过这里可能会报错,暂时还没理解清楚是什么原因,但是毕竟是能用了.

?

接下来是Cobra的解析功能(http://lobobrowser.org/cobra/getting-started.jsp)

?

?

1 楼 kjj 2009-12-25  
很想看到你的后继文章,我也对此感兴趣!!
2 楼 BarryWei 2009-12-26  
楼主做的测试代码,抓个效果图看看……
3 楼 xinnn 2009-12-26  
java解析js第一次听说,不知道是在什么业务场景下的,期待深度探讨
4 楼 abruzzi 2009-12-26  
言之无物,文中给出的例子直接就引用自lobo的官方demo,怎么还这么多投良好贴?rhino是java版的js引擎,但是说到如何使用,怎么就戛然而止了。这个世界上的demo已经足够多了,少的是能沉下心来深入研究。

to xinnn
java解析js的用途在于使用javascript来脚本化你的java应用,比如提供差价机制,高可配置等,另外还可以用于服务端的script,主要是用来脚本化servlet.IBM Developerworks上有几篇关于服务端的javascript,写的很好,有兴趣你可以看看。
5 楼 一粒蛋 2009-12-26  
作用是

1. 偷取由 js 动态生成的网页内容。就算被扒网站绞尽脑汁防爬虫,不肯在 html 直接暴露页面内容,用 js 引擎一跑就暴露无遗了。

2. 任何语言都比 java 好用,js 也不例外。但是一些被洗过脑的不*明*真*相的群众总会以为 java 很高级,一定要你用 java,所以 js 引擎 for java 就派上用场了。(别怕慢,eclipse 为什么这么慢? 原因是某几个人脑子秀逗写了复杂度大于 O(n!) 的代码,一粒屎就能弄臭一锅汤,这种代码就算用汇编写都还是慢。)

3. 有了 js 引擎你就能跑 repl,这个时代连 repl 都没有就是个杯具。
6 楼 wannago 2009-12-26  
google gwt就是用rhino实现的 java到javascript的转换。
7 楼 nishizhutou 2009-12-27  
没看懂,解析JS用rhino不就够了?
真要浏览器,那就用SWT的brower也可以.设置浏览器类型为firefox
8 楼 xinnn 2009-12-28  
abruzzi 写道
言之无物,文中给出的例子直接就引用自lobo的官方demo,怎么还这么多投良好贴?rhino是java版的js引擎,但是说到如何使用,怎么就戛然而止了。这个世界上的demo已经足够多了,少的是能沉下心来深入研究。

to xinnn
java解析js的用途在于使用javascript来脚本化你的java应用,比如提供差价机制,高可配置等,另外还可以用于服务端的script,主要是用来脚本化servlet.IBM Developerworks上有几篇关于服务端的javascript,写的很好,有兴趣你可以看看。



多谢兄台指教,以前在jbpm里可能碰到过类似你说的东西,但没有使用过,更对它的实现没有研究过,有时间一定恶补一下,孤陋寡闻了,惭愧!惭愧!
9 楼 ywlqi 2009-12-28  
jdk1.6不是可以执行js吗?
httpunit听说也可以
以上都没研究过,仅供参考,呵呵
10 楼 cyberniuniu 2009-12-28  
试了一下lobo浏览器,效果还不错,作为纯java实现的浏览器,速度令人满意。分析了一下lobo对javafx的支持,主要是直接采用了javafx runtime的一些组件,但对多媒体的支持虽然有jmc.jar,但是缺少本地库,因此无法支持更多的媒体格式,还是要带上jmc.dll才行。rhino执行javascript还不错,但目前我不清楚rhino的机制,如果也是纯java实现的js执行引擎,那很有意义。
11 楼 xingqiliudehuanghun 2009-12-29  
目前只用过mozzila的rhino,也是参考的IBM上的文章。只所以使用脚本是因为我写的
模块中的一些参数必须要求配置相当灵活,有点像Excel中的公式,所以用rhino做了
解释引擎
12 楼 xo_knight 2010-01-04  
abruzzi 写道
言之无物,文中给出的例子直接就引用自lobo的官方demo,怎么还这么多投良好贴?rhino是java版的js引擎,但是说到如何使用,怎么就戛然而止了。这个世界上的demo已经足够多了,少的是能沉下心来深入研究。

to xinnn
java解析js的用途在于使用javascript来脚本化你的java应用,比如提供差价机制,高可配置等,另外还可以用于服务端的script,主要是用来脚本化servlet.IBM Developerworks上有几篇关于服务端的javascript,写的很好,有兴趣你可以看看。


其实我是在整理这一方面的资料,测试代码还没放上去,目前遇到了比较棘手的问题,就是xmlrequet的处理,lobo无法加载,rhino的话我所用的解决方案直接崩溃掉了,如果可以的话我想向你请教rhino的问题
  相关解决方案