一、需求分析:
?
?? ? ? 最近开发过程中需要用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)
?
?
to xinnn
java解析js的用途在于使用javascript来脚本化你的java应用,比如提供差价机制,高可配置等,另外还可以用于服务端的script,主要是用来脚本化servlet.IBM Developerworks上有几篇关于服务端的javascript,写的很好,有兴趣你可以看看。
1. 偷取由 js 动态生成的网页内容。就算被扒网站绞尽脑汁防爬虫,不肯在 html 直接暴露页面内容,用 js 引擎一跑就暴露无遗了。
2. 任何语言都比 java 好用,js 也不例外。但是一些被洗过脑的不*明*真*相的群众总会以为 java 很高级,一定要你用 java,所以 js 引擎 for java 就派上用场了。(别怕慢,eclipse 为什么这么慢? 原因是某几个人脑子秀逗写了复杂度大于 O(n!) 的代码,一粒屎就能弄臭一锅汤,这种代码就算用汇编写都还是慢。)
3. 有了 js 引擎你就能跑 repl,这个时代连 repl 都没有就是个杯具。
真要浏览器,那就用SWT的brower也可以.设置浏览器类型为firefox
to xinnn
java解析js的用途在于使用javascript来脚本化你的java应用,比如提供差价机制,高可配置等,另外还可以用于服务端的script,主要是用来脚本化servlet.IBM Developerworks上有几篇关于服务端的javascript,写的很好,有兴趣你可以看看。
多谢兄台指教,以前在jbpm里可能碰到过类似你说的东西,但没有使用过,更对它的实现没有研究过,有时间一定恶补一下,孤陋寡闻了,惭愧!惭愧!
httpunit听说也可以
以上都没研究过,仅供参考,呵呵
模块中的一些参数必须要求配置相当灵活,有点像Excel中的公式,所以用rhino做了
解释引擎
to xinnn
java解析js的用途在于使用javascript来脚本化你的java应用,比如提供差价机制,高可配置等,另外还可以用于服务端的script,主要是用来脚本化servlet.IBM Developerworks上有几篇关于服务端的javascript,写的很好,有兴趣你可以看看。
其实我是在整理这一方面的资料,测试代码还没放上去,目前遇到了比较棘手的问题,就是xmlrequet的处理,lobo无法加载,rhino的话我所用的解决方案直接崩溃掉了,如果可以的话我想向你请教rhino的问题