日期:2014-05-16  浏览次数:20386 次

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 就派上用场了。(别怕慢