Wicket: сделать сгенерированный CSV доступным для JavaScript - PullRequest
0 голосов
/ 05 апреля 2011


Я пытаюсь выяснить, как сделать динамически сгенерированный CSV-файл доступным для JavaScript-графиков.

Я использую поведение калитки, чтобы добавить dygraph (график JavaScript) к моей разметке, как показано в приведенном ниже примере кода. Прямо сейчас я жестко запрограммировал его для использования файла CSV с именем "dygraph.csv". Я хочу изменить это, и вместо этого заставить dygraph использовать значения из String CSV, как мне этого добиться?

Любая помощь приветствуется.

public class DygraphBehavior extends AbstractBehavior {
    private static final long serialVersionUID = -516501274090062937L;
    private static final CompressedResourceReference DYGRAPH_JS = new CompressedResourceReference(DygraphBehavior.class, "dygraph-combined.js");

    @Override
    public void renderHead(IHeaderResponse response) {
        response.renderJavascriptReference(DYGRAPH_JS);
    }
    @Override
    public void onRendered(Component component) {
        final String id = component.getId();
        Response response = component.getResponse();

        response.write(JavascriptUtils.SCRIPT_OPEN_TAG);
        response.write("new Dygraph(document.getElementById(\""+id+"\"), \"dygraph.csv\", {rollPeriod: 7, showRoller: true, errorBars: true});");
        response.write(JavascriptUtils.SCRIPT_CLOSE_TAG);
    }
}

public class Dygraph extends WebPage {
    public Dygraph() {
        String csv = "Date,ms\n20070101,62\n20070102,62";
        add(new ResourceLink<File>("csv", new ByteArrayResource("text/csv", csv.getBytes())));

        add(new Label("graphdiv").add(new DygraphBehavior()));
    }
}

<div>
    <h1>Dygraph:</h1>
    <div wicket:id="graphdiv" id="graphdiv" style="width:500px; height:300px;"></div>
    <a wicket:id="csv" href="#">dl generated csv</a>
</div>

Ответы [ 2 ]

4 голосов
/ 05 апреля 2011
public class Dygraph extends WebPage {
    public Dygraph() {
        String csv = "Date,ms\n20070101,62\n20070102,62";
        ResourceLink<File> link = new ResourceLink<File>("csv", new ByteArrayResource("text/csv", csv.getBytes()));
        add( link );

        //this is the url that should be passed to the javascript code
        CharSequence url = link.urlFor( IResourceListener.INTERFACE ); 

        add(new Label("graphdiv").add(new DygraphBehavior()));
    }
}

Существуют и другие решения, основанные на объеме вашего ресурса, возможно, динамический общий ресурс будет работать лучше (если параметры вашего графика могут быть просто переданы в качестве параметров url), но это будет работать.

0 голосов
/ 05 апреля 2011

JavaScript должен каким-то образом видеть данные после отображения страницы. Итак, у вас есть два варианта:

  1. Вставьте данные на странице (скажем, в скрытом div), а затем разрешите JavaScript читать данные оттуда в виде текста.

  2. Создайте сервлет, из которого JavaScript сможет загружать данные.

Второй вариант означает, что ваш код рендеринга страницы должен каким-то образом передавать данные сервлету. Вы можете попытаться поместить это в сессию, но тогда, это будет сидеть там, занимая RAM. Вероятно, это не проблема, если это просто немного данных и у вас всего несколько пользователей. Но если это не так, вариант № 1, вероятно, лучше.

...