java.lang.ClassNotFoundException: MyApplet
如果可能的话,请给我提供一个示例应用程序。
问题在于小程序引擎无法在您定义的代码库中找到MyApplet类。
这可能是因为您的类位于/WEB-INF/classes目录下。该目录受Servlet引擎保护,以使其不被外部资源访问(例如JSP / HTML页面中的小程序标记)。
有几种方法可以解决此问题。最简单的方法是将MyApplet类打包成一个jar文件(称为myapplet.jar
),并将其保存在可访问的目录中(例如Web应用程序的jsp文件夹)。作为示例,假设您对Web应用程序有以下文件夹:
/MyWebApp/jsp
/MyWebApp/applet
/MyWebApp/WEB-INF
客户端浏览器可以访问JSP和Applet文件夹中的内容。<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
虽然这是一个旧的帖子,但我想到了一个小技巧,可以让您提供位于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提供实际上是应用程序窗体的类。
检查两件事情。 1. 代码库是否正确。 要检查它是否正确编写,请组合完整的URL(您页面的URL + 代码库),并直接在浏览器中尝试。确保它是正确的。
如果不起作用,请在此处发布您的标记