在Web应用程序中运行小程序

7
我想在我的网页应用程序中使用html applet标签运行简单的小程序,但是它报错了:
java.lang.ClassNotFoundException: MyApplet
如果可能的话,请给我提供一个示例应用程序。

3
请展示您用来嵌入小程序的完整<applet>标签。 - Mudassir
<applet code="MyApplet" codebase="./WEB-INF/classes/" width="600" height="95"/> - chetan
这是我使用的苹果标签。 - chetan
问题出在代码库。确保它指向类文件。 - Mudassir
3个回答

10

问题在于小程序引擎无法在您定义的代码库中找到MyApplet类。

这可能是因为您的类位于/WEB-INF/classes目录下。该目录受Servlet引擎保护,以使其不被外部资源访问(例如JSP / HTML页面中的小程序标记)。

有几种方法可以解决此问题。最简单的方法是将MyApplet类打包成一个jar文件(称为myapplet.jar),并将其保存在可访问的目录中(例如Web应用程序的jsp文件夹)。作为示例,假设您对Web应用程序有以下文件夹:

/MyWebApp/jsp
/MyWebApp/applet
/MyWebApp/WEB-INF
客户端浏览器可以访问JSP和Applet文件夹中的内容。
然后,将您的myapplet.jar保存在applet文件夹中,并像这样设置applet标记配置(假设您的Web上下文是MyWebApp):
<applet codebase="/MyWebApp/applet" archive="myapplet.jar" 
        code="MyApplet.class" width="600" height="500">
</applet>

在这里,您可以找到有关applet标签的更多信息:http://docs.oracle.com/javase/tutorial/deployment/applet/index.html


1
请编辑您的答案,包括一个闭合的applet标签和宽度/高度属性。所显示的HTML无效,用无效的HTML这样好的答案就太可惜了。还要注意,自1.4.2以来,许多事情在applets(特别是applet部署)中已经发生了变化,因此如果可能的话,最好查找1.6的文档。为此,您可以扫描一些applet Wiki条目中提到的链接,这些链接在我的其他评论中提到。 - Andrew Thompson

1

虽然这是一个旧的帖子,但我想到了一个小技巧,可以让您提供位于WEB-INF/classes文件夹中的小程序,因此您不需要在项目中使用额外的jar文件(并且您可以更快地重新部署小程序)。缺点是您无法对小程序进行签名(因为它是.class而不是jar)。让我们来看看具体步骤...

首先,创建一个小servlet来提供小程序(它需要Javassist):

public class AppletServlet implements Servlet {
...
ClassPool pool = ClassPool.getDefault();

@Override
public void init(ServletConfig config) throws ServletException {
    pool.insertClassPath(new ClassClassPath(this.getClass()));
}

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    String className = ((HttpServletRequest) req).getPathInfo().substring(1);
    try {
        CtClass cc = pool.get(className.replace("/", ".").replace(".class", ""));
        res.setContentType("application/x-java-applet;version=1.5.0");
        res.setContentLength(cc.toBytecode().length);
        res.getOutputStream().write(cc.toBytecode());
        res.getOutputStream().close();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
...
}

现在在你的web.xml文件中将你的AppletServlet(我知道,这个名字很糟糕)声明为一个servlet:

<servlet>
    <servlet-name>Applet Servlet</servlet-name>
    <servlet-class>com.example.AppletServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Applet Servlet</servlet-name>
    <url-pattern>/applet/*</url-pattern>
</servlet-mapping>

最后,在您的页面中调用您的小程序:

<object type="application/x-java-applet" height="300" width="550">
    <param name="codebase" value="applet/" />
    <param name="code" value="com.example.MyApplet" />
    <param name="teste" value="teste"></param>
    Applet failed to run. No Java plug-in was found.
</object>

就是这样。Servlet将使用Javassist获取您的类的字节码并将其提供给请求。

免责声明 如果有人知道您的包结构,他们可以下载所有类并从那里进行恶意操作。因此,请确保只允许Servlet提供实际上是应用程序窗体的类。


好主意,但它无法编译 - “pool” 从哪里来? - Oversteer
我的错。典型的复制粘贴错误;)现在应该可以运行了。 - Andre

0

检查两件事情。 1. 代码库是否正确。 要检查它是否正确编写,请组合完整的URL(您页面的URL + 代码库),并直接在浏览器中尝试。确保它是正确的。

  1. 类名是否正确书写。它必须是完全限定的类名(包括包名)

如果不起作用,请在此处发布您的标记


1
顺便提一下,HTML 5中的applet标签已经被弃用,并且在Chrome中完全不受支持。因此,我建议您改用<object>标签。 - AlexR
  1. applet元素在HTML 4.01中已被弃用,而不是在5中。2) 刚刚下载了Chrome 9.0.597.98,并将其指向我的网站上使用applet元素的一对小型沙盒applets(http://pscode.org/test/appletresource/applet.html)。尽管页面未声明任何HTML版本(我很淘气),但它仍然可以正常工作。所以Chrome确实识别applet元素(a)。3) 使用object元素会立即失去基于Mozilla的浏览器。遗憾的是,他们还没有放弃愚蠢的embed元素并承认接受的标准,但事实就是这样。...
- Andrew Thompson
1
由于对象/嵌入式问题,我建议使用“deployJava.js”(从http://stackoverflow.com/tags/applet/info跟踪链接)脚本来部署小程序。虽然不是完美的解决方案,但由于Oracle鼓励开发人员进行热链接并支持它,因此它是小程序的最佳部署选项之一。(a)事实上,Java已经安装好了,我想Chrome足够聪明,可以检测到当前的安装并使用它。但这不是重点。当Java被安装时,Chrome确实会识别小程序元素。 - Andrew Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接