возможно ли создать java-апплет во время выполнения другого java-приложения

Я разрабатываю приложение Java, которое выполняет длинную серию запросов и вычислений и представляет свои результаты в виде серии HTML-страниц. Для визуализации графиков я некоторое время экспериментировал с библиотекой JUNG, и оказалось, что реальная сила библиотеки заключается в поддержке взаимодействия с пользователем, что, конечно же, недоступно, когда график сохраняется в виде статического изображения (PNG в моем случае). кейс).

Мне было интересно, будет ли это:

а) возможно

б) осуществимый

в) разумный

... для создания апплета во время выполнения основного приложения, которое затем можно вставить в HTML-отчеты и использовать в интерактивном режиме после завершения выполнения приложения и просмотра пользователем страниц отчета.

Если это невозможно по техническим причинам; есть ли у вас какие-либо альтернативные рекомендации/предложения относительно того, как я могу добиться чего-то подобного?

Спасибо,

РЕДАКТИРОВАТЬ: Просто чтобы прояснить концепцию, «основное» приложение является звеном в цепочке событий и, следовательно, имеет отдельный графический интерфейс. Идея апплета состоит НЕ в том, чтобы имитировать или переносить все содержимое основного приложения на HTML-страницу, а в том, чтобы сделать возможным использование интерактивных инструментов, поставляемых с библиотекой JUNG, когда пользователь просматривает графические результаты ПОСЛЕ выполнения основное программное обеспечение завершено.

Дайте мне знать, если концепция все еще неясна, и я предприму вторую попытку объяснить все более подробно.

ОБНОВЛЕНИЕ: Следуя полученным советам, спасибо @boffinBrain и @AndrewThompson, я написал свой апплет и поместил его в пакет в своем проекте вместе с другими классами, связанными с визуализацией. Иерархия выглядит следующим образом:

my.domain.project
my.domain.project.tests
my.domain.project.visualization

Теперь HTML-отчеты создаются в произвольном месте на локальном диске, это функция, поскольку пользователь указывает выходную папку перед запуском «основного» приложения. В моем классе ReportGenerator (который генерирует эти файлы HTML) у меня есть следующий фрагмент кода:

File bin = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toString());
String codebase = bin.getParent();
System.out.println(codebase);
String archive = "lib/collections-generic-4.01/collections-generic-4.01.jar";
String applet_name = "bin/my.domain.project.visualization.HierarchyGraphApplet.class";

codebase распечатка показывает: file:/home/username/workspace/project что соответствует моим ожиданиям. В папке проекта есть bin/ и lib/, а внутри bin есть правильная иерархия папок вплоть до моего класса апплета, который также существует.

Зачем же я все это записал; хорошо, потому что, когда я пытаюсь запустить свой апплет в отчетах, я получаю:

java.lang.NoClassDefFoundError: bin/my/domain/project/visualization/HierarchyGraphApplet (wrong name: my/domain/project/visualization/HierarchyGraphApplet)

Я читал похожие вопросы, такие как: это или это, но похоже, что проблема в другом. Я дважды проверил орфографию и т. д. Есть ли что-то простое, что я упустил, или есть более сложная проблема?


person posdef    schedule 18.04.2011    source источник
comment
Я вообще не вижу преимущества HTML. Почему бы не представить результаты в области основного графического интерфейса?   -  person Andrew Thompson    schedule 18.04.2011
comment
@Andrew Потому что тогда результаты может просматривать любой, без необходимости устанавливать приложение.   -  person Robin Green    schedule 18.04.2011
comment
Итак, «приложение Java» работает на стороне сервера? Обратите внимание, что если вы хотите воспроизвести «все поведение» приложения в апплете, конечный пользователь должен будет загрузить (и «установить», если апплеты кэшированы) апплет?   -  person Andrew Thompson    schedule 18.04.2011
comment
@Andrew: хорошо, потому что основное приложение не имеет графического интерфейса. Он разработан, чтобы быть частью/модулем в более крупном рабочем процессе. Я попытаюсь прояснить концепцию в тексте вопроса.   -  person posdef    schedule 18.04.2011
comment
@posdef Приношу свои извинения, я принял предположение Робина за ответ от вас.   -  person Andrew Thompson    schedule 18.04.2011
comment
@posdef: недостаточно информации для ответа на текущий вопрос. Мне понадобится структура каталогов/расположение HTML, апплетов Jars (и любых других свободных файлов классов) и содержимое файлов Jar, чтобы дать какой-либо уверенный ответ. Я предлагаю вам собрать эту информацию и создать новую тему.   -  person Andrew Thompson    schedule 21.04.2011


Ответы (2)


Возможно, этот пример натолкнет вас на некоторые идеи. Он создает файлы данных, используемые в качестве «отчетов» для использования апплетами.

Поскольку апплет получает данные через входной файл, заголовок которого указан в апплете param. Содержимое файла данных ограничено только требованиями отчета, вашими навыками его создания и анализа, ... и доступным местом на диске. ;)

Скомпилируйте и запустите main(String[]), чтобы (надеюсь) увидеть 2 веб-страницы, открытые во вкладках вашего браузера.

import java.awt.Desktop;
import javax.swing.*;
import java.net.*;
import java.io.*;

/** Simplistic example, not intended to show good I/O practices
or Exception handling for the sake of brevity. */
public class Reporter extends JApplet {

    public void init() {
        String input = getParameter("input");

        JEditorPane report = new JEditorPane();
        report.setText("Problem loading input file");
        add(report);

        URL url;
        try {
            url = new URL(getDocumentBase(), input);
            report.setPage(url);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    /** The main represents our report generator.  It is part
    of the applet class only in order to create an SSCCE. Good
    design would imply that it might be in a class ReportGenerator,
    while the applet is in class ReportViewer. */
    public static void main(String[] args) throws Exception {
        File f;
        String title = "1";
        String data = "apples";

        createInput(title, data);
        f = createHTML(title);
        Desktop.getDesktop().browse(f.toURI());

        title = "2";
        data = "oranges";

        createInput(title, data);
        f = createHTML(title);
        Desktop.getDesktop().browse(f.toURI());

        System.out.println( "End of report generation.." );
    }

    public static void createInput(String title, String data) throws Exception {
        File f = new File("data" + title + ".txt");
        PrintWriter pw = new PrintWriter(f);
        pw.println(data);

        pw.flush();
        pw.close();
    }

    public static File createHTML(String title) throws Exception {
        File f = new File("Data" + title + ".html");
        PrintWriter pw = new PrintWriter(f);

        pw.println("<html>");
        pw.println("<title>");
        pw.println("Data " + title);
        pw.println("<title>");
        pw.println("<body>");
        pw.println("<h1>");
        pw.println("Data " + title);
        pw.println("</h1>");
        pw.println("<applet ");
        pw.println("code='Reporter'");
        pw.println("width='400'");
        pw.println("height='400'");
        pw.println(">");
        pw.println("<param name='input' value='data" + title + ".txt'>");
        pw.println("</applet>");
        pw.println("</body>");
        pw.println("</html>");

        pw.flush();
        pw.close();

        return f;
    }
}

В отношении дальнейших вопросов:

..данный код предполагает, что html-отчеты и апплет находятся в одной папке?

Не обязательно. Параметр input может указывать ../other/data3.txt для каталога other того же уровня, что и каталог HTML, или /reports/data3.txt для каталога reports в корне сайта.

... Как вы также заметили, в реальном примере код апплета, скорее всего, будет в своем собственном классе, не вызовет ли это каких-либо сложностей в отношении того, как он будет включен в файлы html (которые генерируются в отдельный класс с именем ReportGenerator)?

Потребуются лишь небольшие изменения, чтобы указать на applet.jar, а не на application.jar. Используйте codebase, чтобы отделить HTML от каталога applet.jar (хотя к архивам также можно получить доступ через относительные или абсолютные URL-адреса).

person Andrew Thompson    schedule 18.04.2011
comment
Действительно хороший пример, спасибо! У меня есть пара вопросов по этому поводу; например, предполагает ли данный код, что html-отчеты и апплет находятся в одной папке? Как вы также отметили, в реальном примере код апплета, скорее всего, будет в своем собственном классе, не вызовет ли это каких-либо сложностей в отношении того, как он будет включен в файлы html (которые генерируются в отдельном классе). с именем ReportGenerator)? - person posdef; 20.04.2011
comment
Еще раз спасибо за дальнейшие инструкции, Андрей. Я играл с кодом, который у меня есть, и с примером, который вы предоставили, хотя на этот раз у меня возникли трудности с запуском апплета. Я не был уверен, следует ли это вводить в качестве дополнительных деталей в этот вопрос или в отдельный вопрос; но я обновлю вопрос соответствующей информацией, буду очень признателен, если вы обратите на это внимание. Ваше здоровье! - person posdef; 21.04.2011

Определенно возможно создать апплет для отображения данных, но вы не хотите каждый раз динамически генерировать новый. Вы хотите создать отдельный автономный апплет, который может генерировать ваши графики/отчеты из набора входных данных в текстовом формате, а затем, когда вы создаете HTML-страницу, предоставлять данные отчета с использованием параметра апплета (используя тег PARAM ).

person BoffinBrain    schedule 18.04.2011
comment
Хорошая идея, я тоже об этом думал, но разве это не оставит меня со следующими двумя новыми проблемами: 1) Попытайтесь объединить всю информацию, необходимую для создания графиков, в достаточно маленький параметр; и 2) наличие второго пакета кода для распространения. Идеальным сценарием было бы распространение основного приложения в виде JAR-файла, который затем позаботится обо всем остальном при запуске. До сих пор я построил все это так. Какие сложности возникают при динамическом создании апплета? - person posdef; 18.04.2011
comment
Идея динамического генерирования исходного кода апплета, его компиляции и создания из него jar-файла кажется гораздо более сложной, чем она должна быть. Упаковка всего вашего приложения также представляет собой угрозу безопасности, поскольку она предоставит клиентам код, который может быть реконструирован и может разрешить доступ к вашему серверу. Я определенно рекомендую написать легкий апплет, разработанный специально для просмотра ваших отчетов, и использовать стандартный формат данных, такой как CSV (нет необходимости смешивать данные вместе — вы можете использовать один тег PARAM для каждой таблицы). - person BoffinBrain; 18.04.2011
comment
Дело в том, что сервера нет. Страницы HTML создаются на локальном компьютере, на котором запущено приложение Java (также известное как основное). Но я думаю, что принцип остается в силе; Я мог бы попытаться написать апплет, упаковать его и сохранить в JAR основного приложения. Которые затем могут быть скопированы в папку отчетов основным приложением во время выполнения. Будет ли это иметь смысл? - person posdef; 18.04.2011
comment
Это имеет смысл, но вы, по сути, будете хранить данные отчета внутри банок, а не просто хранить данные. Это пустая трата места, а также означает, что вам придется использовать старые версии средства просмотра для просмотра старых отчетов, а не просто использовать последнюю версию средства просмотра для открытия старого файла данных (при условии, что формат остается согласованным). - person BoffinBrain; 18.04.2011