JExplorer Programmer’s Guide
Version: 3.5
- Introduction
- 1.1 About This Document
- 1.2 About JExplorer
- 1.3 Examples and Demo
- 1.4 Package
- 1.5 Installation
- 1.6 Licensing
- Requirements
- Architecture
- Browser Mode
- Hello World
- Loading URL
- Loading HTML
- Pop-ups
- JavaScript
- JavaScript Dialogs
- User-Agent
- DOM API
- Logging
1. Introduction
1.1. About This Document
This document represents a developer's guide to JExplorer library. Here you can find all required information regarding the use of JExplorer library in your Java application.
1.2. About JExplorer
JExplorer is a Java library that allows integrating with installed in operating system MS Internet Explorer web browser control into Java application. Integration with MS Internet Explorer is implemented via system native MSHTML library. With JExplorer you can embed MS IE web browser control to display modern web pages.
1.3. Examples and Demo
Almost all the examples in this guide can be found in the samples directory of JExplorer Distribution Package. The samples you can also find online.
JExplorer Web Start Online Demo you can find at http://www.teamdev.com/jexplorer#onlinedemo
1.4. Package
The structure of JExplorer Distribution Package (jexplorer-3.5.zip
) is the following:
lib/ jexplorer-3.5.jar // JExplorer library samples/ // API samples doc/javadoc/ // Public API JavaDocs doc/guide/ // Programmer's Guide demo/ jexplorerdemo.jar // Demo application library jexplorerdemo.bat // Executable *.bat to run Demo application on Windows Readme.txt // Readme file License agreement.txt // License agreement
1.5. Installation
To use JExplorer library in your Java application you need to include all the JAR files from the lib directory of JExplorer Distribution Package. Your application class path should look like:
java -classpath jexplorer-3.5.jar <your-application-class>
The jexplorer-3.5.jar
library contains native binaries. At the first run JExplorer extracts the binaries from the
JAR file into user's temp folder. So, Java application must have rights to write to user's temp directory.
1.6. Licensing
JExplorer will be supported until June 30, 2019. Commercial licenses are currently not available for purchase, so this section is intended for the users who have acquired licenses prior to June 30, 2018.
If you have any licensing questions, please contact sales@teamdev.com.
JExplorer library requires a valid license (teamdev.licenses
) file for operations.
Commercial License
License comes in two JARs: development.jar
and runtime.jar
.
You need to include one of these JARs into your application class path to enable the license. The difference
between Development and Runtime license is the following:
– you need to use the Development license (development.jar
) for development
purposes only. The number of licenses should be equal to the number of developers who use JExplorer in
development. For example, if you have 10 developers involved into your project and only 4 of them work with
JExplorer, you should purchase 4 licenses only.
– the Runtime license (runtime.jar
) should be used when you distribute your software with
JExplorer enclosed. For example, you can include the runtime.jar file into class path of your application
production version. You can deploy the Runtime license with your application to unlimited number of end users.
License Information
In order to get information about the license, use the "teamdev.license.info
" system
property. The following code demonstrates how to enable license info printing in your application.
System.setProperty("teamdev.license.info", "true"); Browser browser = new Browser();
2. Requirements
JExplorer integrates with installed in operating system MS Internet Explorer.
- Microsoft Windows XP (SP2), 7, 8, 8.1, 10, Server 2003/2008/2012, 32-bit and 64-bit.
- MS Internet Explorer 6, 7, 8, 9, 10, 11. Both 32-bit and 64-bit.
- Oracle JDK/JRE 1.7.x and higher, 32-bit and 64-bit.
3. Architecture
JExplorer supports multi-process architecture and runs native code in separate JExplorer32.exe
or JExplorer64.exe
processes depending on JVM architecture.
By default each Browser
instance is initialized with a new BrowserContext
. For example:
Browser browser = new Browser();
BrowserContext
is responsible for communication between Browser
instance and its
corresponding JExplorer.exe
native process. Two Browser
instances with different context,
will use two different JExplorer.exe
processes. For example:
Browser browserOne = new Browser(new BrowserContext()); // Starts JExplorer32.exe Browser browserTwo = new Browser(new BrowserContext()); // Starts JExplorer32.exe
When you need to run two Browser
instances in same native process (e.g. to share session cookies), you
can use the following approach:
BrowserContext context = new BrowserContext(); Browser browserOne = new Browser(context); // Starts JExplorer32.exe Browser browserTwo = new Browser(context); // Use already started JExplorer32.exe
JExplorer32.exe
process is terminated automatically once you dispose the latest
Browser
instance that belongs to the process.
By default parent and child Browser
instances are running in same JExplorer.exe
process.
4. Browser Mode
MS Internet Explorer can display web pages using different versions of Internet Explorer via Browser Mode feature. In JExplorer by default web engine is configured to display web pages in MS IE 7 Browser Mode.
In case when MS Internet Explorer 11 is installed in your environment, you might want to enable MS IE 11 Browser Mode in JExplorer. To configure
Browser Mode use the BrowserFeatures.enableBrowserMode(BrowserMode mode)
method. For example:
// Enable MS IE 11 Browser Mode BrowserFeatures.enableBrowserMode(BrowserMode.IE11); Browser browser = new Browser();
Browser Mode is a global setting that is stored in Windows Registry. Once you set Browser Mode, all Browser
instances will use it.
To remove this setting and enabled default behavior (MS IE7 Browser Mode) use the BrowserFeatures.disableBrowserMode()
method.
Browser Mode must be configure before you create any Browser
instance.
5. Hello World
Once you configure Java project, include all JExplorer and license JAR files into your application class path, you should be able to run your first program with JExplorer:
import com.teamdev.jexplorer.Browser; import javax.swing.*; import java.awt.*; public class HelloWorldSample { public static void main(String[] args) { Browser browser = new Browser(); JFrame frame = new JFrame("JExplorer: Hello World"); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.add(browser, BorderLayout.CENTER); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setVisible(true); browser.setContent("<html><body><h1>Hello world!</h1></body></html>"); } }
This simple example above shows how to create a Browser
component, embed it into Swing container,
display it and load the "<html><body><h1>Hello
world!</h1></body></html>
" HTML string directly into the Browser
.
When you run this sample you should see the following output:
6. Loading URL
To load web page by its URL use the following method:
browser.navigate("http://www.google.com");
This method doesn't wait until web page is loaded completely. To find out when web page is loaded completely use
the NavigationListener.mainDocumentCompleted(Browser browser, String url)
event. For example:
browser.addNavigationListener(new NavigationAdapter() { @Override public void mainDocumentCompleted(Browser browser, String url) { // Web page is loaded completely } }); browser.navigate("http://www.google.com");
To block current thread execution and wait until web page is loaded completely within a specified timeout, use the following approach:
try { Browser.invokeAndWaitLoadMainFrame(browser, new Callback<Browser>() { @Override public void call(Browser browser) { browser.navigate("http://www.google.com"); } }); } catch (TimeoutException e) { // Web page wasn't loaded completely within a timeout } // Web page is loaded completely
By default timeout is set to 15 seconds. You can change default value via jexplorer.ipc.timeout.seconds
system property or
com.teamdev.jexplorer.internal.ipc.LatchUtil.WAIT_SECONDS
.
7. Loading HTML
To load HTML content from string use the following method:
browser.setContent("<html><body><h1>Hello world!</h1></body></html>");
This method doesn't wait until HTML content is loaded and displayed completely. To find out when it's loaded see Loading URL.
8. Pop-ups
By default JExplorer supports and displays popup windows. To change default behavior you can register your own PopupHandler
implementation.
For example:
browser.setPopupHandler(new PopupHandler() { @Override public PopupContainer handlePopup() { return new PopupContainer() { @Override public void insertBrowser(final Browser browser) { final JFrame frame = new JFrame(); frame.getContentPane().add(browser, BorderLayout.CENTER); frame.setSize(800, 600); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(WindowEvent e) { browser.dispose(); } }); browser.addDisposeListener(new DisposeListener() { @Override public void onDispose(Browser browser) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { frame.setVisible(false); frame.dispose(); } }); } }); } }; } });
9. JavaScript
You can execute any JavaScript code on the loaded web page and get result of JavaScript code execution. The following code demonstrates how to execute JavaScript code and get return value:
JSValue returnValue = browser.executeScript("document.title"); if (returnValue.isString()) { System.out.println("Title = " + returnValue.getString()); }
The result of JavaScript execution is represented as JSValue
. Using JSValue.isXXX()
methods you can determine what value type it contains (e.g. String, Boolean, Number, Null). To extract value
from JSValue
use corresponding JSValue.getXXX()
method.
Don't call browser.executeScript()
in Java UI/EDT thread. JavaScript code you are trying to
execute may cause Alert or other JavaScript UI dialog to be shown. In this case you might receive a deadlock.
10. JavaScript Dialogs
JExplorer supports and displays JavaScript dialogs such as Alert or Confirmation by default. Using
DialogHandler
you can handle JavaScript dialogs in your application. The following code
demonstrates how to suppress all JavaScript dialogs:
browser.setDialogHandler(new DialogHandler() { @Override public int showDialog(String title, String text, int type) { // Suppress dialog and close it right away without displaying UI return DialogHandler.IDOK; } });
In your DialogHandler
implementation you can display your own customized dialogs.
11. User-Agent
JExplorer API allows modifying user-agent string sent to a web server when you load web page. The following code demonstrates how to do this:
Browser browser = new Browser(); browser.setUserAgent("MyUserAgent"); browser.navigate("http://whatsmyuseragent.com/");
To get default MS IE user-agent string use the Browser.getDefaultUserAgent()
method.
12. DOM API
JExplorer provides DOM API that allows working with DOM of the loaded web page. You can access document, go through DOM structure, read HTML elements and their attributes, modify DOM structure, etc.
The following sample demonstrates how to access document of the loaded web page, find all A
elements on the web page and print their text content:
import com.teamdev.jexplorer.Browser; import com.teamdev.jexplorer.dom.DOMDocument; import com.teamdev.jexplorer.dom.DOMNodeList; import com.teamdev.jexplorer.event.NavigationAdapter; import javax.swing.*; import java.awt.*; public class DOMGetElementsSample { public static void main(String[] args) { Browser browser = new Browser(); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.add(browser, BorderLayout.CENTER); frame.setSize(800, 600); frame.setLocationRelativeTo(null); frame.setVisible(true); browser.addNavigationListener(new NavigationAdapter() { @Override public void mainDocumentCompleted(Browser browser, String url) { DOMDocument document = browser.getDocument(); DOMNodeList elements = document.getElementsByTagName("a"); int length = elements.getLength(); for (int i = 0; i < length; i++) { System.out.println("Text Content: " + elements.item(i).getTextContent()); } } }); browser.navigate("http://www.google.com"); } }
13. Logging
JExplorer logging system is based on Java Logging, so you can configure JExplorer logging using standard Java Logging API. For example, in order to access different JExplorer Loggers and specify the SEVERE log level you can use the following code:
import com.teamdev.jexplorer.LoggerProvider; import java.util.logging.*; ... LoggerProvider.getBrowserLogger().setLevel(Level.SEVERE); LoggerProvider.getIPCLogger().setLevel(Level.SEVERE); LoggerProvider.getProcessLogger().setLevel(Level.SEVERE);
The BrowserLogger
is used to log browser messages.
The IPCLogger
is used to log IPC (Inter-Process Communication) messages.
The ProcessLogger
is used to log messages that are come from JExplorer.exe process.
By default the log level for all JExplorer loggers is set to Level.ALL
.
Redirect logging to a file
To redirect all log messages of BrowserLogger
to the "D:/jexplorer.log" file, you can use the
following way:
Logger logger = LoggerProvider.getBrowserLogger(); FileHandler fileHandler = new FileHandler("D:/jexplorer.log"); logger.addHandler(fileHandler); fileHandler.setFormatter(new SimpleFormatter());
You can redirect log messages of any JExplorer logger: BrowserLogger
, IPCLogger
or
ProcessLogger
.