# Using `OBJECT`, `EMBED` and `APPLET` Tags in Java Plug-in

This chapter includes the following topics:

- Introduction
- JavaTM Plug-in in IE on Windows
- Java Plug-in in NavigatorTM on Windows or SolarisTM operating environments
- Java Plug-in in IE and Navigator
- Java Plug-in Anywhere
- Summary

## Introduction

This document explains the tagging structure, involving `OBJECT` and `EMBED` tags, required by Java Plug-in. It is intended for web authors who want to manually insert Java Plug-in tags in their HTML pages.

## Notes There is a Java Plug-in HTML Converter, available free-of-charge from Sun Microsystems, that can automatically generate the tagging structure. It is highly recommended that most web authors use it. This converter can convert pages into any of the formats described below. For a complete list of JRE releases that can be autodownloaded via `.cab` files, as mentioned below, see Autodownload Files (Windows Only).

Applets are normally specified in an HTML file as follows:

    <APPLET code="XYZApp.class" codebase="html/" align="baseline"
        width="200" height="200">
    <PARAM name="model" value="models/HyaluronicAcid.xyz">
        No Java 2 SDK, Standard Edition v 1.4.2 support for APPLET!!
    </APPLET>

And normally the `APPLET` tag specifies information about the applet, while the `<PARAM`> tags, located between the `<APPLET>` and `</APPLET>` tags, store per-instance applet information.

However, an `APPLET` is rendered by the browser and there is no easy way to interrupt the browser and force it to use Sun's Java Runtime Environment (JRE) to run the applet. To force the browser to do so, however, you may use a special Java Plug-in tagging structure—involving the `OBJECT` or `EMBED` tag or both, as described below—in place of the usual `APPLET` tag in an your HTML pages. This will cause the browser to launch Java Plug-in, which will then run the applet using Sun's JRE.

For various combinations of browsers and platforms, the following sections tell you exactly what you need to do

## Note on Version Numbers Product version numbers are of the form: `n1.n2.n3_n4n5` where `n1.n2` is the major version number, the `n3` is the minor version number (also referred to as the maintenance version number), and `n4n5` is the patch version number (also referred to as the update version number). The version numbers used in the examples below refer to the `1.4` major release with minor release number of `2` and, at times, hypothetical patch number of `mn`. Do not put hypothetical values into actual HTML for web pages.

## Java Plug-in in IE on Windows

To use Java Plug-in in IE on Windows, use the `OBJECT` tag. The following is an example of mapping an `APPLET` tag to a Java Plug-in tag:

### Original `APPLET` tag:

    <APPLET code="XYZApp.class" codebase="html/" align="baseline"
        width="200" height="200">
    <PARAM name="model" value="models/HyaluronicAcid.xyz">
        No Java 2 SDK, Standard Edition v 1.4.2 support for APPLET!!
    </APPLET>

### New `OBJECT` tag:

    <OBJECT classid="clsid:CAFEEFAC-0014-0002-0000-ABCDEFFEDCBA"
        width="200" height="200" align="baseline"
        codebase="http://java.sun.com/products/plugin/autodl/jinstall-1_4_2-windows-i586.cab#Version=1,4,2,0">
        <PARAM name="code" value="XYZApp.class">
        <PARAM name="codebase" value="html/">
        <PARAM name="type" value="application/x-java-applet;jpi-version=1.4.2">
        <PARAM name="model" value="models/HyaluronicAcid.xyz">
        <PARAM name="scriptable" value="true">
            No Java 2 SDK, Standard Edition v 1.4.2 support for APPLET!!
    </OBJECT>

## Note For static versioning, set `codebase` equal to: `http://java.sun.com/products/plugin/autodl/<.cab file for the version you want>` For example, for static versioning for the 1.4.2 release (which uses `classid` of `clsid:CAFEEFAC-0014-0002-0000-ABCDEFFEDCBA`), set `codebase` to: `http://java.sun.com/products/plugin/autodl/jinstall-1_4_2-win.cab` For a complete list of JRE releases that can be autodownloaded via `.cab` files, see Autodownload Files (Windows Only). For dynamic versioning (which uses `classid` of `clsid:8AD9C840-044E-11D1-B3E9-00805F499D93`), set codebase equal to: `http://java.sun.com/products/plugin/autodl/jinstall-<major version of family in underscore format>-windows-i586.cab#Version=<full version number for lowest version in family in comma-separated format>` If no version of Java is installed, or a version less than the major version of the family is installed, then this will cause automatic redirection to the latest `.cab` for the latest version in the family. For example, for the 1.4.2 release you would set `codebase` as follows: `http://java.sun.com/products/plugin/autodl/jinstall-1_4-windows-i586.cab#Version=1,4,0,0` If the user had version 1.3.1 installed, then the latest version in the 1.4 family would be downloaded and installed. But if any version in the 1.4 family were installed, then it would be used and no download would take place. Note that the autodownload `.cab` files can change as patch releases are released. See below for more about the interpretation of `codebase`.

Note that the `OBJECT` tag contains similar information to the `APPLET` tag. It is sufficient to launch Java Plug-in in IE. The `classid` in the `OBJECT` tag is the class identifier for Java Plug-in itself. When IE renders this class identifier in the `OBJECT` tag, it will try to load Java Plug-in into the browser. See classid attribute below for information about versioning.

There are several attributes in the `OBJECT` tag, such as `width`, `height` and `align`, that are mapped directly from the corresponding attributes in the `APPLET` tag. These contain formatting information that IE will use to position Java Plug-in. Since this information is mapped directly without changes, the position and appearance of the applets using Java Plug-in should be the same as those applets using the `APPLET` tag.

Not all attributes in the `APPLET` tag can be mapped to the `OBJECT` tag attributes. For example, the attributes `code` and `codebase` in the `APPLET` tag are not mapped into the `OBJECT` tag attribute. Instead, the attribute `code` is mapped into the `PARAM` `code` because, according to the w3c.org HTML specification, the attribute `code` does not exist in the `OBJECT` tag. There are other attributes that do not correspond in the `OBJECT` tag attributes. These attributes, with one exception, should be mapped to `PARAM` tags.

## Note Duplicate parameter names should never be used with the `OBJECT` tag in Java Plug-in.

The one exception is the `codebase` attribute. In the `APPLET` tag, the `codebase` attribute represents the location from which to download additional class and jar files. However, in the `OBJECT` tag, the `codebase` attribute represents the location from which to download Java Plug-in when it is not found on the local machine. Because the `codebase` attribute has two different meanings in the `APPLET` and `OBJECT` tags, the `codebase` attribute in the `APPLET` tag is mapped into a `PARAM` `codebase` in the `OBJECT` tag to resolve the conflict.

In the above example, the `code` and `codebase` attributes in the `APPLET` tag are mapped into the `OBJECT` tag parameters. The `PARAM` `code` identifies the applet, and its value should be the same as the `code` attribute in the `APPLET` tag. The `PARAM codebase` identifies the `codebase` of the applet. Java Plug-in knows where to download the applet or JavaBeans component because it can read this information from the parameters. The parameter `type` is not mapped from the `APPLET` tag, but it is required in the `OBJECT` tag. It identifies the type of the Java executable, such as an applet or a JavaBean, so that Java Plug-in knows how to initialize the Java executable. These three `PARAM` tags (`code`, `codebase`, and `type`) in the above example are specified for Java Plug-in. They do not exist in the `PARAM` of the original `APPLET` tag. Note that the `model` parameter within the `OBJECT` tag is identical to the `model` parameter inside the `APPLET` tag. Except for these first three parameters specified for Java Plug-in, the remainder of the parameters are the same as those inside the `APPLET` tag.

A new addition for Java Plug-in 1.3 (and valid in 1.4.x) was the `PARAM scriptable`. This was added to improve performance of applets that do not require the use of JavaScript or VBScript. The value should be `true` if the applet requires scripting support and `false` if it does not. The value is `false` by default.

Please note that `PARAM scriptable` is not the same as the `PARAM mayscript`. `mayscript` provides support for communication from Java applets to JavaScript only, while `scriptable` allows communication from JavaScript to Java applets in Internet Explorer only.

The text `"No Java 2 SDK, Standard Edition v 1.4.2 support for APPLET!!"` in the `APPLET` tag is mapped inside the `<OBJECT>` and `</OBJECT>` tags. Originally, this text is displayed only if the browser does not have Java support. By mapping it inside the `OBJECT` tag, this text will be displayed if the browser does not support the `OBJECT` tag.

The `APPLET`-to-`OBJECT` tag attributes mapping is as follows:

Attribute Name | `APPLET` Tag Support | `OBJECT` Tag Support | Attribute Mapping to `OBJECT` Tag
--- | --- | --- | ---
`align` | X | X | `OBJECT` attribute `align`
`alt` | X |  |
`archive` | X |  | `PARAM` element `archive`
`code` | X | X | `PARAM` element `code`
`codebase` | X | X | `PARAM` element `codebase`
`height` | X | X | `OBJECT` attribute `height`
`hspace` | X | X | `OBJECT` attribute `hspace`
`name` | X | X | `OBJECT` attribute `name`, `PARAM` element `name` This case is an exception. The `name` attribute in the orginal `APPLET` element must be mapped both to the `name` attribute in the `OBJECT` element and to a nested `PARAM`. If the original applet were as follows: `<APPLET name="clock" ...> </APPLET>` Then the mapping would be: `<OBJECT name="clock" ...> <PARAM name="name" value="clock"> </OBJECT>`
`object` | X |  | `PARAM` element `object`
`title` | X | X | `OBJECT` attribute `title`
`vspace` | X | X | `OBJECT` attribute `vspace`
`width` | X | X | `OBJECT` attribute `width`
`mayscript` | X |  | `PARAM` element `mayscript`

Some `OBJECT` attributes and nested `PARAM` elements are special to the `OBJECT` tag. They are the following:

Attribute/`PARAM` | Meaning in `OBJECT` tag
--- | ---
Attribute `classid` | It should always have the same value for dynamic version support, i.e. `clsid:8AD9C840-044E-11D1-B3E9-00805F499D93`. For static version support it will have a unique value for the version, e.g., `clsid:CAFEEFAC-0014-0002-0000-ABCDEFFEDCBA`. For more information about static vs. dynamic versioning, see Encountering OBJECT, EMBED, and APPLET Tags With Different Plug-in Versions and Browsers. Note: The example above uses static versioning.
Attribute `codebase` | It should be a full URL pointing to a `.cab` file somewhere on the network. It's purpose is to allow downloading and installation of Plug-in if either no version of Plug-in is installed on a user's computer or if no appropriate version of Plug-in is installed. The URL should, by default, point to a page on the Java Software website. Examples: In the above example, `codebase` is: `codebase="http://java.sun.com/products/plugin/autodl/jinstall-1_4_2-windows-i586.cab#Version=1,4,2,0"` Note that this was for static versioning and that the version number appended to the `.cab` file indicates that `1.4.2` version of Plug-in needs to be installed on the user's computer, otherwise an attempt will be made to download and install it. For dynamic versioning, `codebase` would be as follows: `codebase="http://java.sun.com/products/plugin/autodl/jinstall-1_4-windows-i586.cab#Version=1,4,0,0"` The appended version number indicates that if the user has version `1.4.0` or higher of the Plug-in installed on the computer, no download will occur. In other words, if the installed Plug-in is in the 1.4 family (major version `1.4`), then it will run. If the installed version is lower, however, then an attempt will be made to download and install a newer version via the `.cab` file.
`PARAM` element `type` | The `value` for parameter `type` should be as follows: `"application/x-java-<object_type>;<version_type>=<implementation_version>"` where `object_type` is `applet` or `bean`; `version_type` is `jpi-version` for static versioning or `version` for dynamic versioning; `implementation_version` is Implementation-Version as defined in Appendix 6: Sun-Supported `Specification-Version` and `Implemenation-Version` Formats. For more information about static vs. dynamic versioning, see Encountering OBJECT, EMBED, and APPLET Tags With Different Plug-in Versions and Browsers. Examples: For an applet deployed for static versioning with Plug-in version `1.4.1` patch release `02`, `value` for `type` would be as follows: `"application/x-java-applet;jpi-version=1.4.1_02"` For a bean deployed for dynamic versioning with Plug-in version `1.4.1` patch release `03`, `value` for `type` would be: `"application/x-java-bean;version=1.4"` This is because for dynamic versioning only the major version number is checked; i.e., if the installed Plug-in is in the major version family, no download is required.
`PARAM` element `codebase` | Specifies the base URL of the applet. The URL can be relative or absolute but it should be in the domain of the current document. This `PARAM` element is required only if the applet is not located in the same directory as the document.
`PARAM` element `code` | Specifies the name of the Java applet or JavaBeans component. It cannot be used with `PARAM` element `object` nested inside the same `OBJECT` tag.
`PARAM` element `scriptable` | Specifies whether the applet is scriptable from the HTML page using JavaScript or VBScript. The value can be either `true` or `false`. This attribute is new in Java Plug-in 1.4.
`PARAM` element `object` | Specifies the name of the serialized Java applet or JavaBeans component. It cannot be used with `PARAM` element `code` nested inside the same `OBJECT` tag. This attribute is optional.
`PARAM` element `archive` | Specifies the name of the Java archive. This attribute is optional.
`PARAM` element `mayscript` | Specifies whether the applet is allowed to access `netscape.javascript.JSObject`. The value can be either `true` or `false`. This attribute is optional.

If the original `APPLET` element uses attributes `type`, `codebase`, `code`, `object` or `archive`, and also has nested `PARAM` element attributes `type`, `codebase`, `code`, `object` or `archive`, there will be a problem with the direct mapping of the `APPELET` attributes to `PARAM` attributes , as there will then be `PARAM` elements with duplicate `name` attributes, e.g.,

If the orginal applet were as follows:

> `<APPLET codebase = "a/b/c ...>
> <PARAM name="codebase" value="my.jar">
> </APPLET>`

Then the direct mapping would be:

> `<OBJECT ...>
> <PARAM name="codebase" value="a/b/c">
> <PARAM name="codebase" value="my.jar">
> </OBJECT>`

To avoid this problem, any `APPLET` attribute that has a corresponding `PARAM` element in the orignal applet should be mapped as shown below.

Original attribute in the `APPLET` element | New `PARAM` attribute with `OBJECT` element
--- | ---
`code` | `java_code`
`codebase` | `java_codebase`
`archive` | `java_archive`
`object` | `java_object`
`type` | `java_type`

These new `PARAM` element attribute names should be used only when necessary. If both the new and original `PARAM` names exist in the same `OBJECT` tag, the values associated with the new `PARAM` element names are used by Java Plug-in to load the applet or JavaBean.

### Example

Suppose the orginal applet was as follows:

> `<APPLET codebase = "a/b/c ...>
> <PARAM name="codebase" value="my.jar">
> </APPLET>`

Then the mapping should be as shown below:

> `<OBJECT ...>
> <PARAM name="java_codebase" value="a/b/c">
> <PARAM name="codebase" value="my.jar">
> </OBJECT>`

## Java Plug-in in Netscape Navigator on Windows or SolarisTM operating environments

To use Java Plug-in with Netscape Navigator 4.x on Windows or Solaris operating environments, you must use the `EMBED` tag. The following example shows the mapping of a traditional `APPLET` tag to a Java Plug-in `EMBED` tag:

### Original `APPLET` tag:

    <APPLET code="XYZApp.class" codebase="html/" align="baseline"
        width="200" height="200">
    <PARAM name="model" value="models/HyaluronicAcid.xyz">
        No Java 2 SDK, Standard Edition v 1.4.1 support for APPLET!!
    </APPLET>

### New `EMBED` tag:

    <EMBED type="application/x-java-applet;jpi-version=1.4.1" width="200"
       height="200" align="baseline" code="XYZApp.class"
       codebase="html/" model="models/HyaluronicAcid.xyz"
       pluginspage="http://java.sun.com/j2se/1.4.1/download.html">
    <NOEMBED>
       No Java 2 SDK, Standard Edition v 1.4.1 support for APPLET!!
    </NOEMBED>
    </EMBED>

Note that the `EMBED` tag contains similar information to the `APPLET` tag.It is sufficient to launch Java Plug-in in Navigator. The attribute `type` in the `EMBED` tag is used to identify the type of the Java executable, such as an applet or a bean. When Navigator renders this attribute in the `EMBED` tag, it will try to load Java Plug-in into the browser. Note that a version number is also appended. It is used for comparing the version installed on a user's computer and deciding if another version needs to be installed. The second table below describes this in greater detail.

In the above example, several attributes in the `EMBED` tag, such as `width`, `height` and `align`, map directly from the corresponding attributes in the `APPLET` tag. These contain formatting information that Navigator uses to position Java Plug-in. Since this information is mapped directly without changes, the position and appearance of the applets using Java Plug-in should be the same as those applets using the `APPLET` tag.

Unlike the `OBJECT` tag, all information must be stored inside the `<EMBED>` tag. No `PARAM` elements are used with the `EMBED` tag. Therefore, all `APPLET` attributes and related `PARAM` elements must be mapped as attribute `name="value"` pairs inside the `EMBED` tag.

In the above example, the `code` and `codebase` attributes in the `APPLET` tag are mapped into the `EMBED` tag attributes. Attribute `code` identifies the applet. Its value should be the same as the `code` attribute in the `APPLET` tag. Attribute `codebase` identifies the codebase of the applet. Java Plug-in knows where to download the applet or JavaBeans component because it can read this information from the attributes. Also notice that the `model` attribute within the `EMBED` tag is mapped from the nested `PARAM` element `model` inside the `APPLET` tag.

Like the `codebase` attribute in the `OBJECT` tag, attribute `pluginspage` in the `EMBED` tag is used by Navigator if Java Plug-in is not installed on the user's computer, or if the wrong version of Java Plug-in is installed. It should point to the Java Plug-in Download Page on the Java Software website; or, for intranet deployment, to a page on the intranet from which Java Plug-in may be downloaded.

The text `"No Java 2 SDK, Standard Edition v 1.4.1 support for APPLET!!"` in the `APPLET` tag is mapped inside the `<NOEMBED>` and `</NOEMBED>` tags. With the traditional APPLET tag this text is displayed only if the browser does not have internal support for Java. By mapping it inside the `NOEMBED` tag, this text will be displayed if the browser does not support the `EMBED` tag, or if Navigator fails to start the Java Plug-in.

The `APPLET`-to-`EMBED` tag attributes mapping is as follows:

Attributes | `APPLET` tag support | `EMBED` tag support | Attribute map to `EMBED` tag
--- | --- | --- | ---
`align` | X | X | Attribute `align`
`alt` | X | X | Attribute `alt`
`archive` | X |  | Attribute `archive`
`code` | X |  | Attribute `code`
`codebase` | X |  | Attribute `codebase`
`height` | X | X | Attribute `height`
`hspace` | X | X | Attribute `hspace`
`name` | X | X | Attribute `name`
`object` | X |  | Attribute `object`
`title` | X | X | Attribute `title`
`vspace` | X | X | Attribute `vspace`
`width` | X | X | Attribute `width`
`mayscript` | X |  | Attribute `mayscript`

Some attributes are special to the `EMBED` tag. These attributes are:

Attribute | Meaning in `EMBED` tag
--- | ---
Attribute `type` | `type` should be as follows: `"application/x-java-<object_type>;<version_type>=<implementation_version>"` where `object_type` is `applet` or `bean`; `version_type` is `jpi-version` for static versioning or `version` for dynamic versioning; `implementation_version` is Implementation-Version as defined in Appendix 6: Sun-Supported `Specification-Version` and `Implemenation-Version` Formats. For more information about static vs. dynamic versioning, see Encountering OBJECT, EMBED, and APPLET Tags With Different Plug-in Versions and Browsers. Examples: For an applet deployed for static versioning with Plug-in version `1.4.1` patch release `02`, `type` would be as follows: `"application/x-java-applet;jpi-version=1.4.1_02"` For a bean deployed for dynamic versioning with Plug-in version `1.4.1` patch release `03`, `type` would be: `"application/x-java-bean;version=1.4"` This is because for dynamic versioning only the major version number is checked; i.e., if the installed Plug-in is in the major version family, no download is required).
Attribute `codebase` | Specifies the base URL of the applet or JavaBeans component. The URL can be relative or absolute but it should be in the domain of the current document. This attribute is required only if the applet is not located in the same directory as the document.
Attribute `code` | Specifies the name of the Java applet or JavaBeans component. It cannot be used with param `object` inside the same `EMBED` tag.
Attribute `object` | Specifies the name of the serialized Java applet or JavaBeans component. It cannot be used with the `code` attribute inside the same `EMBED` tag. This attribute is optional.
Attribute `archive` | Specifies the name of the Java archive. This attribute is optional.
Attribute `pluginspage` | It should be a full URL pointing to an HTML page from which Java Plug-in can be downloaded. If there is no Plug-in installed on a user's computer, or if the version of the Plug-in is not the one specified via the the `type` attribute, then this page will be presented to the user.
Attribute `mayscript` | Specifies whether the applet is allowed to access `netscape.javascript.JSObject`. The value can be either `true` or `false`. This attribute is optional.

Similar to the case of the `OBJECT` tag, if the original `APPLET` tag has `PARAM` element `type`, `codebase`, `code`, `object`, or `archive`, mapping it to the `EMBED` tag attribute will cause a problem. To avoid this, Java Plug-in also supports the same new set of attribute names for the `EMBED` tag, as specified below:

Similar to the case of the `OBJECT` element, if the original `APPLET` element uses attributes `type`, `codebase`, `code`, `object` or `archive`, and also has nested `PARAM` element attributes `type`, `codebase`, `code`, `object` or `archive`, there will be a problem with the direct mapping of the `APPELET` attributes to `EMBED` attributes. To avoid this problem, Java Plug-in also supports the same new set of attribute names for the `EMBED` tag, as specified below:

Original Attribute Names | New Attribute Names
--- | ---
`code` | `java_code`
`codebase` | `java_codebase`
`archive` | `java_archive`
`object` | `java_object`
`type` | `java_type`

These new attribute names should be used only when necessary. If both new and original attribute names exist in the same `EMBED` tag, the value associated with the new attribute name is used by Java Plug-in to load the applet or bean.

## Java Plug-in in IE and Navigator

The new `OBJECT` element scheme described above allows a web page with an applet to use Java Plug-in with Internet Explorer, and the new `EMBED` element scheme allows a web page with an applet to use Java Plug-in with Netscape. However, changes are a web page will be browsed by both browsers. Hence, there needs to be a way to use the `OBJECT` scheme when a page is browser by Internet Explorer, and the EMBED scheme when the page is browsed by Netscape. Such a scheme is described below.

### Original `APPLET` element:

    <APPLET code="XYZApp.class" codebase="html/" align="baseline"
        width="200" height="200">
    <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
        No Java 2 SDK, Standard Editoin v 1.4 support for APPLET!!
    </APPLET>

### New `OBJECT` element with nested `EMBED` element:

    <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
        width="200" height="200" align="baseline"
        codebase="http://java.sun.com/products/plugin/1.4/jinstall-14-win32.cab#Version=1,4,0,mn">
        <PARAM NAME="code" VALUE="XYZApp.class">
        <PARAM NAME="codebase" VALUE="html/">
        <PARAM NAME="type" VALUE="application/x-java-applet;jpi-version=1.4">
        <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
        <PARAM NAME="scriptable" VALUE="true">
        <COMMENT>
            <EMBED type="application/x-java-applet;jpi-version=1.4" width="200"
               height="200" align="baseline" code="XYZApp.class"
               codebase="html/" model="models/HyaluronicAcid.xyz"
               pluginspage="http://java.sun.com/products/plugin/1.4/plugin-install.html">
                <NOEMBED>
                    No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
                </NOEMBED>
            </EMBED>
        </COMMENT>
    </OBJECT>

Because IE understands the `<OBJECT>` tag, it will try to launch Java Plug-in. Notice that the `<COMMENT>` tag is a special HTML tag understood only by IE. IE ignores text between the `<COMMENT>` and `</COMMENT>` tags. In effect, the above tags actually become:

Note that the `<COMMENT>` element is unique to IE. IE ignores text between the `<COMMENT>` and `</COMMENT>` elements. For IE, then, the above structure of elements looks like this:

    <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
        width="200" height="200" align="baseline"
        codebase="http://java.sun.com/products/plugin/1.4/jinstall-14-win32.cab#Version=1,4,0,mn">
        <PARAM NAME="code" VALUE="XYZApp.class">
        <PARAM NAME="codebase" VALUE="html/">
        <PARAM NAME="type" VALUE="application/x-java-applet;jpi-version=1.4">
        <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
        <PARAM NAME="scriptable" VALUE="true">
    </OBJECT>

This is identical to the new `OBJECT` tag example described above.

Now because Navigator understands neither the `OBJECT` nor the `COMMENT` elements, Navigator 4 views the above structure as follows:

    <EMBED type="application/x-java-applet;jpi-version=1.4" width="200"
       height="200" align="baseline" code="XYZApp.class"
       codebase="html/" model="models/HyaluronicAcid.xyz"
       pluginspage="http://java.sun.com/products/plugin/1.4/plugin-install.html">
        <NOEMBED>
            No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
        </NOEMBED>
    </EMBED>

This is identical to the new `EMBED` element example described above.

Thus you can use the new element structure—`OBJECT` element with nested `EMBED` element—to invoke Java Plug-in when either IE or Netcape encounters a page with an applet. The is the recommeded format to use.

## Java Plug-in Anywhere

## Warning! The material in this section is out of date. It will be updated in the future. The description of the script below corresponds to the Extended option with the HtmlConverter. It is recommended that you do not use this option at this time. The Standard option is the recommended option.

In most environments, Internet or intranet, an HTML page is likely to be viewed on different browsers on different platforms. Ideally, then, you should activate Java Plug-in only on the right browser-platform combination. Otherwise, an applet should use the browser's default JVM. You can achieve this using the following Java Plug-in format:

### Original `APPLET` element:

    <APPLET code="XYZApp.class" codebase="html/" align="baseline"
        width="200" height="200">
    <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
        No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
    </APPLET>

### New-style format:

The following is an example of an equivalent Java Plug-in format. (The example includes comments.)

    <!-- The following code is specified at the beginning of the <BODY> tag. -->
    <SCRIPT LANGUAGE="JavaScript"><!--
        var _info = navigator.userAgent;
        var _ns = false;
        var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0
            && _info.indexOf("Windows 3.1") < 0);
    //--></SCRIPT>
    <COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
        var _ns = (navigator.appName.indexOf("Netscape") >= 0
            && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0
            && java.lang.System.getProperty("os.version").indexOf("3.5") < 0)
            || _info.indexOf("Sun") > 0));
    //--></SCRIPT></COMMENT>

    <!-- The following code is repeated for each APPLET tag -->
    <SCRIPT LANGUAGE="JavaScript"><!--
        if (_ie == true) document.writeln('
    <OBJECT
        classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
        width="200" height="200" align="baseline"
    codebase="http://java.sun.com/products/plugin/1.4/jinstall-14-win32.cab#Version=1,4,0,mn">
        <NOEMBED><XMP>');
        else if (_ns == true) document.writeln('
    <EMBED
        type="application/x-java-applet;jpi-version=1.4" width="200" height="200"
        align="baseline" code="XYZApp.class" codebase="html/"
        model="models/HyaluronicAcid.xyz"
        pluginspage="http://java.sun.com/products/plugin/1.4/plugin-install.html">
        <NOEMBED><XMP>');
    //--></SCRIPT>
       <APPLET code="XYZApp.class" codebase="html/" align="baseline"
            width="200" height="200">
    </XMP>
        <PARAM NAME="java_code" VALUE="XYZApp.class">
        <PARAM NAME="java_codebase" VALUE="html/">
        <PARAM NAME="java_type" VALUE="application/x-java-applet;jpi-version=1.4">
        <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
        <PARAM NAME="scriptable" VALUE="true">
        No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
    </APPLET></NOEMBED></EMBED>
    </OBJECT>

    <!--
        <APPLET code="XYZApp.class" codebase="html/" align="baseline"
            width="200" height="200">
        <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
        No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
        </APPLET>
    -->

Although this tag seems complicated compared to the old `APPLET` tag, it is not. Most of the Java Plug-in tag is the same regardless of the applet used. For the majority of cases, a webmaster can copy and paste the Java Plug-in tag.

The first block of the script extracts the browser and platform. You must determine the browser and platform on which the applet is running. You do this by using JavaScriptTM to extract first the browser name, then the platform. This is done once per HTML document.

The second block of the script replaces the `APPLET` tag. You must replace each `APPLET` tag with a similar block of code. The script replaces the `APPLET` tag with either an `EMBED` tag or `OBJECT` tag, depending on the browser. You use the `OBJECT` tag for IE and the `EMBED` tag for Netscape Navigator. Finally, the original `APPLET` tag is included as a comment at the end. It is always a good idea to keep the original `APPLET` tag in case you want to remove the Java Plug-in invocation.

The first JavaScript establishes the browser and the platform on which the browser is running. You must do this because, currently, Java Plug-in supports only Windows 95, Windows 98, Windows NT 4.0, and Solaris. Note that Windows NT 3.51 is the only Win32 platform that Java Plug-in does not support. Java Plug-in should be invoked only on the supported browser and platform. The script sets the variable `_ie` to true if the browser is Internet Explorer. It sets the variable `_ns` to true if the browser is Navigator. (Note that all variable names in the JavaScript start with "_". This is done to avoid conflicting with other JavaScript variables in the same page.)

To detect the right browser, the JavaScript evaluates three strings that are within the JavaScript's Navigator object: `userAgent`, `appVersion`, and `appName`. These strings contain information about the browser and the platform. By looking at some examples of the string `userAgent`, you can see how to evaluate `userAgent` and use it to determine the browser. The following are some examples of the `userAgent` string for different platforms as it appears in Internet Explorer.

Platform and Browser | JavaScript's `Navigator.userAgent` string
--- | ---
Windows 2000 w/IE 5.0 | "Mozilla/4.0 (compatible; MSIE 5.01; Window NT5.0)
Windows NT 4.0 w/IE 4.0 | "Mozilla/4.0 (compatible; MSIE 4.0; Windows NT)"
Windows NT 4.0 w/IE 3.02 | "Mozilla/2.0 (compatible; MSIE 3.02; Windows NT)"
Windows 95 w/IE 4.0 | "Mozilla/4.0 (compatible; MSIE 4.0; Windows 95)"
Windows 95 w/IE 3.02 | "Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)"
Windows NT 3.51 w/IE 4.0 | "Mozilla/4.0 (compatible; MSIE 4.0; Windows 3.1)"
Windows 3.1 w/IE 4.0 | "Mozilla/4.0 (compatible; MSIE 4.0; Windows 3.1)"
Windows NT 4.0 w/Navigator 4.04 | "Mozilla/4.04 [en] (WinNT; I)"
Windows NT 4.0 w/Navigator 3.04 | "Mozilla/3.04 (WinNT; I)"
Windows NT 3.51 w/Navigator 4.04 | "Mozilla/4.04 [en] (WinNT; I)"
Windows NT 3.51 w/Navigator 3.04 | "Mozilla/3.04 (WinNT; I)"
Windows 95 w/Navigator 4.03 | "Mozilla/4.03 [en] (Win95; I)"
Windows 95 w/Navigator 3.03 | "Mozilla/3.03 (Win95; I)"
Solaris 2.6 w/Navigator 4.02 | "Mozilla/4.02 [en] (X11; l; SunOS 5.6 sun4u)

Note that in each case the substring "MSIE" is always in the `userAgent` string in Internet Explorer. Also, the `userAgent` string in IE under Windows 3.1 and Windows 3.51 would contain the substring "Windows 3.1" because IE in these platforms is 16-bit. While IE 4 is also available on Solaris and Mac, in these versions the `userAgent` string does not contain the substring "Win". In addition, IE on Windows CE does not support JavaScript. This can be summarized as follows:

userAgent string / Browsers | Windows 3.1 w/ IE 3/4 | Windows NT 3.51 w/ IE 3/4 | Windows 95 w/ IE 3/4 | Windows NT 4.0 w/ IE 3/4 | Windows CE w/ IE | Mac w/ IE | UNIX w/ IE | Other browsers on any platform
--- | --- | --- | --- | --- | --- | --- | --- | ---
contains "MSIE" | X | X | X | X |  | X | X |
contains "Win" | X | X | X | X |  |  |  |
does not contain "Windows 3.1" |  |  | X | X |  | X | X | X

The above table shows that only Windows 95 and Windows NT 4.0 with IE can pass the Java Plug-in browser and platform requirements. However, this logic makes no assumptions about future releases of IE or future releases of Windows with IE. As long as the `userAgent` string contains "MSIE" and "Win", the above code should work in future releases of IE on Win32.

The above logic summarizes into the following:

    <SCRIPT LANGUAGE="JavaScript"><!--
        var _info = navigator.userAgent;
        var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0
                && _info.indexOf("Windows 3.1") < 0);
    //--></SCRIPT>

It is harder to detect Navigator on the right platform. Using just JavaScript, there is no way to determine if the browser is running on the Windows NT 3.51 or Windows NT 4.0 operating platform. (Refer to the above table and examine the `userAgent` string. Notice that the `userAgent` strings in Windows NT 3.51 and Windows NT 4.0 operating platforms are the same in Navigator.) It is important to make this distinction because Java Plug-in supports only the Windows NT 4.0 operating platform. To run Java Plug-in on the right platform, you must use LiveConnect in Navigator to determine the OS version number. This can be summarized as follows:

Testing logic / Browsers | Windows 3.1 w/ NS 3/4 | Windows NT 3.51 w/ NS 3/4 | Windows 95 w/ NS 3/4 | Windows NT 4.0 w/ NS 3/4 | NS on Solaris | IE on Solaris | NS on other platform | IE on other platform | Other browsers on any platform
--- | --- | --- | --- | --- | --- | --- | --- | --- | ---
appName contains "Netscape" | X | X | X | X | X |  | X |  |
userAgent contains "Win" | X | X | X | X |  |  |  | X |
userAgent does not contain "Win16" |  | X | X | X |  |  | X | X |
os.version does not contain 3.5 | X |  | X | X |  |  | Depends on OS |  |
userAgent contains "Sun" |  |  |  |  | X | X |  |  |

The above logic translates into the following code:

    <SCRIPT LANGUAGE="JavaScript"><!--
        var _info = navigator.userAgent; var _ns = false;
    //--></SCRIPT>
    <COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
         var _ns = (navigator.appName.indexOf("Netscape") >= 0
                && ((_info.indexOf("Win") > 0  && _info.indexOf("Win16") < 0
                && java.lang.System.getProperty("os.version").indexOf("3.5") < 0)
                || _info.indexOf("Sun") > 0));
    //--></SCRIPT></COMMENT>

Referring to the previous table, note that only Windows 95, Windows NT 4.0, and Solaris operating environments with Navigator pass all the tests. Because LiveConnect is used to get the OS version number and only Navigator supports LiveConnect, a JavaScript that accesses LiveConnect will not be understood by IE. To prevent this from causing a problem, you block out this piece of the script using the `COMMENT` tag since `COMMENT` is an IE-specific comment tag. The text between the `COMMENT` tag is ignored by IE but not by Navigator. In addition, you must specify the script language as JavaScript1.1 to block this out if the browser is Navigator 2.

At this point, the above logic for IE and Navigator summarizes to a script that should look as follows:

    <!-- The following code is specified at the beginning of the <BODY> tag. -->
    <SCRIPT LANGUAGE="JavaScript"><!--
        var _info = navigator.userAgent; var _ns = false;
        var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0
                && _info.indexOf("Windows 3.1") < 0);
    //--></SCRIPT>
    <COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
        var _ns = (navigator.appName.indexOf("Netscape") >= 0
               && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0
               && java.lang.System.getProperty("os.version").indexOf("3.5") < 0)
               || _info.indexOf("Sun") > 0));
    //--></SCRIPT></COMMENT>

Remember that this block of JavaScript should be put at the top of the `<BODY>` of the HTML file. It is put at the top so that other JavaScripts can reference the variables `_ie` and `_ns`. This JavaScript is the same in all HTML files, and it is only needed once for each HTML body.

The second block of HTML tags are actually the corresponding `OBJECT` and `EMBED` tags that are mapped from the data in the `APPLET` tag. Note that JavaScript outputs the `OBJECT` tag when the browser is IE running on the Windows 95, Windows 98 or Windows NT 4.0 operating environments. If the browser is Navigator 3/4 on Windows 95, Windows 98, Windows NT 4.0, or Solaris operating environments, then JavaScript also outputs the `EMBED` tag, though with a slightly different syntax. Recall that the mechanism for detecting the browser and the platform has been described in the above section. (Tags <!-- and --> are used for comments in HTML.)

### Original `APPLET` tag:

    <APPLET code="XYZApp.class" codebase="html/" align="baseline"
        width="200" height="200">
    <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
        No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
    </APPLET>

### New style tag:

    <SCRIPT LANGUAGE="JavaScript"><!--
        if (_ie == true) document.writeln('<OBJECT
        classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
        width="200" height="200" align="baseline"
    codebase="http://java.sun.com/products/plugin/1.4/jinstall-14-win32.cab#Version=1,4,0,mn">
        <NOEMBED><XMP>');
        else if (_ns == true) document.writeln('<EMBED
        type="application/x-java-applet;jpi-version=1.4" width="200" height="200"
        align="baseline" code="XYZApp.class" codebase="html/"
        model="models/HyaluronicAcid.xyz"
        pluginspage="http://java.sun.com/products/plugin/1.4/plugin-install.html">
        <NOEMBED><XMP>');
    //--></SCRIPT>
        <APPLET code="XYZApp.class" codebase="html/" align="baseline"
            width="200" height="200"></XMP>
        <PARAM NAME="java_code" VALUE="XYZApp.class">
        <PARAM NAME="java_codebase" VALUE="html/">
        <PARAM NAME="java_type" VALUE="application/x-java-applet;jpi-version=1.4">
        <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">LUE="models/HyaluronicAcid.xyz">
        <PARAM NAME="scriptable" VALUE="true">
            No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
        </APPLET></NOEMBED></EMBED></OBJECT>

Note that the original `APPLET` tag is also mapped in the new Java Plug-in tag. This is done because Java Plug-in is intended to be used only on supported platforms. Leaving the `APPLET` tag in the script ensures that browsers that do not support Java Plug-in, or browsers that do not support JavaScript can gracefully handle the applet using the default JVM. HotJava Browser, IE, and Navigator on non-Java Plug-in supported platforms, or browsers without JavaScript support, read the above tags as follows:

    <APPLET code="XYZApp.class" codebase="html/" align="baseline"
        width="200" height="200"></XMP>
    <PARAM NAME="java_code" VALUE="XYZApp.class">
    <PARAM NAME="java_codebase" VALUE="html/">
    <PARAM NAME="java_type" VALUE="application/x-java-applet;jpi-version=1.4">
    <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
    <PARAM NAME="scriptable" VALUE="true">
       No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
    </APPLET></NOEMBED></EMBED></OBJECT>

These browsers ignore the tags `</XMP>`, `</OBJECT>`, `</EMBED>`, and `</NOEMBED>` as well because there is no corresponding `<XMP>`, `<OBJECT>`, `<EMBED>`, and `<NOEMBED>` tags. Because Java Plug-in is targeted for features in the Java 2 SDK, Standard Edition v 1.4 or future releases, those browsers without full Java 2 SDK 1.4 support and who do not support Java Plug-in will display the message "No Java 2 SDK, Standard Edition v 1.4 support for APPLET".

Unlike the previous examples, the mapped `PARAM` names contain `java_code`, `java_codebase`, and `java_type` instead of `code`, `codebase`, and `type`. This is necessary because specifying `code` and `codebase` in the `<PARAM>` inside the `<APPLET>` and `</APPLET>` tag causes problems in some browsers.

IE on Windows reads the tags as follows:

    <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
        width="200" height="200" align="baseline"
    codebase="http://java.sun.com/products/plugin/1.4/jinstall-14-win32.cab#Version=1,4,0,mn">
        <NOEMBED><XMP>
        <APPLET code="XYZApp.class" codebase="html/" align="baseline"
            width="200" height="200"></XMP>
        <PARAM NAME="java_code" VALUE="XYZApp.class">
        <PARAM NAME="java_codebase" VALUE="html/">
        <PARAM NAME="java_type" VALUE="application/x-java-applet;jpi-version=1.4">
        <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
        <PARAM NAME="scriptable" VALUE="true">
            No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
        </APPLET></NOEMBED></EMBED>
    </OBJECT>

Be careful when you use the `<XMP>` tag. Because IE renders the `<OBJECT>` tag, you must disable the `<APPLET>` tag. If not disabled, two applets will simultaneously show up in the browser—one applet will be running in Microsoft's JVM, and the other will be running in Sun's JVM using Java Plug-in. The `<XMP>` tag provides a solution. The `<XMP>` and `</XMP>` tags basically transform any HTML tag that occurs between them into a stream of static text. In the above example, the `<XMP>` and `</XMP>` tags cause the browser to treat the `<APPLET>` tag as static text instead of an HTML tag. Because the browser ignores any static text between the `<OBJECT>` tag and the `<PARAM>` tag, the above tags actually become:

    <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
        width="200" height="200" align="baseline"
    codebase="http://java.sun.com/products/plugin/1.4/jinstall-14-win32.cab#Version=1,4,0,mn">
        <PARAM NAME="java_code" VALUE="XYZApp.class">
        <PARAM NAME="java_codebase" VALUE="html/">
        <PARAM NAME="java_type" VALUE="application/x-java-applet;jpi-version=1.4">
        <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
        <PARAM NAME="scriptable" VALUE="true">
            No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
    </OBJECT>

This is identical to the `OBJECT` tag example outlined above. Note that the `<OBJECT>` tag ignores the `<NOEMBED>`, `</NOEMBED>`, and `</EMBED>` tags.

Navigator on Windows operating environments reads tags as follows:

    <EMBED type="application/x-java-applet;jpi-version=1.4" width="200" height="200"
        align="baseline" code="XYZApp.class" codebase="html/"
        model="models/HyaluronicAcid.xyz"
        pluginspage="http://java.sun.com/products/plugin/1.4/plugin-install.html">
    <NOEMBED><XMP>
        <APPLET code="XYZApp.class" codebase="html/" align="baseline"
            width="200" height="200"></XMP>
        <PARAM NAME="java_code" VALUE="XYZApp.class">
        <PARAM NAME="java_codebase" VALUE="html/">
        <PARAM NAME="java_type" VALUE="application/x-java-applet;jpi-version=1.4">
        <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
        <PARAM NAME="scriptable" VALUE="true">
            No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
        </APPLET></NOEMBED></EMBED></OBJECT>

Note that the `<XMP>` tag is used again in the `<EMBED>` tag to also disable the `<APPLET>` tag. The `<EMBED>` tag ignores the `<PARAM>` and `</OBJECT>` tags as well. In effect, the above tags actually become:

    <EMBED type="application/x-java-applet;jpi-version=1.4" width="200" height="200"
        align="baseline" code="XYZApp.class" codebase="html/"
        model="models/HyaluronicAcid.xyz"
        pluginspage="http://java.sun.com/products/plugin/1.4/plugin-install.html">
    <NOEMBED>
            No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
    </NOEMBED>
    </EMBED>

This is identical to the `EMBED` tag example outlined above.

You can use the combined `OBJECT-EMBED-JavaScript` tag to activate Java Plug-in in the right browser on the right platform. This combined tag is complicated and it should be used only if your HTML page is browsed by users in a heterogenous environment.

## Summary

This document describes the `OBJECT` tag and `EMBED` tag styles used by Java Plug-in. It focuses on the conversion from an `APPLET` tag to the `OBJECT` and `EMBED` tags. Currently, HTML 4.0 suggests that the `OBJECT` tag is the best way to insert Java applets and JavaBeans components into a HTML page. This document will be updated in the near future should there be a need to convert the `OBJECT` tag to the Java Plug-in tag style. Information disclosed in this document is intended to assist ISVs for writing HTML migration tools and to assist webmasters with Java Plug-in migration. The tag style described in this document is subject to change in the future.

Note that the use of Java Plug-in is not limited to the tag styles described in this document. In fact, webmasters are encouraged to modify the tag style or mix the tag with JavaScript to fit their needs. As long as the described `OBJECT` tag is used in IE and `EMBED` tag is used in Navigator, there should be no problems running Java Plug-in. Currently, there are several conversion templates shipped with the Java Plug-in HTML converter. Webmasters may find one template better than others for their needs, and are encouraged to modify these templates themselves if necessary.