如果尚未安装JRE,如何提示用户安装JRE?

时间:2009-05-04 14:50:54

标签: java deployment applet

我正在编写一个Java applet,并希望了解将其包含在网页中的最佳方式。

我希望它提示用户安装JRE,如果她还没有。 此功能应该(理想情况下)在任何运行的OS Java上进行跨浏览。 另一个要求是applet不应该在页面加载时加载,但是在用户操作之后,不要在每个页面加载时加载JVM。 我猜this is the official SUN way,但它使用document.write(),因此在页面完成渲染后我无法使用它。

2 个答案:

答案 0 :(得分:4)

我建议只使用applet标签。正如Alex B评论的那样,如果用户没有JRE,大多数浏览器都会提示用户在那时进行安装。

除非您在Intranet上,否则Sun建议使用using the applet tag except on Intranets。我想这里的逻辑是你可以在内部服务器上托管JRE下载,并使用embed& amp;用于将下载指向该服务器的对象标记。

我曾经使用嵌入式和放大器对象标签,但由于版本号,最终会成为麻烦。可以说你需要Java 1.5。所以你在对象&中指定它嵌入标签以确保用户必须升级,如果他们没有1.5。但是,这不是你想要的,你希望它将它们升级到最新的JVM。无论如何,当我上次玩它时,它并不是最聪明的行为 - 现在它们可能已经改进了。

答案 1 :(得分:0)

我同意 jwls ,最好使用 applet 标记,因为使用embed和object非常难以获得正确的跨浏览器 - 到了自定义点每个浏览器的设置都是必要的。

但是,使用 applet 标记时,您需要注意Microsoft VM 1.1上的用户。当我在二月份测试时,他们仍然占5% of Java versions。如果这些用户访问需要更高版本的页面,他们将看到一个可怕的灰色区域。

解决方案(在讨论java.net之后)是使用一个小applet来检查Java版本,如果不满足目标版本,则重定向到失败页面。这是我的来源:

<强> JavaRedirectorApplet.java

import java.applet.Applet;
import java.net.URL;

/**
 * Applet built for bytecode 1.1
 * 
 * If applet is less than a set level redirects to a given page, else does nothing
 */
public class JavaRedirectorApplet extends Applet {

    /** The required java version */
    private final static String PARAM_REQUIRED_JAVA_VERSION = "REQUIRED_JAVA_VERSION";

    /** The failure page */
    private final static String PARAM_FAILURE_PAGE = "FAILURE_PAGE";

    /**
     * Initializes the applet
     */
    public void init() {

        // evaluate the required Java version
        double requiredJavaVersion = -1;
        String requiredJavaVersionString = getParameter(PARAM_REQUIRED_JAVA_VERSION);
        if (requiredJavaVersionString != null) {
            try {
                requiredJavaVersion = Double.valueOf(requiredJavaVersionString).doubleValue();
            } catch (Exception e) {
                // ignored, caught below
            }
        }

        if (requiredJavaVersion < 0) {
            System.err.println(PARAM_REQUIRED_JAVA_VERSION + " not set or set incorrectly (must be set to a number greater than 0)");
            return;
        }

        // get the failure page
        URL failurePageURL = null;
        String failurePageString = getParameter(PARAM_FAILURE_PAGE);
        if (failurePageString != null) {
            try {
                failurePageURL = new URL(getCodeBase().getProtocol(),
                                    getCodeBase().getHost(),
                                    getCodeBase().getPort(),
                                    failurePageString);
            } catch (Exception e) {
                // ignored, caught below
            }
        }

        if (failurePageURL == null) {
            System.err.println(PARAM_FAILURE_PAGE + " not set or set incorrectly (must be set to a valid path)");
            return;
        }

        // check to see whether valid
        if (!isValidVersion(requiredJavaVersion)) {

            // not valid redirect self
            getAppletContext().showDocument(failurePageURL, "_self");
        }

        // seems fine
    }

    /**
     * Check the Java version against a required version
     *
     * @param versionRequired
     * @return the verdict
     */
    public static boolean isValidVersion(double versionRequired) {
        try {
            double javaVersion = Double.valueOf(System.getProperty("java.version").substring(0, 3)).doubleValue();

            if (javaVersion < versionRequired) {
                return false;
            } else {
                return true;
            }
        } catch (NumberFormatException e) {
            return false;
        }
    }
}

示例HTML

<!-- place before the actual applet -->
<div style="display: none;">
    <applet code="JavaRedirectorApplet" width="0" height="0">
        <param name="REQUIRED_JAVA_VERSION" value="1.4"/>
        <param name="FAILURE_PAGE" value="/failurePage.html" />
    </applet>
</div>