原创文章。转载请注明。
阅读本文之前,您须要对浏览器怎样载入 javascript 有一定了解。
当然,对 java 与 javascript 本身也须要了解。
本文首先介绍浏览器载入并执行 javascript 的原理。
其次将介绍怎样用 java 与 javascript 互调用对象。
最后介绍怎样用 java 实现 javascript 的 document 对象与其他内置方法。
浏览器从 server 得到含有 javascript 代码的 html 文本后,将顺序运行 javascript 代码块。
看代码是最简单的方式:
- package org.taoningyu.js;
- import java.io.IOException;
- import java.net.MalformedURLException;
- import java.net.URL;
- import javax.script.Invocable;
- import javax.script.ScriptEngine;
- import javax.script.ScriptEngineManager;
- import javax.script.ScriptException;
- import org.jsoup.Jsoup;
- import org.jsoup.nodes.Document;
- import org.jsoup.nodes.Element;
- public class TaoDocument {
- Document mydoc = null;
- public TaoDocument(String url) throws MalformedURLException,
- IOException {
- mydoc = Jsoup.parse(new URL(url), 30000); //利用Jsoup实现document树
- }
- public Element getElementById(String id) { //实现document的getElementById方法
- System.out.println("Java println:\t" + mydoc.getElementById(id));
- return mydoc.getElementById(id); //返回的是Element对象
- }
- public static void main(String[] args) throws MalformedURLException,
- IOException {
- ScriptEngineManager sem = new ScriptEngineManager();
- ScriptEngine se = sem.getEngineByName("javascript"); //初始化Java内置的javascript引擎
- try {
- se.eval("function test() {" + "id='areaDefault'; print('js print:'+document.getElementById(id));return document.getElementById(id);}");
- //測试用javascript自己定义函数,功能为输出id为areaDefault的元素,并返回。
- Invocable invocableEngine = (Invocable) se; //转换引擎类型为Invocable
- se.put("document", new TaoDocument("http://www.ifeng.com/")); //关联对象,这一步非常重要,关联javascript的document对象为TaoDocument。亦即我自己实现的document对象
- Element callbackvalue = (Element) invocableEngine.invokeFunction("test"); //直接执行函数。返回值为Element
- System.out.println("callback return :" + callbackvalue); //打印输出返回内容
- se.eval("test()"); //第二种调用函数方式,我更偏爱此种方式
- } catch(ScriptException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch(NoSuchMethodException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
通过实现 document 对象,就能够动态解析 html 页面了。
在另外的文章。我将介绍怎样结合 httpclient,使其成为 headless 浏览器的雏形。
来源: http://www.bubuko.com/infodetail-2218362.html