当前位置: 代码迷 >> Web前端 >> XULRunner with Java: JavaXPCOM Tutorial 二
  详细解决方案

XULRunner with Java: JavaXPCOM Tutorial 二

热度:697   发布时间:2012-06-27 14:20:08.0
XULRunner with Java: JavaXPCOM Tutorial 2
    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";  
                            }  
                    }  
                     
            }  
?
  相关解决方案