запустить апплет в веб-приложении - PullRequest
6 голосов
/ 23 ноября 2010

Я хочу запустить простой апплет в своем веб-приложении, используя тег html applet, но он выдает ошибку типа

java.lang.ClassNotFoundException: MyApplet

Пожалуйста, дайте мне пример приложения, если это возможно .....

Ответы [ 3 ]

9 голосов
/ 23 ноября 2010

проблема в том, что движок апплета не может найти ваш класс MyApplet в кодовой базе, которую вы определили.

Это может быть вызвано тем, что у вас есть класс в каталоге / WEB-INF / classes.Этот каталог защищен механизмом сервлетов, чтобы его нельзя было получить от внешних ресурсов (как может быть тег апплета на странице JSP / HTML.

Есть несколько способов решить эту проблему. Самый простой из нихсостоит в том, чтобы упаковать ваш класс MyApplet в jar-файл (назовем его myapplet.jar) и сохранить его в доступном каталоге (то есть в папке jsp вашего веб-приложения). Например, предположим, что у вас есть следующие папки для Интернетаapplication:

/MyWebApp/jsp
/MyWebApp/applet
/MyWebApp/WEB-INF

Браузеры клиента могут получить доступ к содержимому папок jsp и applet.

Затем сохраните myapplet.jar в папке апплета и настройте конфигурацию тега апплета следующим образом(Предполагается, что вашим веб-контекстом является MyWebApp):

<applet codebase="/MyWebApp/applet" archive="myapplet.jar" 
        code="MyApplet.class" width="600" height="500">
</applet>

Здесь вы можете найти дополнительную информацию о теге апплета: http://docs.oracle.com/javase/tutorial/deployment/applet/index.html

1 голос
/ 21 июля 2012

Старый поток, я знаю ... но я придумал небольшой хак, который позволяет вам обслуживать апплеты, которые находятся в вашей папке WEB-INF / classes, так что вам не нужен дополнительный jar в вашем проекте (и вы можете переустановить свой апплет немного быстрее). Недостатком этого является то, что вы не можете подписать свой апплет (потому что это .class, а не jar). Давайте перейдем к погоне здесь ...

Сначала создайте небольшой сервлет, который обслуживает апплеты (для этого требуется 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();
    }

}
...
}

Теперь объявите ваш AppletServlet (я знаю, ужасное имя) как сервлет в вашем web.xml:

<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>

И это все. Сервлет будет использовать Javassist, чтобы получить байт-код для вашего класса и передать его по запросу.

Отказ от ответственности Если кто-то знает структуру вашего пакета, он может загрузить все классы и делать оттуда злые дела. Поэтому убедитесь, что вы разрешаете сервлету обслуживать только классы, которые на самом деле являются апплетами.

0 голосов
/ 23 ноября 2010

Проверьте 2 вещи. 1. кодовая база верна. Чтобы убедиться, что он написан правильно, составьте полный URL (URL вашей страницы + кодовая база) и попробуйте прямо в браузере. Будьте уверены, что это правильно.

  1. Имя класса написано правильно. Это должно быть полное имя класса (включая имя пакета)

Если это не работает, оставьте свой тег здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...