- 浏览: 617935 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (314)
- 生活 (2)
- c# (37)
- 技术 (3)
- 400电话 (0)
- 400常见问题 (0)
- 400资费 (0)
- html (7)
- css (0)
- 数据库 (7)
- javascript (16)
- php (33)
- asp.net mvc2 (10)
- mysql (9)
- C# 3.0 LinQ (10)
- vs2005或vs2008 (4)
- flash and as3 (7)
- fms (1)
- dedeCMS (11)
- java (33)
- j2me (1)
- swing (1)
- c++ (1)
- jquery easyui (3)
- jquery (5)
- android (29)
- MongoDB (9)
- VtigerCRM (1)
- test (0)
- linux (30)
- nutch (2)
- SqlServer数据库 (2)
- 数据检索 (2)
- java抓取 (11)
- 乐天 (1)
- 淘宝 (1)
- Silverlight4.0 (6)
- sphinx实时索引 (5)
- ecshop (9)
- codeigniter(CI) (3)
- axure6 (1)
- 京东店铺装修教程 (2)
- xpath (1)
- joomla (2)
- bpm (1)
- Bootstrap (2)
- knockout (4)
- ecstore (4)
- css3 (1)
- 微信 (2)
- dede (0)
- soa_edi (1)
- odoo (0)
- web (1)
最新评论
-
骑着蜗牛超F1:
在ie6下报了个stack overflow at line ...
兼容ie6和ie7 的16进制码流在html中显示为图片代码(base64) -
冰之海洋:
好像少了一句代码吧? FloatingFunc.show(th ...
android 一直在最前面的浮动窗口效果 -
yanzhoupuzhang:
连接有问题!
iis7.0官方下载 IIS 7.0(微软Web服务器组件IIS 7.0) 官方(windows 2003,XP,2000) -
whatable:
唉,楼主你都没有搞清楚重量级和轻量级。。。。既然引用了SWT, ...
java swing 内置浏览器打开网页显示flash图表-swt Browser应用 -
yy_owen:
我晕啊,你链接的什么内容额,我要的iis,你链接个视频什么意思 ...
iis7.0官方下载 IIS 7.0(微软Web服务器组件IIS 7.0) 官方(windows 2003,XP,2000)
package es.ladyr.javaxpcom.browser; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.browser.ProgressListener; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.mozilla.interfaces.*; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.SWTError; public class SimpleBrowser { public static void main(String args[]) { final Browser browser; Display display = new Display(); Shell shell = new Shell(display); shell.setSize(800, 600); shell.open(); //Initiating the browser using SWT try { browser = new Browser(shell, SWT.MOZILLA); } catch (SWTError e) { System.out.println("Could not instantiate Browser: " + e.getMessage()); return; } // Adapt browser size to shell size browser.setBounds(shell.getClientArea()); // Load an URL into the web browser browser.setUrl("http://www.google.com"); // Listens for page loading status. browser.addProgressListener(new ProgressListener() { public void changed(ProgressEvent event) { } public void completed(ProgressEvent event) { nsIWebBrowser webBrowser = (nsIWebBrowser)browser.getWebBrowser(); nsIDOMWindow window = webBrowser.getContentDOMWindow(); nsIDOMDocument document = window.getDocument(); System.out.println(document); } }); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } }
4 在java代码里嵌入Firefox3
现在可以去用一下有用的例子了。首先我们在一个java程序里使用SWT来嵌入一个Mozilla浏览器。现在,我们可以使用
org.eclipse.swt.browser.Browser类来实例化:browser = new Browser(shell, SWT.MOZILLA); 在这之前,我们需要使用ATF项目
,以及一下ATF插件。非常幸运,现在我们不需要这些补丁了。
4.1 配置环境
为了在java程序里嵌入Mozilla浏览器,我们需要使用SWT来创建窗口和嵌入浏览器。
4.1.1 安装swt
下载对应操作系统的swt,加到classpath就好了
4.1.2 配置swt
运行后面例子需要的jar包:
javaxpcom.jar
MozillaInterfaces.jar
MozillaGlue.jar
swt.jar
src.zip
4.2 Web Browser例子
接下来,我们将增加一下SWT widgets来实现通常的交换,比如输入url,前进与后退,菜单,和两种类型:
传入一个参数制定XULRunner的路径
不传入参数使用系统安装的XULRunner
package es.ladyr.javaxpcom.browser; import java.io.IOException; import java.io.InputStream; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.browser.ProgressListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; public class LadyrBrowser { private static final int WIDTH = 800; private static final int HEIGHT = 600; Browser browser; private Combo uriCombo; private final ToolItem backItem; private final ToolItem forwardItem; /** * * @param xulrunnerPath if you have a XULRunner valid version in your system, but not * installed, you can use that version to run the browser. This param must contain * its path, or null in other case. */ public LadyrBrowser(String xulrunnerPath) { Display display = new Display(); Shell shell = new Shell(display); shell.setSize(WIDTH, HEIGHT); GridLayout gridLayout = new GridLayout(1, true); shell.setLayout(gridLayout); // Set the menu bar // create the menu Menu menuBar = new Menu(shell, SWT.BAR); // create a file menu and add an exit item final MenuItem file = new MenuItem(menuBar, SWT.CASCADE); file.setText("&File"); final Menu filemenu = new Menu(shell, SWT.DROP_DOWN); file.setMenu(filemenu); final MenuItem exitMenuItem = new MenuItem(filemenu, SWT.PUSH); exitMenuItem.setText("&Exit/tCTRL+E"); exitMenuItem.setAccelerator(SWT.CTRL + 'E'); exitMenuItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { System.exit(0); } }); // create a Help menu and add an about item final MenuItem helpMenuItem = new MenuItem(menuBar, SWT.CASCADE); helpMenuItem.setText("&Help"); final Menu helpmenu = new Menu(shell, SWT.DROP_DOWN); helpMenuItem.setMenu(helpmenu); final MenuItem aboutMenuItem = new MenuItem(helpmenu, SWT.PUSH); aboutMenuItem.setText("&About"); shell.setMenuBar(menuBar); // Set the toolbar ToolBar toolbar = new ToolBar(shell, SWT.FLAT); backItem = new ToolItem(toolbar, SWT.PUSH); backItem.setImage(getImage("resources/back.png")); backItem.setEnabled(false); forwardItem = new ToolItem(toolbar, SWT.PUSH); forwardItem.setImage(getImage("resources/forward.png")); forwardItem.setEnabled(false); backItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { if (browser.isBackEnabled()) { browser.back(); } } }); forwardItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { if (browser.isForwardEnabled()) { browser.forward(); } } }); final ToolItem refreshItem = new ToolItem(toolbar, SWT.PUSH); refreshItem.setImage(getImage("resources/refresh.png")); refreshItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { browser.refresh(); } }); final ToolItem stopItem = new ToolItem(toolbar, SWT.PUSH); stopItem.setImage(getImage("resources/stop.png")); stopItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { browser.stop(); } }); uriCombo = new Combo(toolbar, SWT.NONE); uriCombo.setItems(new String[] { "www.ladyr.com", "www.urjc.es", "www.mozilla.org" }); uriCombo.setText("http://www.google.es"); uriCombo.setBounds(0, 0, 3 * (WIDTH / 4), 0); uriCombo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { Combo c = (Combo) e.widget; browser.setUrl(c.getText()); System.out.println(c.getText()); } public void widgetDefaultSelected(SelectionEvent e) { Combo c = (Combo) e.widget; browser.setUrl(c.getText()); System.out.println(c.getText()); } }); final ToolItem uriComboItem = new ToolItem(toolbar, SWT.SEPARATOR); uriComboItem.setWidth(uriCombo.getSize().x); uriComboItem.setControl(uriCombo); final ToolItem goItem = new ToolItem(toolbar, SWT.PUSH); goItem.setImage(getImage("resources/go.png")); goItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { browser.setUrl(uriCombo.getText()); } }); GridData data = new GridData(); data.horizontalAlignment = SWT.FILL; toolbar.setLayoutData(data); toolbar.pack(); // Set the page visualization area Canvas canvas = new Canvas(shell, SWT.BORDER); data = new GridData(); // Set the same dimensions than shell, after we will call pack method // to fit the canvas size to the shell size. data.horizontalAlignment = SWT.FILL; data.verticalAlignment = SWT.FILL; data.widthHint = WIDTH; data.heightHint = HEIGHT; canvas.setLayoutData(data); shell.pack(); shell.open(); // Browser code initMozillaBrowser(uriCombo.getText(), canvas, xulrunnerPath); // End of browser code while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } /** * * @param uri * @param canvas * @param xulrunnerPath if you have a XULRunner valid version in your system, but not * installed, you can use that version to run the browser. This param must contain * its path, or null in other case. */ private void initMozillaBrowser(String uri, Canvas canvas, String xulrunnerPath) { browser = new Browser(canvas, SWT.MOZILLA); //nsIWebBrowser webBrowser = (nsIWebBrowser)browser.getWebBrowser(); browser.setBounds(canvas.getClientArea()); browser.setUrl(uri); browser.addProgressListener(new ProgressListener() { public void changed(ProgressEvent event) { uriCombo.setText(browser.getUrl()); updateToolItemsState(); } public void completed(ProgressEvent event) { updateToolItemsState(); } }); } private Image getImage(String path) { InputStream sourceStream = this.getClass().getResourceAsStream(path); ImageData source = new ImageData(sourceStream); Image image = new Image(null, source); try { sourceStream.close(); } catch (IOException e) { e.printStackTrace(); } return image; } private void updateToolItemsState() { if (!backItem.isEnabled() && browser.isBackEnabled()) { backItem.setEnabled(true); } else if (backItem.isEnabled() && !browser.isBackEnabled()) { backItem.setEnabled(false); } if (!forwardItem.isEnabled() && browser.isForwardEnabled()) { forwardItem.setEnabled(true); } else if (forwardItem.isEnabled() && !browser.isForwardEnabled()) { forwardItem.setEnabled(false); } } public static void main(String[] args) { if (args.length > 0) { new LadyrBrowser(args[0]); } else { new LadyrBrowser(null); } } }
5. 在浏览器里访问JavaXPCOM
这一节里我们将讨论一下通过WebBrowser访问的功能。比如,改变浏览器的属性或者观察浏览器请求与响应。
首先我们改变用户的preferences
注:我只列出增加的部分代码。
public class SimpleBrowserWithPrefs { // Obtain preferences service String contractID = "@mozilla.org/preferences-service;1"; nsIPrefService prefService = (nsIPrefService) serviceManager .getServiceByContractID(contractID, nsIPrefService.NS_IPREFSERVICE_IID); // Get a branch to access to the entire preference tree nsIPrefBranch branch = prefService.getBranch(""); // Set some preferences // Warn before submitting a form to an insecure area ? -> False branch.setBoolPref("security.warn_submit_insecure", 0); // Select direction of text: // 1 : Left-to-right // 2 : Right-to-left branch.setIntPref("bidi.direction", 2); // Allow current document to specify colors to use? // (If false, background images will also not be loaded) branch.setBoolPref("browser.display.use_document_colors", 0); }
另外一下Service也能被使用。我们已经可以改变Mozilla的属性来改变浏览器的行为,但是通过利用Service我们可以完成更有用的
任务。在下面的例子里我们将观察浏览器的请求和响应。在XPCOM里存在一个接口叫nsIObserver,它运行观察一个topic相关的event
,只要它被添加到observer Service里了。添加的方法是使用 void nsIObserverService.addObserver(nsIObserver anObserver,
String aTopic, boolean ownsWeak) 这个方法对一个特定的topic注册一个listener。anObserver是用来接受通知的一个接口,
aTopic是通知的topic,ownsWeak当nsIObserverService hold anObserver的一个strong的引用时设为false,否则设置为true。因此
,为了创建一个observer,我们必需实现nsIObserver接口,这个接口包含了一个方法 public void observe(nsISupports
aSubject, String aTopic, String aData)。
下面的例子的4个步骤:
1,获得Service Manager
2,获得Observer Service
3,创建一个简单的HTTP observer
4,把这个observer添加到监听请求和响应的Service里
package es.ladyr.javaxpcom.browser; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTError; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.browser.ProgressListener; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.mozilla.xpcom.Mozilla; import org.mozilla.interfaces.*; public class SimpleBrowserWithObserver { public SimpleBrowserWithObserver(String xulrunnerPath) { final Browser browser; Display display = new Display(); Shell shell = new Shell(display); shell.setSize(800, 600); shell.open(); // If you have XULRunner installed, you can call the constructor without // the last parameter: // // final MozillaBrowser browser = new MozillaBrowser(shell,SWT.BORDER); // // That last parameter is the path for XULRunner files // (where you have uncompressed downloaded XULRunner package). try { browser = new Browser(shell, SWT.MOZILLA); } catch (SWTError e) { System.out.println("Could not instantiate Browser: " + e.getMessage()); return; } // Get ServiceManager nsIServiceManager serviceManager = Mozilla.getInstance().getServiceManager(); // Get Observer Service nsIObserverService observerService = (nsIObserverService) serviceManager .getServiceByContractID("@mozilla.org/observer-service;1", nsIObserverService.NS_IOBSERVERSERVICE_IID); // Create a simple HTTP observer SimpleHTTPObserver httpObserver = new SimpleHTTPObserver(); // Add our observer to the service for listen to request and responses observerService.addObserver(httpObserver, "http-on-modify-request", false); observerService.addObserver(httpObserver, "http-on-examine-response", false); // Adapt browser size to shell size browser.setBounds(shell.getClientArea()); // Load an URL into the web browser browser.setUrl("http://www.google.com"); // Listens for page loading status. browser.addProgressListener(new ProgressListener() { public void changed(ProgressEvent event) { } public void completed(ProgressEvent event) { nsIWebBrowser webBrowser = (nsIWebBrowser)browser.getWebBrowser(); if (webBrowser == null) { System.out.println("Could not get the nsIWebBrowser from the Browser widget"); } nsIDOMWindow window = webBrowser.getContentDOMWindow(); nsIDOMDocument doc = window.getDocument(); System.out.println(doc); } }); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } observerService.removeObserver(httpObserver, "http-on-modify-request"); } public static void main(String args[]) { String xulrunnerPath = null; if ( args.length > 0 ) { xulrunnerPath = args[0]; } new SimpleBrowserWithObserver(xulrunnerPath); } /** * Simple HTTP observer listen to requests and responses. * * @author alpgarcia * */ class SimpleHTTPObserver implements nsIObserver { private int nRequests = 0; private int nResponses = 0; public void observe(nsISupports aSubject, String aTopic, String aData) { // You can read corresponding javadoc for this method, here we have pasted // some interesting lines from there: // // Observe will be called when there is a notification for the topic. // This assumes that the object implementing this interface has been registered // with an observer service such as the nsIObserverService. // If you expect multiple topics/subjects, the impl is responsible for filtering. // // You should not modify, add, remove, or enumerate notifications in the // implemention of observe. // Get the channel for listen to from notification specific interface pointer. nsIHttpChannel httpChannel = (nsIHttpChannel) aSubject.queryInterface(nsIHttpChannel.NS_IHTTPCHANNEL_IID); // Our observer can listen to request or responses, it depends on the // notification topic or subject. if (aTopic.equals("http-on-modify-request")) { nRequests++; System.out.println("/n---- BEGIN REQUEST NUMBER " + nRequests + " ----/n"); httpChannel.visitRequestHeaders(new nsIHttpHeaderVisitor() { public void visitHeader(String header, String value) { System.out.println("Header: " + header + " -- Value: " + value); } public nsISupports queryInterface(String arg0) { return null; } }); System.out.println(" Method: " + httpChannel.getRequestMethod()); System.out.println(" Name: " + httpChannel.getName()); System.out.println(" Host: " + getRequestHeader(httpChannel, "host")); System.out.println(" User Agent: " + getRequestHeader(httpChannel, "user-agent")); System.out.println(" Accept: " + httpChannel.getRequestHeader("accept")); System.out.println(" Accept Language: " + getRequestHeader(httpChannel, "accept- language")); System.out.println(" Accept Encoding: " + getRequestHeader(httpChannel, "accept- encoding")); System.out.println(" Accept Charset: " + getRequestHeader(httpChannel, "accept- charset")); System.out.println(" Keep Alive: " + getRequestHeader(httpChannel, "keep-alive")); System.out.println(" Connection: " + getRequestHeader(httpChannel, "connection")); System.out.println(" Cookie: " + getRequestHeader(httpChannel, "cookie")); System.out.println("/n---- END REQUEST NUMBER " + nRequests + " ----/n"); } else if (aTopic.equals("http-on-examine-response")) { nResponses++; System.out.println("/n---- BEGIN RESPONSE NUMBER " + nResponses + " ----/n"); httpChannel.visitResponseHeaders(new nsIHttpHeaderVisitor() { public void visitHeader(String header, String value) { System.out.println("Header: " + header + " -- Value: " + value); } public nsISupports queryInterface(String arg0) { return null; } }); System.out.println(" Status: " + httpChannel.getResponseStatus()); System.out.println(" Status Text: " + httpChannel.getResponseStatusText()); System.out.println(" Content Type: " + httpChannel.getContentType()); System.out.println(" Content Length: " + httpChannel.getContentLength()); System.out.println(" Content Encoding: " + getResponseHeader(httpChannel, "content -encoding")); System.out.println(" Server: " + getResponseHeader(httpChannel, "server")); System.out.println("/n---- END RESPONSE NUMBER " + nResponses + " ----/n"); } } public nsISupports queryInterface(String uuid) { return Mozilla.queryInterface(this, uuid); } private String getRequestHeader(nsIHttpChannel httpChannel, String header) { try { return httpChannel.getRequestHeader(header); } catch (Exception e) { return "Header Not Found"; } } private String getResponseHeader(nsIHttpChannel httpChannel, String header) { try { return httpChannel.getResponseHeader(header); } catch (Exception e) { return "Header Not Found"; } } }
发表评论
-
Java和C#运行命令行并获取返回值 运行bat文件
2015-08-04 10:45 1264Java运行命令行的例子 import java.io.B ... -
C#和java调用phantomjs采集ajax加载生成的网页
2015-08-04 09:58 4264日前有采集需求,当我把所有的对应页面的链接都拿到 ... -
数据结构之BloomFilter
2014-12-04 10:12 1654BloomFilter是什么? Bloo ... -
在XULRunner中获得Cookie
2012-04-20 11:22 1100最近在看browser嵌入,找到XULRunner,http: ... -
XULRunner with Java: JavaXPCOM Tutorial 5
2012-04-13 17:03 12127.3 点击Element和填写表单 我们可以安全的 ... -
XULRunner with Java: JavaXPCOM Tutorial 4
2012-04-13 17:04 13457. 用JavaXPCOM来自动浏览网页 在这一节里我 ... -
XULRunner with Java: JavaXPCOM Tutorial 3
2012-04-06 11:07 11696 加载页面的W3C DOM访问 6.1 mozdom4ja ... -
XULRunner with Java: JavaXPCOM Tutorial 1
2012-04-06 11:03 1721这篇教程更新于2008年夏 ... -
SWT可交互式Browser控件
2012-04-06 10:55 2879在许多平台中,Browser控件皆被作为一个必需的控件给出,并 ... -
java应用程序中嵌入浏览器总结
2012-04-06 10:53 1769java应用程序中嵌套浏 ...
相关推荐
该项目包含有助于破解脚本。 如何为Mer配置开发环境 用于嵌入式设备的Gecko引擎开发非常耗资源。 如果要尝试,最好有一台运行...# -*-mic2-options-*- --arch=armv7hl -*-mic2-options-*- lang en_US.UTF-8 keyboard u
org.eclipse.swt.SWTError: No more handles [MOZILLA_FIVE_HOME=''] (java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: no swt-mozilla-gtk-4335 in java.library.path no swt-mozilla-gtk ...
Java内嵌Mozilla浏览器内核必备 这里可以下载所有版本 http://download02.mozilla.org/pub/xulrunner/releases/
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
xulrunner-1.9.2.source.tar.bz2
xulrunner-1.8.0.4.en-US.linux-i686.tar
附件中包含 xulrunner-1.8.1.2pre.en-US.win32.zip xulrunner的安装和配置实例.docx(详细说明) tyapp.rar(实例的源码)
浏览器的内核下载,Firefox浏览器的内核xulrunner。xulrunner-41.0.2.en-US.win32
xulrunner-3.6.26.en-US.win32 xulrunner-3.6.26.en-US.win32
包含GeckoFx 33.09版本源码加对应版本XULrunner,提供完整的dll文件,直接可用
把 XULRunner 包解压到某一路径(例如, D:\XULRunner),注意: xulrunner路径中不能有中文 已为所有用户注册: xulrunner --register-global
XULRUNNER 例子 XULRunner is a Mozilla runtime package that can be used to bootstrap XUL+XPCOM applications that are as rich as Firefox and Thunderbird.
windows 32 jdk xulrunner10 DJNativeSwing
提示两个windows系统下的xulrunner,分别对应32位系统和64位系统。需要的朋友们请自行选择
xulrunner-41.0.2.en-US.win32.sdk 用于编译vlc 中的npapi
xulrunner-win64-1.9.2.25.jar一个java Swing视图化展示工具
下载了此xulrunner 后还要下载相应的geckofx,可以到我的资料里下载,因为放在一起太大,无法上传,所以放开放。
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
不容易啊,研究了近一年的成果。不过只要你能掌握firefox的核心xulrunner以及xpcom技术,客户端的开发将会不是任何问题,包括跨平台,比如: mac os x, Linux。你所要关注的将会集中在核心技术的实现上。
里面包含xulrunner java浏览器 swing浏览器 awt浏览器 所有工程源码 均包含在里面 jar一律齐全 不像其他分享源码的作者 不分享jar包出来 导致参考源码需要找很多jar 无疑给参考者浪费了很多宝贵时间,如果大 家觉得...